Kubernetes External Secrets实战:AWS Secrets Manager完整配置指南

张开发
2026/4/9 22:42:25 15 分钟阅读

分享文章

Kubernetes External Secrets实战:AWS Secrets Manager完整配置指南
Kubernetes External Secrets实战AWS Secrets Manager完整配置指南【免费下载链接】kubernetes-external-secretsIntegrate external secret management systems with Kubernetes项目地址: https://gitcode.com/gh_mirrors/ku/kubernetes-external-secretsKubernetes External Secrets是一个强大的开源工具能够将外部密钥管理系统如AWS Secrets Manager与Kubernetes集群无缝集成。本文将详细介绍如何使用Kubernetes External Secrets与AWS Secrets Manager提供完整的配置示例和最佳实践帮助您安全地管理Kubernetes中的敏感信息。为什么需要Kubernetes External Secrets在Kubernetes中原生Secrets虽然方便但存在一些安全限制它们默认以Base64编码形式存储在etcd中缺乏加密保护并且不提供版本控制、访问审计等高级功能。AWS Secrets Manager作为企业级密钥管理服务提供了完整的密钥生命周期管理、自动轮换和细粒度访问控制。Kubernetes External Secrets通过自定义资源定义CRD和控制器充当了Kubernetes与外部密钥管理系统之间的桥梁让您能够集中管理所有密钥统一存储在AWS Secrets Manager中自动同步密钥变更自动同步到Kubernetes集群访问控制基于IAM策略的细粒度权限管理版本控制支持密钥版本追踪和回滚系统架构解析 ️从架构图中可以看到Kubernetes External Secrets的工作原理非常清晰用户定义ExternalSecret资源在Kubernetes中创建ExternalSecret CRD控制器监听变化External Secrets控制器通过kube-apiserver监听ExternalSecret对象获取外部密钥控制器调用AWS Secrets Manager API获取密钥数据创建Kubernetes Secret控制器将获取的数据转换为原生Kubernetes Secret应用使用密钥Pod通过常规方式访问生成的Secret这种架构确保了外部密钥管理系统与Kubernetes集群的安全隔离同时保持了应用的透明性。安装Kubernetes External Secrets 使用Helm安装推荐首先添加Helm仓库并安装控制器helm repo add external-secrets https://external-secrets.github.io/kubernetes-external-secrets/ helm install external-secrets external-secrets/kubernetes-external-secrets配置AWS访问权限Kubernetes External Secrets需要访问AWS Secrets Manager的权限有以下几种配置方式方式1IAM角色服务账户EKS最佳实践# values.yaml配置示例 serviceAccount: annotations: eks.amazonaws.com/role-arn: arn:aws:iam::123456789012:role/external-secrets-role方式2通过环境变量传递凭证# values.yaml配置 env: AWS_ACCESS_KEY_ID: AKIAIOSFODNN7EXAMPLE AWS_SECRET_ACCESS_KEY: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY AWS_REGION: us-west-2方式3通过Secret传递凭证# values.yaml配置 envVarsFromSecret: AWS_ACCESS_KEY_ID: secretKeyRef: aws-credentials key: access-key-id AWS_SECRET_ACCESS_KEY: secretKeyRef: aws-credentials key: secret-access-keyAWS IAM策略配置 为Kubernetes External Secrets控制器创建适当的IAM策略{ Version: 2012-10-17, Statement: [ { Effect: Allow, Action: [ secretsmanager:GetResourcePolicy, secretsmanager:GetSecretValue, secretsmanager:DescribeSecret, secretsmanager:ListSecretVersionIds ], Resource: [ arn:aws:secretsmanager:us-west-2:123456789012:secret:production/*, arn:aws:secretsmanager:us-west-2:123456789012:secret:staging/* ] }, { Effect: Allow, Action: sts:AssumeRole, Resource: arn:aws:iam::123456789012:role/external-secrets-* } ] }创建AWS Secrets Manager密钥 在AWS控制台或使用CLI创建密钥# 创建简单的字符串密钥 aws secretsmanager create-secret \ --name production/database/password \ --secret-string SuperSecurePassword123! # 创建JSON格式的密钥 aws secretsmanager create-secret \ --name production/database/credentials \ --secret-string {username:admin,password:Pssw0rd,host:db.example.com}ExternalSecret资源配置示例 基础配置示例让我们从最简单的配置开始从AWS Secrets Manager获取单个密钥apiVersion: kubernetes-client.io/v1 kind: ExternalSecret metadata: name: database-secret namespace: production spec: backendType: secretsManager # 可选指定区域 region: us-west-2 # 可选指定要承担的IAM角色 roleArn: arn:aws:iam::123456789012:role/database-access-role data: - key: production/database/password name: db-password高级配置JSON密钥的多属性提取当您在AWS Secrets Manager中存储JSON格式的密钥时可以提取多个属性apiVersion: kubernetes-client.io/v1 kind: ExternalSecret metadata: name: full-database-credentials spec: backendType: secretsManager region: us-east-1 data: - key: production/database/credentials name: db-username property: username - key: production/database/credentials name: db-password property: password - key: production/database/credentials name: db-host property: host版本控制配置示例AWS Secrets Manager支持版本控制您可以指定特定版本或版本阶段apiVersion: kubernetes-client.io/v1 kind: ExternalSecret metadata: name: versioned-secret spec: backendType: secretsManager data: - key: app/api-key name: current-api-key versionStage: AWSCURRENT - key: app/api-key name: previous-api-key versionStage: AWSPREVIOUS - key: app/api-key name: specific-version-api-key versionId: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx批量获取密钥配置使用dataFrom一次性获取密钥的所有属性apiVersion: kubernetes-client.io/v1 kind: ExternalSecret metadata: name: bulk-secrets spec: backendType: secretsManager dataFrom: - production/database/credentials - production/redis/connection - production/api/keys混合配置示例结合data、dataFrom和dataFromWithOptions的完整示例apiVersion: kubernetes-client.io/v1 kind: ExternalSecret metadata: name: comprehensive-example spec: backendType: secretsManager roleArn: arn:aws:iam::123456789012:role/app-secrets-role region: eu-central-1 # 批量获取当前版本的所有属性 dataFrom: - shared/common-config # 批量获取特定版本的所有属性 dataFromWithOptions: - key: app/feature-flags versionStage: AWSPREVIOUS # 精确获取特定属性 data: - key: production/database/master-credentials name: db-admin-password property: adminPassword versionId: 12345678-1234-1234-1234-123456789012高级功能配置 ⚙️密钥模板功能Kubernetes External Secrets支持使用Lodash模板引擎动态生成Secret内容apiVersion: kubernetes-client.io/v1 kind: ExternalSecret metadata: name: templated-secret spec: backendType: secretsManager data: - key: app/config name: config-data template: metadata: labels: environment: production app: my-application annotations: last-updated: % new Date().toISOString() % type: Opaque stringData: connection-string: postgresql://% JSON.parse(data[config-data]).username %:% JSON.parse(data[config-data]).password %% JSON.parse(data[config-data]).host %:5432/mydb二进制密钥处理对于证书、密钥文件等二进制数据需要指定isBinary: trueapiVersion: kubernetes-client.io/v1 kind: ExternalSecret metadata: name: tls-certificate spec: backendType: secretsManager data: - key: production/tls/certificate name: tls.crt isBinary: true - key: production/tls/private-key name: tls.key isBinary: true template: type: kubernetes.io/tls命名空间级别的访问控制通过命名空间注解限制ExternalSecret可以访问的密钥路径apiVersion: v1 kind: Namespace metadata: name: production annotations: externalsecrets.kubernetes-client.io/permitted-key-name: production/.*部署和验证 应用ExternalSecret配置# 应用配置 kubectl apply -f database-secret.yaml # 查看ExternalSecret状态 kubectl get externalsecrets # 查看生成的Secret kubectl get secret database-secret -o yaml # 解码Secret内容查看 kubectl get secret database-secret -o jsonpath{.data.db-password} | base64 -d在Pod中使用生成的SecretapiVersion: apps/v1 kind: Deployment metadata: name: my-app spec: replicas: 3 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: containers: - name: app image: my-app:latest env: - name: DB_PASSWORD valueFrom: secretKeyRef: name: database-secret key: db-password volumeMounts: - name: config-volume mountPath: /etc/config volumes: - name: config-volume secret: secretName: database-secret监控和日志 Kubernetes External Secrets提供了Prometheus指标和详细的日志监控指标# 查看控制器指标 kubectl port-forward deployment/external-secrets 3001:3001 curl http://localhost:3001/metrics主要监控指标包括kubernetes_external_secrets_sync_calls_count同步操作计数器kubernetes_external_secrets_last_sync_call_state最后一次同步状态日志配置在Helm values.yaml中调整日志级别env: LOG_LEVEL: debug # 可选: error, warn, info, debug POLLER_INTERVAL_MILLISECONDS: 30000 # 轮询间隔毫秒故障排除和最佳实践 ️常见问题解决权限问题确保IAM角色具有正确的Secrets Manager权限网络连接检查VPC端点配置和网络策略版本兼容性确认CRD版本与控制器版本匹配安全最佳实践最小权限原则为每个命名空间创建专用IAM角色密钥轮换利用AWS Secrets Manager的自动轮换功能审计日志启用AWS CloudTrail记录所有密钥访问加密传输确保所有通信使用TLS加密性能优化建议合理设置轮询间隔避免过频繁的API调用使用批量获取减少API调用次数缓存策略考虑实现本地缓存机制监控API限额避免达到AWS API速率限制迁移策略 如果您正在从传统方式管理Kubernetes Secret迁移到External Secrets并行运行阶段同时维护两种方式逐步迁移创建迁移脚本自动将现有Secret转换为ExternalSecret配置验证阶段在生产环境前充分测试回滚计划准备快速回滚到原有方案总结 Kubernetes External Secrets与AWS Secrets Manager的结合为Kubernetes环境提供了企业级的密钥管理解决方案。通过本文的完整配置指南您可以✅ 安全地将AWS Secrets Manager集成到Kubernetes集群 ✅ 实现密钥的集中管理和自动同步 ✅ 利用AWS的高级功能如版本控制和自动轮换 ✅ 遵循安全最佳实践和最小权限原则记住安全是持续的过程。定期审计您的配置、监控访问日志并保持所有组件更新到最新版本以确保您的密钥管理方案既安全又高效。现在就开始使用Kubernetes External Secrets让您的Kubernetes密钥管理达到新的安全水平【免费下载链接】kubernetes-external-secretsIntegrate external secret management systems with Kubernetes项目地址: https://gitcode.com/gh_mirrors/ku/kubernetes-external-secrets创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

更多文章