Five-Year-Old Keys, and a Cluster That Can Now Issue Its Own
Rotation is the control everyone agrees with and nobody schedules, which is why the fix that survives contact with production is deleting the artifact rather than renewing it.
Why key age is the load-bearing number
Liveness tells you the control failed. Age tells you why. Key age is the cheapest proxy for nobody owns this credential. A key on a rotation schedule has a human or a pipeline attached to it. A key untouched for five years lives in a config file someone copied. The same class of key turns up in a Jenkins job nobody reads, and in a Dockerfile from a repository that went public by accident. Rotation assumes an owner exists. That assumption is what makes this population unrotatable.
Hygiene is the wrong intervention here. Removing the artifact is the right one, and the honest version of that trade looks like this:
| Approach | Credential lifetime | Rotation burden | Blast radius if leaked | New failure mode |
|---|---|---|---|---|
| IAM user access keys | Unbounded | Manual, unscheduled, unowned | Permanent until someone notices | None — that is the problem |
| CI via OIDC role assumption | Minutes (STS session) | Zero | Expired before exfiltration is useful | Trust-policy misconfiguration; over-broad sub claim matching |
| IAM Roles Anywhere | Hours (session certificate) | Certificate lifecycle only | Time-bounded | The CA and trust anchor become tier-0 |
| Pod certificates (Kubernetes v1.37) | Short-lived, cluster-issued | Handled by the control plane | Pod-scoped and expiring | Issuance and trust-bundle distribution become tier-0 |
Read the right-hand column. Every option trades a permanent secret for a tier-0 issuance path. That is the correct trade: you can page someone for an issuance outage, and nobody can be paged for a five-year-old admin key in a public commit. The consequence is that the issuer inherits etcd-grade availability expectations. Set that availability target during migration planning.
What v1.37 actually hands you
The issuer now runs inside the cluster. That absorbs a meaningful slice of what teams currently assemble from SPIFFE/SPIRE, cert-manager, and Vault sidecars. Day-one parity with a mature SPIRE deployment is not the claim. If a third-party identity contract is up for renewal or expansion, the native path earns a two-week prototype ahead of the purchase order.
Two quieter items change operational work. The Metrics API is stable after years of HPA, VPA, and dashboards depending on it with no stability contract behind them. Delete the version-tolerant shims and stop pinning metrics-server to whatever combination last worked. Resilient watchcache initialization targets apiserver startup and restart, where clusters with large object counts see LIST traffic and 5xx rates spike while caches warm. Read that KEP before planning a rolling control-plane upgrade.
The transferable engineering result
The Kubernetes API review group processed a record 118 PRs this cycle without adding reviewers. Declarative validation changed the unit of review: reviewers read tags on type definitions instead of hand-auditing bespoke imperative validation code, with linting and a pre-review stage as guardrails. Governance-by-tooling beat governance-by-headcount, and that result transfers to any org where schema or API review is the bottleneck. The residual risk is real. Anything the tag vocabulary cannot express falls back to hand-written code, and if tooling gains plateau while contribution volume climbs, the bottleneck returns.
A key that rotates on a schedule has an owner. A key untouched for five years is in a file someone copied.
What to do
Pull the IAM credential report for every account, and treat any key whose last_rotated is older than 90 days as an open incident: disable it, confirm nothing breaks via CloudTrail LastUsed, then delete.
Push budget alarms, Cost Anomaly Detection, and GuardDuty into 100% of accounts through the org-level Terraform baseline before the next billing cycle, with no sandbox exemptions.
Prototype pod certificates plus cluster trust bundles on one non-prod service pair this sprint, before renewing or expanding any third-party workload-identity stack.