Failure modes

Each failure the design considers, how it shows up, whether it blocks API server startup, and whether it can lose data.

Updated 11 November 2026 · 6 min read

On this page

Each row names a failure, its cause, its impact, and how you detect it. Two columns flag severity: whether the failure stops the API server from decrypting existing data at startup, and whether it can leave resources permanently unrecoverable. For recovery steps, see Operate: Troubleshooting and Operate: Disaster recovery .

Bootstrap and runtime

Failure modeCauseImpactDetectionBlocks startupData loss
Provider unavailableService not installed, crash, disabledAPI server cannot reach KMSsystemd or kubelet status, socket missing, KMS unhealthyYesNo
Socket unavailableDirectory missing, listener failedAPI server cannot call KMSAPI server logs, /live failureYesNo
Kubelet or container runtime unavailable for static podHost boot failureProvider static pod cannot startkubelet or CRI logsYesNo
Provider bootstrap incompleteAPI server starts before the KMS path is ready despite process-start orderingAPI server fails or retriesBoot logs and /readyYesNo
Stale socketCrash left socket pathStartup failure or wrong listenerSocket checkYesNo
Wrong socket permissionsAPI server cannot connectKMS unavailableAPI server permission errorsYesNo
SELinux or AppArmor blockHost policy denies socket or fileKMS unavailableAudit logsYesNo
Configuration file permissions unsafeWorld-readable or world-writableSecret or topology exposure or tamperStartup validationYesNo
Provider crash loopBug, bad configuration, OpenBao error pathKMS unavailableService logsYesNo
Image unavailable for static podPull failure, air gapProvider not startedkubelet events or logsYesNo
Package upgrade restarts systemd providerMaintenance eventTransient KMS outageService logsPossibleNo

OpenBao and Transit

Failure modeCauseImpactDetectionBlocks startupData loss
OpenBao unavailableNetwork, DNS, load balancer, outageEncrypt and decrypt failReadiness, metrics, OpenBao request errorsYes for encrypted dataNo
OpenBao sealedManual seal, restart not unsealedTransit unavailableOpenBao health, provider readinessYesNo, unless key unavailable permanently
OpenBao inside same protected clusterCircular dependencyKMS unavailable before API serverBootstrap failureYesPossible if unrecoverable
Audit backend pressureOpenBao audit device slow or failingTransit latency or errorsOpenBao metrics, provider latencyPossibleNo
OpenBao leader failoverHA eventTransient errors or latencyOpenBao status, provider retriesPossibleNo
TLS certificate expiredCertificate not renewedProvider cannot connectTLS errorsYesNo
DNS or LB misroutingWrong backend or stale DNSAuth or Transit errorsTLS or SNI errors, metadata mismatchYesNo

Transit key material

Failure modeCauseImpactDetectionBlocks startupData loss
Transit key deletedDestructive admin actionOld ciphertext undecryptableMetadata read fails, decrypt failuresYesYes if no valid backup
Transit key soft-deletedKey archived or disabledEncrypt and decrypt failMetadata state, decrypt errorsYesNo if restored
Transit key recreated same nameKey lineage lostOld data undecryptable; key_id collision riskLineage mismatch, decrypt failuresYesYes if original key lost
disable_upsert false or unreadableMount drift or missing read permissionStatus and Encrypt fail closedMetadata probe error, unhealthy StatusYesNo
min_decryption_version raised too earlyOperator errorOld ciphertext undecryptableDecrypt failures for old key_id valuesYesPossible
Key backup missingDisaster restore lacks Transit key versionsData undecryptableDR test failureYesYes

Authentication and issuer state

