23

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

谢谢。

4

5 回答 5

24

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

于 2019-08-15T13:13:35.653 回答
19

用户的秘密文档是这样说的:

Mounted Secrets 会自动更新当一个卷中已经使用的 Secret 被更新时,预计的密钥最终也会被更新。更新时间取决于 kubelet 同步周期。

已安装的机密已更新。问题是什么时候。如果秘密的内容被更新并不意味着您的应用程序会自动使用它。在这种情况下,您的应用程序的工作就是监视文件更改以采取相应的行动。考虑到这一点,您目前需要做更多的工作。我现在想到的一种方法是在 Kubernetes 中运行计划的作业,该作业与 Kubernetes API 对话以启动新的部署部署。这样你理论上可以实现你想要更新你的秘密。它在某种程度上并不优雅,但这是我目前唯一想到的方式。我仍然需要自己检查更多关于 Kubernetes 的概念。所以请多多包涵。

于 2016-10-19T18:24:13.887 回答
9

假设我们正在运行 pod mypod [在 pod 规范中将秘密挂载为 mysecret]

我们可以删除现有的秘密

kubectl delete secret mysecret

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

kubectl create secret mysecret <updated file/s>

然后做

kubectl apply -f ./mypod.yaml

检查mypod里面的秘密,它会被更新。

于 2017-05-10T19:22:49.883 回答
4

万一有人(比如我)想要强制使用这些秘密的滚动更新 pod。从这个issue开始,诀窍是更新容器内的一个 Env 变量,然后 k8s 会自动滚动更新整个 pod

kubectl patch deployment mydeployment -p '{"spec":{"template":{"spec":{"containers":[{"name":"mycontainer","env":[{"name":"RESTART_","value":"'$(date +%s)'"}]}]}}}}'
于 2019-02-27T06:58:54.543 回答
-1

按照设计,Kubernetes 不会将 Secret 更新推送到正在运行的 Pod。如果要更新 Pod 的 Secret 值,则必须销毁并重新创建 Pod。你可以在这里阅读更多关于它的信息。

于 2016-06-21T20:04:35.523 回答