如何将Mozilla SOPS与Kubernetes集成,实现资源自动化解密
SOPS与Kubernetes运行时自动解密集成方案
针对你的Jenkins+Helm部署流程,以下是实现Kubernetes运行时自动解密SOPS加密资源的具体方案:
一、选择运行时解密组件
推荐两种成熟方案,按需选择:
方案1:用Kyverno做准入式解密
Kyverno作为集群准入控制器,在资源创建时自动识别并解密SOPS加密的Secret/ConfigMap:
- 安装Kyverno到集群:
helm repo add kyverno https://kyverno.github.io/kyverno/ helm install kyverno kyverno/kyverno --namespace kyverno --create-namespace
- 部署Kyverno SOPS解密侧车并创建解密策略:
先将SOPS解密所需的密钥(如GPG私钥)存入集群Secret,再创建ClusterPolicy触发自动解密:
apiVersion: kyverno.io/v1 kind: ClusterPolicy metadata: name: sops-decrypt spec: validationFailureAction: enforce background: false rules: - name: decrypt-encrypted-resources match: any: - resources: kinds: ["Secret", "ConfigMap"] annotations: sops: "true" mutate: patchStrategicMerge: data: |- {{ call decrypt .Object.data }} context: - name: decrypt apiCall: url: "http://kyverno-sops.kyverno.svc.cluster.local/decrypt" method: POST body: raw: '{{ toJson .Object.data }}'
- 后续加密资源时添加
sops: "true"注解,Kyverno会在资源进入集群时自动完成解密。
方案2:用External Secrets Operator (ESO)同步解密
ESO直接从Git拉取SOPS加密文件,解密后同步为集群Secret:
- 安装ESO:
helm repo add external-secrets https://charts.external-secrets.io helm install external-secrets external-secrets/external-secrets --namespace external-secrets --create-namespace
- 配置SecretStore关联解密密钥:
以GPG密钥为例,先将私钥存入集群Secret,再创建SecretStore:
apiVersion: external-secrets.io/v1beta1 kind: SecretStore metadata: name: sops-store namespace: default spec: provider: sops: gpg: secretRef: name: sops-gpg-key key: private.key
- 创建ExternalSecret指向Git中的加密文件:
apiVersion: external-secrets.io/v1beta1 kind: ExternalSecret metadata: name: app-prod-secrets namespace: default spec: secretStoreRef: name: sops-store kind: SecretStore target: name: app-prod-secrets data: - secretKey: db-password remoteRef: key: ./secrets/prod/db.sops.yaml property: db.password
ESO会自动拉取、解密并同步Secret,你的Helm Chart直接引用这个同步后的Secret即可。
二、适配Jenkins+Helm流程
- 移除Jenkins脚本中的SOPS解密步骤,直接把加密的资源文件(或ESO的ExternalSecret配置)提交到Git的Helm Chart仓库。
- 修改Helm Chart的values.yaml,引用集群中已解密的Secret:
app: dbPassword: "{{ (lookup "v1" "Secret" "default" "app-prod-secrets").data.dbPassword | b64dec }}"
- Jenkins仅负责执行
helm upgrade --install命令,解密逻辑完全交给Kubernetes运行时组件。
三、密钥安全注意事项
- 解密密钥(GPG私钥、云KMS权限)仅授权给集群内的解密组件(Kyverno/ESO),不要存入Git或Jenkins凭据。
- 云KMS场景下,给解密组件的ServiceAccount分配最小权限的KMS解密角色。
内容的提问来源于stack exchange,提问作者Saleem Ullah
相关产品推荐
相关产品推荐

