代码版本升级和回滚

代码版本升级和回滚:

在云原生中,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		#回滚两个版本
posted @ 2022-09-02 16:02  suyanhj  阅读(99)  评论(0编辑  收藏  举报