Infrastructure & Reliability iconInfrastructure & Reliability hover icon

Infrastructure & Reliability

Zero-Downtime Secret Rotation in GKE: Eliminating Credential Leaks with GCP Secret Manager

Google Kubernetes EngineGoogle Kubernetes Engine
Google CloudGoogle Cloud
TerraformTerraform

Key Takeaway

Runtime secret injection via external-secrets operator combined with IAM conditions and versioned rotation eliminates credential leaks while enabling zero-downtime updates and compliance-ready audit trails.

The Credential Leak Problem in Container Workloads

Hardcoded credentials in source code repositories account for over 90% of secret leaks in production systems. While environment variables avoid baking secrets into container images, they still expose credentials in deployment manifests, Helm charts, and CI/CD pipelines. GCP Secret Manager addresses this by providing encrypted storage with automatic versioning and audit logging, ensuring secrets are never stored in version control or deployment files. The integration with GKE (Google Kubernetes Engine) through the external-secrets operator allows pods to fetch credentials at runtime from a centralized secret store, eliminating the need to manage secrets across multiple deployment configurations.

Runtime Secret Injection Pattern

Architecture: External-Secrets Operator with GCP Secret Manager

apiVersion: external-secrets.io/v1beta1
kind: SecretStore
metadata:
  name: gcp-secret-store
spec:
  provider:
    gcpsm:
      projectID: "production-project"
      auth:
        workloadIdentity:
          clusterLocation: us-central1
          clusterName: prod-gke
          serviceAccountRef:
            name: external-secrets-sa
---
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
  name: db-credentials
spec:
  refreshInterval: 1h
  secretStoreRef:
    name: gcp-secret-store
  target:
    name: postgres-secret
  data:
    - secretKey: password
      remoteRef:
        key: prod-postgres-password
        version: latest
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: api-server
spec:
  template:
    spec:
      containers:
      - name: app
        image: api-server:latest
        env:
        - name: DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: postgres-secret
              key: password

The external-secrets operator runs as a controller in your GKE cluster, continuously syncing secrets from GCP Secret Manager into Kubernetes secrets. Pods reference these synced secrets through standard Kubernetes mechanisms, while the operator handles credential refresh based on the configured interval. This architecture separates secret management from application deployment, allowing credential updates without pod restarts.

IAM Conditions for Granular Access Control

Beyond basic role-based access, IAM conditions enable context-aware secret access policies. Time-based conditions restrict secret retrieval to business hours, IP-based rules limit access to specific VPC networks or office locations, and device-based policies enforce corporate device requirements. For example, a condition like request.time.getHours() >= 9 && request.time.getHours() <= 17 && origin.ip in ['10.0.0.0/8'] restricts database password access to working hours from internal networks only. These conditions layer additional security on top of service account permissions, reducing the blast radius of compromised credentials.

Applied Insight: Zero-Downtime Rotation Strategy

Implementing 90-day password rotation without downtime requires versioned secrets and graceful transitions. The pattern: create new secret version, update application configuration to accept both old and new credentials for a transition window (typically 5 minutes), verify new credential works, then revoke old version. Secret Manager's versioning allows applications to reference latest while maintaining historical versions for rollback. Audit logs provide complete chain of custody—who accessed which secret version, when, and from where—satisfying SOC2 and PCI-DSS compliance requirements without custom logging infrastructure.

© 2025 BeautifulCode. All rights reserved.