2

我有 3 个不同的 Kubernetes 秘密,我想将每个秘密挂载到自己的 Pod 中,由具有 3 个副本的 StatefulSet 管理。

是否可以配置 StatefulSet 使每个 Secret 都安装到自己的 Pod 中?

4

2 回答 2

2

并不真地。StatefulSet(以及任何工作负载控制器)只允许一个 pod 定义模板(它可以有多个容器)。问题在于 StatefulSet 被设计为具有 N 个副本,因此您可以拥有 N 个秘密。它必须是一个 SecretStatefulSet:一个不同的控制器。

一些解决方案:

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

    apiVersion: v1
    kind: Secret
    metadata:
      name: mysecret
    type: Opaque
    data:
      pod1: xxx
      pod2: xxx
      pod3: xxx
      ...
      podN: xxx
    
  • 使用Hashicorp 的 Vault 之类的东西,并使用诸如pod1, pod2, pod3,...之类的密钥远程存储您的秘密podN。您还可以使用HSM。这似乎是 IMO 更可靠的解决方案,但实施可能需要更长的时间。

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

于 2019-02-26T00:15:19.300 回答
-1

我猜这正是你要找的。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"
                  }
                ]
              }
            ]
          }

现在,nginxStatefulSet 的每个 Pod 中的容器都会尝试以my-secret-{pod ordinal}.

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

项目文档中有更高级的注释用法。

于 2021-04-16T21:05:34.647 回答