我有3个不同的Kubernetes Secrets,我想将每一个安装到由带有3个副本的StatefulSet管理的自己的Pod中。
是否可以配置StatefulSet以便将每个Secret装入其自己的Pod中?
答案 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的东西,并使用诸如pod1
,pod2
,pod3
,... 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-0
、my-secret-1
等存在于 StatefulSet 的同一命名空间中。
在项目文档中有更高级的注解用法。