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

时间:2019-02-25 23:26:51

标签: kubernetes statefulset kubernetes-statefulset

我有3个不同的Kubernetes Secrets,我想将每一个安装到由带有3个副本的StatefulSet管理的自己的Pod中。

是否可以配置StatefulSet以便将每个Secret装入其自己的Pod中?

2 个答案:

答案 0 :(得分:2)

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

一些解决方案:

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

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

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

答案 1 :(得分:-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"
                  }
                ]
              }
            ]
          }

现在,StatefulSet 的每个 Pod 中的 nginx 容器将尝试以 my-secret-{pod ordinal} 的模式挂载自己的专用密钥。

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

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