更新 kubernetes 机密不更新 运行 容器环境变量

Update kubernetes secrets doesn't update running container env vars

目前在更新 kubernetes 机密文件时,为了应用更改,我需要 运行 kubectl apply -f my-secrets.yaml。如果有一个 运行ning 容器,它仍然会使用旧的秘密。为了在 运行ning 容器上应用新的秘密,我目前 运行 命令 kubectl replace -f my-pod.yaml 。 我想知道这是否是更新 运行ning 容器机密的最佳方式,还是我遗漏了什么。

谢谢。

根据设计,Kubernetes 不会将 Secret 更新推送到 运行 Pods。如果要更新 Pod 的 Secret 值,则必须销毁并重新创建 Pod。您可以阅读更多相关信息 here

The secret docs for users这样说:

Mounted Secrets are updated automatically When a secret being already consumed in a volume is updated, projected keys are eventually updated as well. The update time depends on the kubelet syncing period.

安装的机密已更新。问题是什么时候。如果一个秘密的内容被更新并不意味着您的应用程序会自动使用它。您的应用程序的工作是在这种情况下观察文件更改以采取相应的行动。考虑到这一点,您目前需要做更多的工作。我现在想到的一种方法是 运行 a scheduled job in Kubernetes which talks to the Kubernetes API to initiate a new rollout of your deployment。这样你理论上可以实现你想要更新你的秘密的东西。它在某种程度上并不优雅,但这是我目前唯一想到的方式。我仍然需要自己检查更多关于 Kubernetes 概念的信息。所以请多多包涵。

假设我们有 运行 个 pod mypod [在 pod 规范中将 secret 安装为 mysecret]

我们可以删除现有的秘密

kubectl delete secret mysecret

用更新的文件重新创建相同的秘密

kubectl create secret mysecret <updated file/s>

然后做

kubectl apply -f ./mypod.yaml

查看mypod里面的秘密,会更新的

万一有人(像我一样)想要强制滚动更新 pods 正在使用这些秘密。从这个issue,诀窍是更新容器内部的一个Env变量,然后k8s会自动滚动更新整个pods

kubectl patch deployment mydeployment -p '{"spec":{"template":{"spec":{"containers":[{"name":"mycontainer","env":[{"name":"RESTART_","value":"'$(date +%s)'"}]}]}}}}'

对于 k8s 的版本 >v1.15:kubectl rollout restart deployment $deploymentname:这将 逐步重启 pods 而不会导致停机。