设计背景:服务部署时常常会对已有服务进行镜像更新或容器重启等操作,如果直接使用 kubectl apply 命令,会让 Pod 重新进入调度流程,导致重新调度节点或 ip 重新分配等。 在此原因上开发此 operator,让原地操作更加方便。
思路:使用 k8s-clientSet 中的 patch 操作实现。
- 支持 Deployment 中的 Pod 原地升级镜像
- 支持 Deployment 中的 Pod 原地重启容器
- 支持修改部分副本
apiVersion: api.practice.com/v1alpha1
kind: Podrestarter
metadata:
name: mypodrestarter
spec:
type: restart # restart 代表pod原地重启容器 upgrade 代表原地升级镜像
# 目前仅支持 deployment 操作
deployment_name: my-deployment # deployment name
deployment_namespace: default # deployment namespace
replicas: 2 # 升级或重启的副本数,数量需要小于等于 deployment 副本数
images: # 升级镜像,镜像顺序一定要 "按照原顺序"
- image: nginx:1.19-alpine
- image: busybox
[root@VM-0-16-centos podrestarteroperator]# kubectl get podrestarters.api.practice.com
NAME TYPE AGE
mypodrestarter ReStarter 9m34s
mypodupgrade Upgrade 57s
附注:使用 patch 原地升级 pod 有一些限制,需要特别注意,否则会遇到 patch error 参考 issue