Failure modeCauseImpactDetectionBlocks startupData loss
JWT expired and API server downProtected cluster issued JWT and cannot renewOpenBao login failsAuth metrics, JWT expiry checkYesNo
JWT file missingProvisioning errorLogin impossibleStartup validationYesNo
JWT wrong audienceIssuer or configuration mismatchLogin deniedAuth errorYesNo
JWT wrong subject or claimsRole mismatchLogin deniedAuth errorYesNo
Issuer changedOIDC or JWT issuer rotationLogin deniedAuth logsYesNo
JWKS rotatedNew signing key unknownLogin deniedJWT auth errorsYesNo
OpenBao cannot reach JWKS or OIDC discoveryNetwork failureLogin denied or cache expiryAuth errorsPossibleNo
Clock skewHost, OpenBao, or issuer clocks differJWT invalidAuth errors, NTP alertsYesNo
Revoked JWT still cryptographically validJWT auth lacks TokenReviewToken may be accepted until expiryHard to detectNo immediateNo
Certificate expiredCertificate or SVID not renewedOpenBao cert login failsAuth metrics, certificate TTL metricYesNo
Certificate identity driftWrong certificate, SPIFFE ID, or trust domainLocal validation or OpenBao role rejects loginAuth errorYesNo
PKCS#11 module or token unavailableModule path, token label, key label, PIN, or hardware failureLogin impossibleStartup validation, auth errorYesNo
SPIFFE Workload API unavailableSPIFFE agent or socket unavailableLogin impossibleAuth error, certificate TTL metric approaches zeroYesNo

KMS contract, registry, and decrypt

Failure modeCauseImpactDetectionBlocks startupData loss
Status key_id differs from encrypt responseRace or bugAPI server discards encrypt result, marks unhealthyAPI server logs, provider metricsPossibleNo
key_id flip-flopsUnstable rotation observationStale marking oscillatesMetrics or logs hash changesPossibleNo
Unknown key_id on decryptConfiguration or provider changed, old dataDecrypt rejectedDecrypt key_id errorsYes for affected dataPossible
Registry state missingState file removed or first startup after restoreProvider may need to rebuild snapshots before servingdoctor, verify-key, rotation-plan, startup logs with auto-bootstrap eligibility reasonPossibleNo
Registry state corrupt or rolled backDisk corruption, unsafe restore, replayed fileStartup or probe fails closedState load errors, hash mismatch, rollback errorYesNo
Registry state and checkpoint both replacedPrivileged host compromise or unsafe full-directory restoreLocal replay guard can be bypassed by a self-consistent pairNode comparison, backup metadata, host integrity monitoringPossiblePossible
Missing or malformed annotationsBug, corruption, or mismatched providerDecrypt rejected when AAD requiredAAD validation metricsYes for affected dataNo if recoverable backup exists
AAD mismatchWrong cluster, key, or provider metadataDecrypt rejectedAAD errorYes for affected dataPossible
API server decrypt stormStartup with many encrypted objectsLatency, timeouts, or ResourceExhausted above the Decrypt limitDuration and in-flight metrics, request status, API server logsYes if severeNo
OpenBao response exceeds its body limitBackend fault, proxy fault, or unexpected response growthRequest fails as unavailable; metadata or deep-probe responses also make Status unhealthyOpenBao request error metrics and provider logsPossibleNo
Provider name changedEncryptionConfiguration driftOld encrypted data may not match providerAPI server errorsYes for affected dataPossible

Kubernetes encryption scope and migration

Failure modeCauseImpactDetectionBlocks startupData loss
identity fallback left enabled permanentlyMigration incompletePlaintext writes possible if provider order changes or KMS is unavailable with identity firstConfiguration auditNoConfidentiality loss
identity fallback removed too earlyOld plaintext or misordered dataReads may fail depending on provider setAPI errorsPossibleNo
Only some resources encryptedConfiguration scope incompleteUnprotected resources in etcdEncryption configuration reviewNoConfidentiality loss
Existing resources not rewrittenEncryption only applies on writeOld data remains under old provider or plaintextAudit and migration checksNoConfidentiality loss
Mixed plaintext and encrypted backupsBackups taken across migrationInconsistent confidentialityBackup auditNoConfidentiality loss

Search the handbook

Try “doctor”, “rotation”, or “key_id”.