如何自动更新以卷方式挂载的Kubernetes Secret?
Secret挂载不更新的问题分析与解决
核心原因
你遇到的问题根源在于删除重建Secret会生成全新的UID,而Kubernetes的volume是通过Secret的UID来绑定关联的。原Pod的volume依然指向旧Secret的UID,所以不会自动同步新Secret的内容。只有当Secret在原地更新(保持UID不变)时,kubelet才能检测到内容变化,进而更新Pod内挂载的volume。
为什么删除重建无效?
Kubernetes中,当你把Secret挂载为volume时,kubelet会记录该Secret的唯一标识UID。删除旧Secret再创建同名新Secret,新Secret的UID和旧的完全不同,kubelet会认为这是一个全新的资源,不会主动将原Pod的volume切换到新Secret上,因此Pod内看不到更新后的内容。
正确的Secret更新方式
不要用删除重建的操作,直接原地更新现有Secret:
- 方法一:使用
kubectl patch命令更新kubectl patch secret ssh-keys-iaas --type='json' -p='[{"op": "replace", "path": "/data/id_rsa", "value": "'$(base64 -w0 /some/otherfile)'"}]' - 方法二:通过dry-run生成yaml再替换
kubectl create secret generic ssh-keys-iaas --from-file=id_rsa=/some/otherfile --dry-run=client -o yaml | kubectl replace -f -
确保Pod自动获取更新的前提
- 未使用
subPath挂载(你的配置已经满足) - 挂载的volume设置为
readOnly: true(你的配置已经设置) - Secret为原地更新,保持UID不变
已删除重建Secret后的补救办法
如果已经执行了删除重建操作,想要Pod获取新Secret的内容,只能重启Pod:
kubectl delete pod volume-debugger && kubectl apply -f your-pod.yaml
内容的提问来源于stack exchange,提问作者user826955
相关产品推荐
相关产品推荐

