本文介绍重启K8S Deployment的小技巧
有时候我们会需要重启Deployment,原因可能是:
- docker image使用的是latest tag,这个latest在docker image registry已经更新了,我们需要重启deployment来使用新的latest
- Pod运行缓慢但是还活着,我们就是想重启一下
- ConfigMap/Secret变更了,想重启一下应用新配置
上面两种情况的共同之处在于,Deployment spec没有发生任何变化,因此即使你kubectl appply -f deployment-spec.yaml
也是没用的,因为K8S会认为你这个没有变化就什么都不做了。
但是我们又不想使用手工删除Pod-让K8S新建Pod的方式来重启Deployment,最好的办法应该是像Updating a deployment一样,让K8S自己滚动的删除-新建Pod。
有人对此给了一个workaround:
kubectl patch deployment <deployment-name> \
-p '{"spec":{"template":{"spec":{"containers":[{"name":"<container-name>","env":[{"name":"RESTART_","value":"'$(date +%s)'"}]}]}}}}'
基本思路就是给Container添加一个无关紧要的环境变量,这个环境变量的值就是时间戳,而这个时间戳则是每次执行上述命令的系统当前时间。这样一来对于K8S来讲这个Deployment spec就变化了,就可以像Updating a deployment一样,重启Pod了。