K8s版本回退升级&金丝雀发布

发布于:2022-07-24 ⋅ 阅读:(366) ⋅ 点赞:(0)

为了更好的解决服务编排的问题, 我们可以使用Deployment控制器。这种控制器不直接管理pod,他通过ReplicaSet来管理pod。

 

Deployment主要功能:

  • 支持ReplicaSet的所有公共
  • 支持发布的停止、继续
  • 支持滚动升级和回退版本

1.使用yaml文件形式,创建deployment

# 创建一个ddd的命名空间
kubectl create ns ddd
# vim dep.yaml
apiVersion: apps/v1  #版本号
kind: Deployment    #种类,注意大小写
metadata:     #元数据
  name: dep   #rs名称
  namespace: ddd    #所属命名空间
spec:    #详情描述
  replicas: 3   #副本数量
  selector:     #选择器,通过他指定该控制器管理那些pod
    matchLabels:  #Label匹配规则
      app: nginx-pod   #标签名
  template:   #模板,当副本数量不足时,会根据下面模板创建pod
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
      - name: nginx
        image: nginx:1.17.1
# 创建deployment,注意要加 --record=true
kubectl create -f dep.yaml --record=true


# 查看dep
# UP-TO-DATE 最新版本的pod的数量
# AVAILABLE  当前可用的pod的数量
kubectl get deploy dep -n ddd
NAME   READY   UP-TO-DATE   AVAILABLE   AGE
dep    3/3     3            3           4s

# 查看rs
kubectl get rs -n ddd
NAME                       DESIRED   CURRENT   READY   AGE
dep-858db84f89             3         3         3       4m16s

# 查看pod
NAME                             READY   STATUS    RESTARTS   AGE
dep-858db84f89-5qmxq             1/1     Running   0          4m58s
dep-858db84f89-766t8             1/1     Running   0          4m58s
dep-858db84f89-gjb6m             1/1     Running   0          4m58s

2.扩缩容

扩容可以有两种方法
1. 命令变更副本数量为5个
[root@k8s-master ~]# kubectl scale deploy dep --replicas=5 -n ddd
[root@k8s-master ~]# kubectl get deploy  dep -n ddd
NAME   READY   UP-TO-DATE   AVAILABLE   AGE
dep    5/5     5            5           8m40s

2. 编辑更新副本数量为6个
[root@k8s-master ~]# kubectl edit deploy dep -n ddd
编辑spec里的replicas
spec:
  progressDeadlineSeconds: 600
  replicas: 6
[root@k8s-master ~]# kubectl get deploy  dep -n ddd
NAME   READY   UP-TO-DATE   AVAILABLE   AGE
dep    6/6     6            6           11m

3.镜像更新

编辑dep.yaml,添加重建更新策略

spec:
  strategy: # 策略
    type: Recreate # 重建更新

 kubectl apply -f dep.yaml

# 查看当前镜像版本为1.17.1
[root@k8s-master ~]# kubectl get deploy  dep -n dev -o wide
NAME   READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES         SELECTOR
dep    3/3     3            3           14m   nginx        nginx:1.17.1   app=nginx-pod

# 更改为1.17.2
[root@k8s-master ~]# kubectl set image deploy dep nginx=nginx:1.17.2  -n dev
deployment.apps/dep image updated
[root@k8s-master ~]# kubectl get deploy  dep -n dev -o wide
NAME   READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES         SELECTOR
dep    3/3     3            3           16m   nginx        nginx:1.17.2   app=nginx-pod

# 查看rs,发现现在rs是2个了,pod数量为6个
[root@k8s-master ~]# kubectl get rs -n dev
NAME                       DESIRED   CURRENT   READY   AGE
dep-57c77dd4dd             3         3         3       2m47s
dep-6c78d7875b             0         0         0       4m31s

编辑dep.yaml,添加滚动更新策略

spec:
  strategy: # 策略
    type: RollingUpdate # 滚动更新策略
    rollingUpdate:
      maxSurge: 25% 
      maxUnavailable: 25%

 kubectl apply -f dep.yaml 

# 变更镜像
[root@k8s-master ~]# kubectl set image deployment dep nginx=nginx:1.17.1 -n ddd

# 过几秒钟查看升级
[root@k8s-master ~]# kubectl get pod -n ddd

4.版本回退

kubectl rollout: 版本升级相关功能,支持下面的选项:

  • status 显示当前升级状态

  • history 显示 升级历史记录

  • pause 暂停版本升级过程

  • resume 继续已经暂停的版本升级过程

  • restart 重启版本升级过程

  • undo 回滚到上一级版本

# 查看当前升级版本的状态
[root@k8s-master ~]# kubectl rollout status deploy dep  -n ddd
deployment "dep" successfully rolled out

# 查看升级历史记录
[root@k8s-master ~]# kubectl rollout history deploy dep -n ddd
deployment.apps/dep
REVISION  CHANGE-CAUSE
1         kubectl create --filename=dep.yaml --record=true
2         kubectl create --filename=dep.yaml --record=true
3         kubectl create --filename=dep.yaml --record=true
# 可以发现有三次版本记录,说明完成过两次升级

# 版本回滚
# 使用--to-revision=1回滚到了1版本
[root@k8s-master ~]# kubectl rollout undo deployment dep --to-revision=1 -n ddd

# 查看发现,通过nginx镜像版本可以发现到了第一版
[root@k8s-master1 ~]# kubectl get deploy -n ddd -o wide
NAME            READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES         
dep   3/3     3            3           74m   nginx        nginx:1.17.1 

5.金丝雀发布

类似灰度发布:让一小部分用户先用上新版本,还有一部分人有旧版本

Deployment控制器支持控制更新过程中的控制,如“暂停(pause)”或“继续(resume)”更新操作。

 

金丝雀发布的优点:

1、按比例将流量无差别地导向新版本,新版本故障影响范围小;

2、发布期间逐步对新版本扩容,同时对老版本缩容,资源利用率高。

金丝雀发布的缺点

1、流量无差别地导向新版本,可能会影响重要用户的体验;

2、发布周期长。

# 更新deployment的版本,并配置暂停deployment
[root@k8s-master ~]# kubectl set image deploy dep nginx=nginx:1.17.3 -n ddd && kubectl rollout pause depl                                                                               oyment dep -n ddd

#观察更新状态
[root@k8s-master ~]# kubectl rollout status deploy dep -n ddd
Waiting for deployment "dep" rollout to finish: 1 out of 3 new replicas have been updated...

# 查看资源,发现有一部分在1,有意部分在3
[root@k8s-master ~]#  kubectl get rs -n ddd -o wide
NAME                       DESIRED   CURRENT   READY   AGE   CONTAINERS   IMAGES         SELECTOR
dep-57c77dd4dd             0         0         0       54m   nginx        nginx:1.17.2   app=nginx-pod,pod-template-hash=57c77dd4dd
dep-6c78d7875b             3         3         3       56m   nginx        nginx:1.17.1   app=nginx-pod,pod-template-hash=6c78d7875b
dep-849d4778f4             1         1         1       66s   nginx        nginx:1.17.3   app=nginx-pod,pod-template-hash=849d4778f4

# 确保更新的pod没问题了,继续更新
[root@k8s-master ~]# kubectl rollout resume deploy dep -n ddd

# 查看最后的更新情况,全部就为
[root@k8s-master ~]# kubectl get rs -n ddd -o wide


网站公告

今日签到

点亮在社区的每一天
去签到