更新kubernetes secrets不会更新正在运行的容器env变量

Omr*_*tix 14 kubernetes kubectl

Currenly在更新kubernetes secrets文件时,为了应用更改,我需要运行kubectl apply -f my-secrets.yaml.如果有一个正在运行的容器,它仍将使用旧的秘密.为了在正在运行的容器上应用新的秘密,我目前运行该命令kubectl replace -f my-pod.yaml.我想知道这是否是更新正在运行的容器秘密的最佳方式,或者我错过了什么.

谢谢.

vic*_*rtv 23

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


xh3*_*4sd 15

用户的秘密文档说:

已安装的密钥会自动更新当更新卷中已使用的密钥时,最终也会更新预计的密钥.更新时间取决于kubelet同步周期.

已安装的机密信息已更新.问题是什么时候.如果更新机密内容并不意味着您的应用程序会自动使用它.应用程序的工作是在此方案中观察文​​件更改以采取相应措施.记住这一点,你现在需要做更多的工作.我现在想到的一种方法是在Kubernetes中运行一个预定的工作,工作与Kubernetes API进行对话,以启动部署的新部署.这样你理论上可以实现你想要更新你的秘密.它在某种程度上并不优雅,但这是我此刻想到的唯一方式.我仍然需要自己检查更多关于Kubernetes概念的内容.所以请耐心等待.

  • Secrets 文档还指出,“使用 Secret 作为子路径卷挂载的容器将不会收到 Secret 更新”——这让我困惑了一段时间。 (3认同)
  • 另一种监视秘密的方法是使用 `inotify` 并观察它安装的目录。 (2认同)

小智 9

假设我们已经运行pod mypod [装载密码作为pod规范中的mysecret]

我们可以删除现有的秘密

kubectl delete secret mysecret
Run Code Online (Sandbox Code Playgroud)

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

kubectl create secret mysecret <updated file/s>
Run Code Online (Sandbox Code Playgroud)

然后做

kubectl apply -f ./mypod.yaml
Run Code Online (Sandbox Code Playgroud)

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


win*_*boy 5

如果有人(像我一样)想要强制滚动更新正在使用这些秘密的 Pod。从这个问题来看,技巧是更新容器内的Env变量,然后k8s将自动滚动更新整个pod

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