如何在OpenShift中无需删除重建即可更新Secret?
无需删除Secret即可更新内容的方法
当然有办法不用删除原有Secret就能更新它的内容!下面给你两种实用的方法,以及更新后如何让Pod加载新的Secret内容:
方法一:用oc create --dry-run + oc replace(推荐)
这种方法可以直接基于本地文件更新Secret,同时保留Secret的元数据(比如标签、注解),操作起来很方便:
oc create secret generic privkey --from-file=/opt/privkey --dry-run=client -o yaml | oc replace -f -
--dry-run=client:只生成Secret的YAML配置,不实际创建新的Secret- 通过管道把生成的YAML传给
oc replace,替换现有的同名Secret
注意:如果你的Secret原本包含多个数据项(比如多个文件),只指定一个
--from-file会覆盖掉其他数据项。如果需要保留原有其他数据,要么在命令里同时指定所有需要保留的文件,要么用下面的patch方法。
方法二:用oc patch更新单个数据项
如果只想更新Secret中的某一个数据项(不影响其他内容),可以用oc patch命令。不过需要先把文件内容转成Base64编码(因为Secret的数据存储格式是Base64):
- 先对本地文件进行Base64编码:
PRIVKEY_BASE64=$(cat /opt/privkey | base64 -w 0)
- 用patch命令更新Secret:
oc patch secret privkey -p "{\"data\": {\"privkey\": \"$PRIVKEY_BASE64\"}}"
更新Secret后,让Pod加载新内容
Secret更新后,已经运行的Pod不会自动刷新挂载的Secret内容,因为Kubernetes会把Secret的数据挂载为静态文件。你可以通过以下方式让Pod获取新的Secret:
- 如果Pod是由Deployment、StatefulSet等控制器管理的,推荐用滚动重启,这样不会中断服务:
oc rollout restart deployment/你的Deployment名称
- 如果是单独的Pod(没有控制器管理),直接删除Pod即可,之后重新创建的Pod会挂载更新后的Secret:
oc delete pod 你的Pod名称
内容的提问来源于stack exchange,提问作者zeh
相关产品推荐
相关产品推荐

