如何将单个不同的 Secret 安装到由 StatefulSet 管理的每个 Pod 中?
How can I mount a single distinct Secret into each Pod managed by a StatefulSet?
我有 3 个不同的 Kubernetes Secret,我想将每一个都挂载到它自己的 Pod 中,该 Pod 由具有 3 个副本的 StatefulSet 管理。
是否可以配置 StatefulSet,使每个 Secret 都挂载到自己的 Pod 中?
不是真的。 StatefulSet(以及与此相关的任何工作负载控制器)只允许一个 pod 定义模板(它可以有多个容器)。这个问题是一个 StatefulSet 被设计成有 N 个副本,所以你可以有 N 个秘密。它必须是一个 SecretStatefulSet:一个不同的控制器。
一些解决方案:
您可以定义一个 Kubernetes secret,其中包含您所有 pods 所需的所有秘密。缺点是您必须在 pods 之间共享秘密。例如:
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
pod1: xxx
pod2: xxx
pod3: xxx
...
podN: xxx
使用类似 Hashicorp's Vault and store your secret remotely with keys such as pod1
, pod2
, pod3
,...podN
. You can also use an HSM 的内容。这似乎是 IMO 更可靠的解决方案,但实施起来可能需要更长的时间。
在所有情况下,您都必须确保机密的数量与 StatefulSet 中的 pods 数量相匹配。
我猜这正是您要找的。 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 的同一命名空间中。
项目文档中有更多关于注解的高级用法。
我有 3 个不同的 Kubernetes Secret,我想将每一个都挂载到它自己的 Pod 中,该 Pod 由具有 3 个副本的 StatefulSet 管理。
是否可以配置 StatefulSet,使每个 Secret 都挂载到自己的 Pod 中?
不是真的。 StatefulSet(以及与此相关的任何工作负载控制器)只允许一个 pod 定义模板(它可以有多个容器)。这个问题是一个 StatefulSet 被设计成有 N 个副本,所以你可以有 N 个秘密。它必须是一个 SecretStatefulSet:一个不同的控制器。
一些解决方案:
您可以定义一个 Kubernetes secret,其中包含您所有 pods 所需的所有秘密。缺点是您必须在 pods 之间共享秘密。例如:
apiVersion: v1 kind: Secret metadata: name: mysecret type: Opaque data: pod1: xxx pod2: xxx pod3: xxx ... podN: xxx
使用类似 Hashicorp's Vault and store your secret remotely with keys such as
pod1
,pod2
,pod3
,...podN
. You can also use an HSM 的内容。这似乎是 IMO 更可靠的解决方案,但实施起来可能需要更长的时间。
在所有情况下,您都必须确保机密的数量与 StatefulSet 中的 pods 数量相匹配。
我猜这正是您要找的。 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 的同一命名空间中。
项目文档中有更多关于注解的高级用法。