如何将单个不同的 Secret 安装到由 StatefulSet 管理的每个 Pod 中?

How can I mount a single distinct Secret into each Pod managed by a StatefulSet?

我有 3 个不同的 Kubernetes Secret,我想将每一个都挂载到它自己的 Pod 中,该 Pod 由具有 3 个副本的 StatefulSet 管理。

是否可以配置 StatefulSet,使每个 Secret 都挂载到自己的 Pod 中?

不是真的。 StatefulSet(以及与此相关的任何工作负载控制器)只允许一个 pod 定义模板(它可以有多个容器)。这个问题是一个 StatefulSet 被设计成有 N 个副本,所以你可以有 N 个秘密。它必须是一个 SecretStatefulSet:一个不同的控制器。

一些解决方案:

  • 您可以定义一个 Kubernetes secret,其中包含您所有 pods 所需的所有秘密。缺点是您必须在 pods 之间共享秘密。例如:

    apiVersion: v1
    kind: Secret
    metadata:
      name: mysecret
    type: Opaque
    data:
      pod1: xxx
      pod2: xxx
      pod3: xxx
      ...
      podN: xxx
    
  • 使用类似 Hashicorp's Vault and store your secret remotely with keys such as pod1, pod2, pod3,...podN. You can also use an HSM 的内容。这似乎是 IMO 更可靠的解决方案,但实施起来可能需要更长的时间。

在所有情况下,您都必须确保机密的数量与 StatefulSet 中的 pods 数量相匹配。

我猜这正是您要找的。 https://github.com/spoditor/spoditor

本质上,它在 PodSpec 模板上使用自定义注释,例如:

      annotations:
        spoditor.io/mount-volume: |
          {
            "volumes": [
              {
                "name": "my-volume",
                "secret": {
                  "secretName": "my-secret"
                }
              }
            ],
            "containers": [
              {
                "name": "nginx",
                "volumeMounts": [
                  {
                    "name": "my-volume",
                    "mountPath": "/etc/secrets/my-volume"
                  }
                ]
              }
            ]
          }

现在,StatefulSet 的每个 Pod 中的 nginx 容器将尝试以 my-secret-{pod ordinal}.

的模式挂载其自己的专用密钥

您只需确保 my-secret-0my-secret-1 等存在于 StatefulSet 的同一命名空间中。

项目文档中有更多关于注解的高级用法。