You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Mozilla SOPS与Kubernetes集成,实现资源自动化解密

SOPS与Kubernetes运行时自动解密集成方案

针对你的Jenkins+Helm部署流程,以下是实现Kubernetes运行时自动解密SOPS加密资源的具体方案:

一、选择运行时解密组件

推荐两种成熟方案,按需选择:

方案1:用Kyverno做准入式解密

Kyverno作为集群准入控制器,在资源创建时自动识别并解密SOPS加密的Secret/ConfigMap:

  1. 安装Kyverno到集群:
helm repo add kyverno https://kyverno.github.io/kyverno/
helm install kyverno kyverno/kyverno --namespace kyverno --create-namespace
  1. 部署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 }}'
  1. 后续加密资源时添加sops: "true"注解,Kyverno会在资源进入集群时自动完成解密。

方案2:用External Secrets Operator (ESO)同步解密

ESO直接从Git拉取SOPS加密文件,解密后同步为集群Secret:

  1. 安装ESO:
helm repo add external-secrets https://charts.external-secrets.io
helm install external-secrets external-secrets/external-secrets --namespace external-secrets --create-namespace
  1. 配置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
  1. 创建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流程

  1. 移除Jenkins脚本中的SOPS解密步骤,直接把加密的资源文件(或ESO的ExternalSecret配置)提交到Git的Helm Chart仓库。
  2. 修改Helm Chart的values.yaml,引用集群中已解密的Secret:
app:
  dbPassword: "{{ (lookup "v1" "Secret" "default" "app-prod-secrets").data.dbPassword | b64dec }}"
  1. Jenkins仅负责执行helm upgrade --install命令,解密逻辑完全交给Kubernetes运行时组件。

三、密钥安全注意事项

  • 解密密钥(GPG私钥、云KMS权限)仅授权给集群内的解密组件(Kyverno/ESO),不要存入Git或Jenkins凭据。
  • 云KMS场景下,给解密组件的ServiceAccount分配最小权限的KMS解密角色。

内容的提问来源于stack exchange,提问作者Saleem Ullah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 12:40:39