在更新kubernetes secrets文件时,为了应用更改,我需要运行kubectl apply -f my-secrets.yaml
。如果有一个正在运行的容器,它仍将使用旧的秘密。为了在正在运行的容器上应用新机密,我目前运行命令kubectl replace -f my-pod.yaml
。
我想知道这是否是更新正在运行的容器秘密的最佳方式,或者我错过了什么。
感谢。
答案 0 :(得分:13)
Mounted Secrets会自动更新 当更新卷中已经消耗的秘密时,最终也会更新预计的密钥。更新时间取决于kubelet同步周期。
已更新已安装的机密信息。问题是什么时候。如果更新机密内容并不意味着您的应用程序会自动使用它。应用程序的工作是在此方案中观察文件更改以采取相应措施。记住这一点,你现在需要做更多的工作。我现在想到的一种方法是运行scheduled job in Kubernetes与Kubernetes API对话,以启动deployment的新推出。这样你理论上可以实现你想要更新你的秘密。它在某种程度上并不优雅,但这是我此刻想到的唯一方式。我仍然需要自己检查更多关于Kubernetes概念的内容。所以请耐心等待。
答案 1 :(得分:9)
假设我们已经运行pod mypod [装载密码作为pod spec中的mysecret]
我们可以删除现有的秘密
kubectl delete secret mysecret
使用更新的文件重新创建相同的秘密
kubectl create secret mysecret <updated file/s>
然后做
kubectl apply -f ./mypod.yaml
检查mypod中的秘密,它会更新。
答案 2 :(得分:5)
对于k8s版本> v1.15:inputRules: [
v => (v && v.length >= 1) || "Kindly enter a value for this field"
],
:这将
逐步重新启动Pod,而不会导致停机。
答案 3 :(得分:2)
按照设计,Kubernetes不会推出Secret更新来运行Pods。如果要更新Pod的Secret值,则必须销毁并重新创建Pod。您可以阅读更多相关信息here。
答案 4 :(得分:1)
万一有人(像我一样)想要强迫滚动使用这些秘密的更新Pod。通过此issue,诀窍是更新容器内的Env变量,然后k8s会自动滚动更新整个pod
kubectl patch deployment mydeployment -p '{"spec":{"template":{"spec":{"containers":[{"name":"mycontainer","env":[{"name":"RESTART_","value":"'$(date +%s)'"}]}]}}}}'