
mumoshu/aws-secret-operatoraws-secret-operator是一个Kubernetes operator,用于根据AWS Secrets Manager中存储的密钥自动创建和更新Kubernetes secrets。通过自定义资源(CR)将AWS密钥映射到Kubernetes secrets,Kubernetes secrets在此过程中作为AWS密钥的缓存,始终保持最新状态。
采用“静态解密”机制,无需通过手动、helm、kustomize或其他需要在CI或本地解密原始密钥的方式创建Kubernetes secrets,降低密钥泄露风险。
依赖AWS Secrets Manager而非SSM Parameter Store,减少因SSM API速率限制导致的限流问题。Kubernetes secrets作为Secrets Manager密钥的缓存,最大限度减少对Secrets Manager的API调用次数。
适用于需要在Kubernetes环境中安全管理密钥的场景,特别是:
获取现有密钥(若已存在):
consoleaws secretsmanager get-secret-value --secret-id prod/mysecret
创建新密钥:
consoleaws secretsmanager create-secret --name prod/mysecret
输出示例:
json{ "ARN": "arn:aws:secretsmanager:REGION:ACCOUNT:secret:prod/mysecret-Ld0PUs", "Name": "prod/mysecret" }
设置密钥值:
consoleaws secretsmanager put-secret-value --secret-id prod/mysecret --secret-string '{"foo":"bar"}'
获取密钥ID和版本ID(用于后续配置):
consoleaws secretsmanager describe-secret --secret-id prod/mysecret
输出示例(关注VersionIdsToStages中的版本ID):
json{ "ARN": "arn:aws:secretsmanager:REGION:ACCOUNT:secret:prod/mysecret-Ld0PUs", "Name": "prod/mysecret", "LastChangedDate": ***.306, "LastAccessedDate": ***.0, "VersionIdsToStages": { "c43e66cb-d0fe-44c5-9b7e-d450441a04be": ["AWSCURRENT"] } }
注意:aws-secret-operator不允许省略
VersionId或指定VersionStage,因为这会导致难以响应AWS密钥变化触发Pod更新。可使用update-aws-secret-ids脚本自动更新配置文件中的VersionId。
创建your_example_awssecret.yaml文件,指定AWS密钥的引用:
yamlapiVersion: mumoshu.github.io/v1alpha1 kind: AWSSecret metadata: name: example spec: stringDataFrom: secretsManagerSecretRef: secretId: prod/mysecret versionId: c43e66cb-d0fe-44c5-9b7e-d450441a04be
应用该配置:
consolekubectl create -f your_example_awssecret.yaml
operator将自动创建名为example的Kubernetes Secret,内容如下:
键值对格式(当AWS密钥内容为JSON键值映射时):
json{ "apiVersion": "v1", "data": { "foo": "YmFyCg==" }, "kind": "Secret", "metadata": { "name": "example", "namespace": "default", "creationTimestamp": "2018-05-04T20:55:43Z" }, "type": "Opaque" }
纯文本格式(当AWS密钥为原始字符串时):
json{ "apiVersion": "v1", "data": { "data": "Zm9vXG5iYXIK" }, "kind": "Secret", "metadata": { "name": "example", "namespace": "default", "creationTimestamp": "2020-06-29T10:35:32Z" }, "type": "Opaque" }
可通过卷挂载或环境变量方式在Pod中使用该Secret:
yamlapiVersion: v1 kind: Pod metadata: name: example-pod spec: containers: - name: example-container image: nginx env: - name: FOO valueFrom: secretKeyRef: name: example key: foo volumeMounts: - name: secret-volume mountPath: /etc/secrets volumes: - name: secret-volume secret: secretName: example
设置RBAC权限:
consolekubectl create -f deploy/namespaced/rbac.yaml
consolekubectl create -f deploy/cluster_scoped/rbac.yaml
创建CRD:
consolekubectl create -f deploy/crds/mumoshu_v1alpha1_awssecret_crd.yaml
部署operator:
REPLACE_THIS_WITH_YOUR_REGION为实际区域,如us-west-2):
consolecat deploy/namespaced/deployment.yaml | sed -e 's/REPLACE_THIS_WITH_YOUR_REGION/ap-northeast-1/' | kubectl create -f -
consolecat deploy/cluster_scoped/deployment.yaml | sed -e 's/REPLACE_THIS_WITH_YOUR_REGION/ap-northeast-1/' | kubectl create -f -
验证部署:
consolekubectl get pod -l app=aws-secret-operator
清理:
consolekubectl delete -f your_example_awssecret.yaml kubectl delete -f deploy/namespaced/deployment.yaml # 或对应集群级部署文件 kubectl delete -f deploy/namespaced/rbac.yaml # 或对应集群级RBAC文件 kubectl delete -f deploy/crds/mumoshu_v1alpha1_awssecret_crd.yaml
helm-secrets或sops结合kubectl?这些工具通过在CI中解密密钥文件(如values.yaml)供helm使用,这要求CI系统具有解密权限。若CI凭证泄露,***者可解密所有密钥,尤其在公共SaaS CI系统中风险更高。aws-secret-operator仅让CI提交AWS Secrets Manager的引用,由operator在集群内解密生成Kubernetes Secret,降低泄露风险。
优点:支持批量获取同一前缀的多个密钥,API高效。
缺点:API速率限制过低,在大规模使用时易触发限流,已有多个社区讨论证实此问题(如segmentio/chamber#84)。
优点:可扩展性好,支持按前缀高效批量获取(如chamber项目曾因SSM限流问题转向S3)。
缺点:工具支持较少,Secrets Manager作为专用密钥管理服务,有更多开发者关注和工具支持,用户体验更优。
在独立CI/CD流水线中使用sops,将密钥的“主数据”版本控制在Git仓库中。每次PR修改主数据时,CI工作流自动将更新部署到AWS Secrets Manager。仅授予CI KMS加密权限,即使凭证泄露也无法解密密钥。
适用于:
适用于:
本项目基于operator-framework构建,感谢该框架提供的强大支持。

manifest unknown 错误
TLS 证书验证失败
DNS 解析超时
410 错误:版本过低
402 错误:流量耗尽
身份认证失败错误
429 限流错误
凭证保存错误
来自真实用户的反馈,见证轩辕镜像的优质服务