
aws-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": 1543636981.306, "LastAccessedDate": 1543622400.0, "VersionIdsToStages": { "c43e66cb-d0fe-44c5-9b7e-d450441a04be": ["AWSCURRENT"] } }
注意:aws-secret-operator不允许省略
VersionId或指定VersionStage,因为这会导致难以响应AWS密钥变化触发Pod更新。可使用https://github.com/mumoshu/aws-secret-operator/blob/master/scripts/update-aws-secret-ids%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84VersionId%E3%80%82
创建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速率限制过低,在大规模使用时易触发限流,已有多个社区讨论证实此问题(如https://github.com/segmentio/chamber/issues/84#issuecomment-437728047%EF%BC%89%E3%80%82
优点:可扩展性好,支持按前缀高效批量获取(如https://github.com/segmentio/chamber%E9%A1%B9%E7%9B%AE%E6%9B%BE%E5%9B%A0SSM%E9%99%90%E6%B5%81%E9%97%AE%E9%A2%98%E8%BD%AC%E5%90%91S3%EF%BC%89%E3%80%82
缺点:工具支持较少,Secrets Manager作为专用密钥管理服务,有更多开发者关注和工具支持,用户体验更优。
在独立CI/CD流水线中使用https://github.com/mozilla/sops%EF%BC%8C%E5%B0%86%E5%AF%86%E9%92%A5%E7%9A%84%E2%80%9C%E4%B8%BB%E6%95%B0%E6%8D%AE%E2%80%9D%E7%89%88%E6%9C%AC%E6%8E%A7%E5%88%B6%E5%9C%A8Git%E4%BB%93%E5%BA%93%E4%B8%AD%E3%80%82%E6%AF%8F%E6%AC%A1PR%E4%BF%AE%E6%94%B9%E4%B8%BB%E6%95%B0%E6%8D%AE%E6%97%B6%EF%BC%8CCI%E5%B7%A5%E4%BD%9C%E6%B5%81%E8%87%AA%E5%8A%A8%E5%B0%86%E6%9B%B4%E6%96%B0%E9%83%A8%E7%BD%B2%E5%88%B0AWS Secrets Manager。仅授予CI KMS加密权限,即使凭证泄露也无法解密密钥。
适用于:
适用于:
本项目基于https://github.com/operator-framework/operator-sdk%E6%9E%84%E5%BB%BA%EF%BC%8C%E6%84%9F%E8%B0%A2%E8%AF%A5%E6%A1%86%E6%9E%B6%E6%8F%90%E4%BE%9B%E7%9A%84%E5%BC%BA%E5%A4%A7%E6%94%AF%E6%8C%81%E3%80%82
您可以使用以下命令拉取该镜像。请将 <标签> 替换为具体的标签版本。如需查看所有可用标签版本,请访问 标签列表页面。

探索更多轩辕镜像的使用方法,找到最适合您系统的配置方式
通过 Docker 登录认证访问私有仓库
无需登录使用专属域名
Kubernetes 集群配置 Containerd
K3s 轻量级 Kubernetes 镜像加速
VS Code Dev Containers 配置
Podman 容器引擎配置
HPC 科学计算容器配置
ghcr、Quay、nvcr 等镜像仓库
Harbor Proxy Repository 对接专属域名
Portainer Registries 加速拉取
Nexus3 Docker Proxy 内网缓存
需要其他帮助?请查看我们的 常见问题Docker 镜像访问常见问题解答 或 提交工单
docker search 限制
站内搜不到镜像
离线 save/load
插件要用 plugin install
WSL 拉取慢
安全与 digest
新手拉取配置
镜像合规机制
manifest unknown
no matching manifest(架构)
invalid tar header(解压)
TLS 证书失败
DNS 超时
域名连通性排查
410 Gone 排查
402 与流量用尽
401 认证失败
429 限流
D-Bus 凭证提示
413 与超大单层
来自真实用户的反馈,见证轩辕镜像的优质服务