大数跨境
0
0

K8S实战教程: 如何使用 External Secrets Operator 管理 Kubernetes密钥

K8S实战教程: 如何使用 External Secrets Operator 管理 Kubernetes密钥 云原生SRE
2025-09-10
0

欢迎点击下方👇关注我,记得星标哟~

文末会有重磅福利赠送

 


在云原生应用的生命周期里,“如何安全、可审计、可扩展地管理敏感配置(API Key、数据库密码、令牌等)”始终是核心议题。传统方式(直接写进 Deployment、ConfigMap、.env 文件、Git 仓库)不仅存在泄露风险,也难以做到集中治理与轮换。

External Secrets Operator(简称 ESO)提供了一种“声明式桥接”——让 Kubernetes 自动从外部密钥管理服务(如 AWS Secrets Manager、HashiCorp Vault、Azure Key Vault 等)同步数据到集群内的 Kubernetes Secret,从而实现统一源、最小暴露面与自动更新。

本文从架构原理、核心 CRD、安装部署、实践步骤、进阶特性、安全治理与常见对比等维度系统梳理,给需要在生产环境落地的工程团队提供一些参考。


1. 为什么需要 External Secrets Operator

需求/痛点
传统 Kubernetes Secret
External Secrets Operator
版本控制风险
容易误入 Git / 明文 YAML
不在仓库中存敏感值
轮换复杂度
需人工更新+重启
外部变更 → 自动同步
中心化治理
分散在各环境
外部 Secret Manager 为单一真源
权限与审计
依赖集群权限
结合云厂商 IAM / 审计日志
多环境一致性
手动复制
同模板+不同后端 Key
密钥加密/合规
需手动启用 KMS
使用外部服务原生合规能力

2. ESO 工作原理与核心组件

ESO 通过自定义资源(CRD)与控制器循环(Reconcile Loop)实现同步:

  1. 1. 你定义一个 SecretStore / ClusterSecretStore:指向外部密钥系统(例如 AWS Secrets Manager)。
  2. 2. 创建 ExternalSecret:声明需要获取哪些外部密钥、映射策略、刷新间隔。
  3. 3. ESO 控制器:
    • • 使用存储在 Kubernetes Secret(含凭证)或云原生身份(如 IRSA)的访问方式去调用外部 API。
    • • 拉取密钥内容,生成或更新目标 Kubernetes Secret。
  4. 4. Pod 以普通方式(env / volume)消费该 Kubernetes Secret。
  5. 5. 外部值变化 → 下一次 refreshInterval 周期内自动同步。

核心 CRD(简述):

  • • SecretStore:命名空间级密钥存储引用。
  • • ClusterSecretStore:集群级复用(多命名空间共享)。
  • • ExternalSecret:声明“我要什么 + 取哪里 + 怎么映射”。
  • • 目标 Secret:被 ESO 按需生成/更新的标准 Kubernetes Secret。

3. 安装与前置准备

3.1 前置条件

  • • 已有 Kubernetes 集群(本地可用 minikube / kind,生产建议托管集群)
  • • 外部密钥管理服务(示例:AWS Secrets Manager)
  • • kubectl / helm
  • • (推荐)使用临时权限或最小策略的 IAM 身份

3.2 安装 External Secrets Operator


   
    
   helm repo add external-secrets https://charts.external-secrets.io
helm repo update

helm install external-secrets \
  external-secrets/external-secrets \
  -n external-secrets \
  --create-namespace \
  --set installCRDs=true

验证:


   
    
   kubectl get pods -n external-secrets
kubectl get crds | grep external-secrets.io

4. 基础实践:从 AWS Secrets Manager 同步到 Pod

4.1 在 AWS Secrets Manager 创建密钥

示例(JSON 结构):


   
    
   {
  "FIRST_NAME"
: "Deji",
  "LAST_NAME"
: "Ajayi",
  "MIDDLE_NAME"
: "O."
}

4.2 访问凭证策略设计

生产建议:

  • • 使用专属 IAM User / Role(最小权限)
  • • 授权只允许:secretsmanager:GetSecretValue / DescribeSecret
  • • 若在 EKS:首选 IRSA(无需静态 access key)

示例 IAM Policy(最小化):
(仅供参考,需替换资源 ARN)


   
    
   {
  "Version"
: "2012-10-17",
  "Statement"
: [
    {
      "Action"
: [
        "secretsmanager:GetSecretValue"
,
        "secretsmanager:DescribeSecret"

      ],
      "Effect"
: "Allow",
      "Resource"
: "arn:aws:secretsmanager:us-east-1:111122223333:secret:first_and_last_key-*"
    }
  ]
}

