代码版本升级和回滚
代码版本升级和回滚:
在云原生中,k8s仅仅只是用来解决微服务的生命周期相关,在云原生环境中,应该采用更完善的gitops解决方案,能实现更高级、更便捷的版本发布,如:
- tekton
- argocd、argocd-rollout
- fluxcd
- jenkinX
升级:
支持2种更新策略
滚动更新: 起一个新的停一个旧的,会导致2个版本临时共存
重建更新: 删除所有现有pod,再新建pod,会导致服务不可访问
命令方式:
通过修改镜像tag名称来实现
kubectl set image 控制器 控制器名称 容器名称(yml文件定义)=镜像版本
例1: 滚动更新
kubectl set image deploy n1-dep web=nginx:1.19.0
例2:金丝雀发布方法1
直接用命令行操作
1)先实现金丝雀更新
#指定副本更新,从最后一个更新到第一个
kubectl patch sts ngx-sts -p '{"spec":{"updateStrategy":{"rollingUpdate":{"partition":2}}}}'
#更新
kubectl set image statfulset ngx-sts ngx=nginx:1.24.0 --record=true
#指定更新时的描述信息,这条命令可以自定义描述信息,上一条的--record选项实现类似功能,但它只能记录命令,不能自定义
kubectl annotate statfulset ngx-sts kubernetes.io/change-cause='update image 1.24.0'
2)查看更新变化
#查看pod的镜像版本变更,只是ngx-sts-2变化
kubectl get pod ngx-sts-2 -o custom-columns=CONTAINER:.spec.containers[0].name,IMAGE:.spec.containers[0].image
#将pod暂停
kubectl rollout pause sts ngx-sts
#第一个pod的版本还没有更新
kubectl get pod ngx-sts-0 -o custom-columns=CONTAINER:.spec.containers[0].name,IMAGE:.spec.containers[0].image
3)再全部发布
kubectl rollout resume sts ngx-sts
kubectl patch sts ngx-sts -p '{"spec":{"updateStrategy":{"rollingUpdate":{"partition":0}}}}'
文件方式:
修改yml文件,再执行apply
控制更新数量可参考deployment控制器的strategy
配置
例1: 金丝雀发布方法2
yaml清单实现
1)创建svc
apiVersion: v1
kind: Service
metadata:
name: ngx-svc
spec:
ports:
- name: 80-80
nodePort: 30800
port: 80
protocol: TCP
targetPort: 80
selector:
app: ngx
type: NodePort
2)创建ngx v1版本的pod
apiVersion: apps/v1
kind: Deployment
metadata:
name: ngx-dep
spec:
replicas: 4
selector:
matchLabels:
app: ngx
version: v1
template:
metadata:
labels:
app: ngx
version: v1
spec:
containers:
- image: nginx
name: nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
3)创建ngx v2版本的pod
cat > xx.yml <<-eof
apiVersion: apps/v1
kind: Deployment
metadata:
name: ngx-dep-v2
spec:
replicas: 1
selector:
matchLabels:
app: ngx
version: v2
template:
metadata:
labels:
app: ngx
version: v2
spec:
containers:
- image: nginx
name: nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
eof
name=`kubectl get po |awk '/ngx-dep-v2/{print $1}'`
kubectl exec -it $name -- echo v2 > /usr/share/nginx/html/index.html
4)修改svc的标签选择器
命令行直接修改,或者改ngx-svc的配置清单
kubectl patch svc ngx-svc -p '{"spec":{"selector": {"version": "v2"}}}'
#此时,v1版本就不会再进入新流量,可以删除v1版本的控制器,再扩大v2版本的pod到正常数量
kubectl delete -f 1-ngx-dep.yml
kubectl patch deploy ngx-dep-v2 -p '{"spec": {"replicas": 4}}'
回滚:
kubectl rollout 子命令
history #显示控制器的历史版本信息
deployment ngx-dep
pause #将资源标记为暂停
restart
resume #取消暂停的资源
status
undo #回滚上一个版本,如果当前是10,回滚则是9,但版本记录当前位置是11
选项:
--to-revision=版本 #回滚到指定版本
例:
kubectl rollout undo deployment ngx-dep #回滚上一个版本
kubectl rollout undo deployment ngx-dep --to-revision 2 #回滚两个版本