K8s+Helm部署场景下安全获取AWS访问权限的方案咨询
安全从AWS Secrets Manager拉取密钥到Kubernetes InitContainer的方案
方案1:使用IAM Roles for Service Accounts (IRSA)
这是AWS EKS原生的安全方案,完全不需要在Helm Chart中嵌入任何凭证:
- 先确认你的EKS集群已配置OIDC身份提供商(这是IRSA的前提)
- 将你已创建的、拥有Secrets Manager访问权限的IAM角色,关联到Kubernetes中的一个ServiceAccount(通过IAM角色的信任策略,允许该ServiceAccount的OIDC身份访问)
- 在Helm Chart的Deployment定义中,给InitContainer指定这个ServiceAccount:
initContainers: - name: secret-fetcher image: your-python-script-image serviceAccountName: secrets-access-sa # 其他配置:挂载卷存储生成的环境文件等 - 你的Python脚本无需修改AWS凭证相关代码,AWS SDK会自动从Pod的元数据服务获取临时IAM凭证,完成Secrets Manager的访问
方案2:使用AWS Secrets Manager CSI Driver
无需自定义Python脚本,直接通过CSI驱动将密钥挂载为文件或环境变量:
- 先在EKS集群中部署AWS Secrets Manager CSI Driver
- 创建
SecretProviderClass资源,配置要拉取的Secrets Manager密钥信息:apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: aws-secrets spec: provider: aws parameters: objects: | - objectName: "your-secret-name" objectType: "secretsmanager" jmesPath: - path: "DB_PASSWORD" objectAlias: "DB_PASSWORD" - 在Helm Chart中,给Pod配置CSI卷挂载,或直接通过环境变量引用:
containers: - name: your-app env: - name: DB_PASSWORD valueFrom: secretKeyRef: name: aws-secrets key: DB_PASSWORD volumes: - name: secrets-store-inline csi: driver: secrets-store.csi.k8s.io readOnly: true volumeAttributes: secretProviderClass: "aws-secrets" - 同样通过IRSA给CSI Driver的ServiceAccount授权访问Secrets Manager,Helm Chart中无需嵌入任何凭证
方案3:使用External Secrets Operator (ESO)
将Secrets Manager的密钥同步到Kubernetes Secret,再在应用中引用:
- 部署External Secrets Operator到集群,配置其使用IRSA权限访问Secrets Manager
- 创建
ExternalSecret资源,定义要同步的密钥:apiVersion: external-secrets.io/v1beta1 kind: ExternalSecret metadata: name: app-secrets spec: secretStoreRef: name: aws-secrets-manager kind: SecretStore target: name: app-secrets-k8s data: - secretKey: DB_PASSWORD remoteRef: key: your-secret-name property: DB_PASSWORD - 在Helm Chart中,直接从同步后的Kubernetes Secret挂载环境变量:
envFrom: - secretRef: name: app-secrets-k8s - 整个过程Helm Chart无需包含任何凭证,同步操作由ESO自动完成
内容的提问来源于stack exchange,提问作者Mansur Ul Hasan
相关产品推荐
相关产品推荐