4.3 (示例方式)创建 Kubernetes 内保存访问凭证的 Secret

(如使用静态 AK/SK;若用 IRSA 可跳过)


   
    
   kubectl create secret generic aws-credentials \
  --from-literal=access_key=AKIAxxxxxxxx \
  --from-literal=secret_access_key=xxxxxxxxxxxxxxxx

4.4 定义 SecretStore


   
    
   apiVersion: external-secrets.io/v1
kind:
 SecretStore
metadata:

  name:
 demo-secret-store
spec:

  provider:

    aws:

      service:
 SecretsManager
      region:
 us-east-1
      auth:

        secretRef:
                # 使用上一步静态 Secret;如用 IRSA 则改用 jwt 方式
          accessKeyIDSecretRef:

            name:
 aws-credentials
            key:
 access_key
          secretAccessKeySecretRef:

            name:
 aws-credentials
            key:
 secret_access_key

应用:


   
    
   kubectl apply -f secretstore.yaml
kubectl get secretstore

4.5 定义 ExternalSecret


   
    
   apiVersion: external-secrets.io/v1
kind:
 ExternalSecret
metadata:

  name:
 names-external-secret
spec:

  refreshInterval:
 1m                # 轮询周期(可适度放大以减轻后端压力)
  secretStoreRef:

    name:
 demo-secret-store
    kind:
 SecretStore
  target:

    name:
 names-final-secret          # 最终生成的 Kubernetes Secret 名
    creationPolicy:
 Owner             # 删除 ExternalSecret 时是否同步删除目标
  dataFrom:

    -
 extract:
        key:
 first_and_last_key       # 外部密钥名

应用并验证:


   
    
   kubectl apply -f externalsecret.yaml
kubectl get externalsecret
kubectl get secret names-final-secret -o yaml

base64 解码(Linux/macOS):


   
    
   kubectl get secret names-final-secret -o jsonpath='{.data.FIRST_NAME}' | base64 -d

4.6 在 Deployment 中消费


   
    
   apiVersion: apps/v1
kind:
 Deployment
metadata:

  name:
 demo-deployment
spec:

  replicas:
 2
  selector:

    matchLabels:

      app:
 secret-demo
  template:

    metadata:

      labels:

        app:
 secret-demo
    spec:

      containers:

        -
 name: app
          image:
 your-image:latest
          env:

            -
 name: FIRST_NAME
              valueFrom:

                secretKeyRef:

                  name:
 names-final-secret
                  key:
 FIRST_NAME
            -
 name: LAST_NAME
              valueFrom:

                secretKeyRef:

                  name:
 names-final-secret
                  key:
 LAST_NAME
            -
 name: MIDDLE_NAME
              valueFrom:

                secretKeyRef:

                  name:
 names-final-secret
                  key:
 MIDDLE_NAME

部署与确认:


   
    
   kubectl apply -f deployment.yaml
kubectl exec -it deploy/demo-deployment -- env | grep FIRST_NAME

5. 进阶用法与增强模式

5.1 使用 ClusterSecretStore

适合多个命名空间共享同一外部凭证(减少重复、集中治理)。


   
    
   apiVersion: external-secrets.io/v1
kind:
 ClusterSecretStore
metadata:

  name:
 global-aws-store
spec:

  provider:

    aws:

      service:
 SecretsManager
      region:
 us-east-1
      auth:

        jwt:
                               # 例:IRSA 模式(EKS)
          serviceAccountRef:

            name:
 eso-irsa
            namespace:
 external-secrets

5.2 精细字段映射

只取外部 JSON 的部分字段并重命名:


   
    
   apiVersion: external-secrets.io/v1
kind:
 ExternalSecret
metadata:

  name:
 partial-external-secret
spec:

  secretStoreRef:

    name:
 demo-secret-store
  target:

    name:
 db-secret
  data:

    -
 secretKey: db.user
      remoteRef:

        key:
 app_db_creds
        property:
 username
    -
 secretKey: db.password
      remoteRef:

        key:
 app_db_creds
        property:
 password

5.3 模板渲染(Template)


   
    
   target:
  name:
 rendered-secret
  template:

    type:
 Opaque
    data:

      FULL_NAME:
 "{{ .FIRST_NAME }} {{ .MIDDLE_NAME }} {{ .LAST_NAME }}"

5.4 字段转换与策略

  • • creationPolicy: Merge / Owner / Orphan
  • • refreshInterval 过短 → 可能导致后端 API 速率限制
  • • immutable: 可结合外部轮换流程设计重建策略

