【发布时间】:2019-02-25 23:26:51
【问题描述】:
我有 3 个不同的 Kubernetes Secret,我想将每一个都挂载到自己的 Pod 中,由具有 3 个副本的 StatefulSet 管理。
是否可以配置 StatefulSet 使每个 Secret 都挂载到自己的 Pod 中?
【问题讨论】:
标签: kubernetes statefulset kubernetes-statefulset
我有 3 个不同的 Kubernetes Secret,我想将每一个都挂载到自己的 Pod 中,由具有 3 个副本的 StatefulSet 管理。
是否可以配置 StatefulSet 使每个 Secret 都挂载到自己的 Pod 中?
【问题讨论】:
标签: kubernetes statefulset kubernetes-statefulset
不是真的。 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 更可靠的解决方案,但实施可能需要更长的时间。
在所有情况下,您都必须确保 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"
}
]
}
]
}
现在,StatefulSet 的每个 Pod 中的 nginx 容器将尝试以 my-secret-{pod ordinal} 的模式挂载自己的专用密钥。
您只需确保 my-secret-0、my-secret-1 等存在于 StatefulSet 的同一命名空间中。
项目文档中有更高级的注解用法。
【讨论】: