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

时间:2016-06-21 13:27:15

标签: kubernetes kubectl

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

感谢。

5 个答案:

答案 0 :(得分:13)

The secret docs for users这样说:

  

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)'"}]}]}}}}'