5.5 结合 GitOps

  • • Git 中仅保存 ExternalSecret / SecretStore 声明(无明文值)
  • • 外部密钥平台负责生命周期
  • • Argo CD / Flux + ESO:实现“配置即代码 + 动态密钥”

6. 监控与可观测性

指标
说明
Reconcile 成功/失败次数
识别后端权限 / 网络问题
同步延迟
外部变更到内部生效耗时
错误类型
鉴权/速率限制/字段缺失
Secret 版本漂移
确认集群内与外部最新版本一致

方法:

  • • 通过 Prometheus 抓取 ESO 暴露的 Metrics(若 Chart 已自带 ServiceMonitor)
  • • 结合告警:失败次数连续 N 次 → 触发告警
  • • 事件监视:kubectl describe externalsecret

7. 与其他方案对比

方案
特点
适用场景
Kubernetes Secret(原生)
简单;需自行加密管理
小规模 / 非敏感环境
Sealed Secrets
GitOps 友好;静态加密
发布前加密、变化不频繁
Mozilla SOPS
支持多种 KMS;开发灵活
复杂 KMS 组合需求
CSI Secret Store Driver
以 Volume 动态挂载
文件型/短时读取、不入 env
External Secrets Operator
云密钥源同步、自动轮换
中大型生产、集中治理

可组合:
ESO 负责“拉取 + 生成 Secret”;
再由应用以 env 或文件消费。若需要文件形式 + 不希望进入 etcd,可结合 CSI Secret Store。

8. 实践落地建议路线

  1. 1. PoC 阶段:单命名空间 + SecretStore + 静态 AK/SK
  2. 2. 生产化:迁移到 ClusterSecretStore + 云原生身份(IRSA)
  3. 3. GitOps:纳入 Argo CD,禁止直接 kubectl 手工改
  4. 4. Observability:打通 Metrics / Alert / 日志追踪
  5. 5. 安全收口:策略、轮换、审计、密钥分类分级
  6. 6. 自动化:轮换事件 → 应用热更新(信号/sidecar)

9. 总结

External Secrets Operator 通过“声明式 + 自动同步”模式,将密钥管理权回归外部专业服务,把 Kubernetes 内部变为一个安全消费层。它帮助团队实现:

  • • 真正的“不在集群内/代码库内硬编码密钥”
  • • 密钥集中治理、审计与轮换自动化
  • • 与 GitOps / DevSecOps 流程自然集成
  • • 降低运维与人为操作风险

在生产场景中,建议配套:

  • • 云端权限最小化 + 动态身份(IRSA/Workload Identity)
  • • 刷新策略与资源配额控制
  • • 统一监控告警闭环
  • • 安全基线与周期性审查

如你有更多实践问题(如 Vault 集成、IRSA 细化策略、审计落地方案),欢迎留言讨论

 


入知识星球,共同探索云原生学习之旅!

图片

更多云架构、K8S学习资料以及CKA、Azure考试认证资料,星球内可免费领取哦!

图片
云原生、K8S等相关实战教程系列持续更新中。。
图片
往期回顾

K8S工具推荐,Kargo:下一代 GitOps 持续交付工具

K8S工具推荐:Bufstream-唯一通过 Jepsen 验证的云原生 Kafka 实现

K8S工具推荐: 使用 Kubemark 进行 Kubernetes 大规模集群模拟实践

K8S工具推荐:使用Argo Rollouts实现GitOps自动化测试与回滚

K8S工具推荐:资源编排新利器:三大云厂商联合推出 KRO

K8S工具推荐:告别复杂认证!Kubernetes登录神器kubelogin指南

K8S工具推荐:Kubernetes资源优化神器KRR:一键诊断集群资源浪费

Kubernetes工具推荐:使用 k8s-pod-restart-info-collector简化故障排查

K8S工具推荐:动态无缝的Kubernetes多集群解决方案-Liqo

K8S学习路线2025

𝙺̲𝚞̲𝚋̲𝚎̲𝚛̲𝚗̲𝚎̲𝚝̲𝚎̲𝚜̲ 管理的最佳实践(2025)

如何落地一个企业级PaaS容器云平台:从规划到实施全流程指南


【声明】内容源于网络
0
0
云原生SRE
懂点K8S的SRE,关注云原生、DevOps、AI&ChatGPT等技术热点
内容 313
粉丝 0
云原生SRE 懂点K8S的SRE,关注云原生、DevOps、AI&ChatGPT等技术热点
总阅读48
粉丝0
内容313