我有 3 个不同的 Kubernetes 秘密,我想将每个秘密挂载到自己的 Pod 中,由具有 3 个副本的 StatefulSet 管理。
是否可以配置 StatefulSet 使每个 Secret 都安装到自己的 Pod 中?
我有 3 个不同的 Kubernetes 秘密,我想将每个秘密挂载到自己的 Pod 中,由具有 3 个副本的 StatefulSet 管理。
是否可以配置 StatefulSet 使每个 Secret 都安装到自己的 Pod 中?
并不真地。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 数量相匹配。
我猜这正是你要找的。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"
}
]
}
]
}
现在,nginx
StatefulSet 的每个 Pod 中的容器都会尝试以my-secret-{pod ordinal}
.
您只需要确保StatefulSet 的同一个命名空间中存在my-secret-0
, my-secret-1
, 等等。
项目文档中有更高级的注释用法。