在正式生产环境中,新的应用版本的升级,是一件需要加倍小心的事情。

因为在升级的同时,有很多用户正在使用你的应用,进行版本升级,必须要考虑业务的连续性和平滑性,尽量减少对业务的影响。

万一升级出现问题,还要能够快速回退到原来的稳定版本,让系统能够保持平稳运行。

Kubernetes一般采用kubectl进行容器版本升级,一次性把容器升级完成,这对于测试环境来讲没问题,但对于生产环境来讲,显然是远远不够的。

Argo rollouts主要采用两种方式进行应用升级:蓝绿部署和金丝雀部署。

蓝绿部署:把原来的稳定版本的容器组叫蓝组,新的升级版本的容器组叫绿组,蓝组已经在集群里面正常运行。应用升级的时候,把绿组部署上去,蓝组继续运行,用户流量仍然导向蓝组。绿组部署完成,测试无误后,再把用户流量切到绿组,以保证业务的连续不中断。中间万一出现问题,还可以把用户流量快速切回到蓝组,保证万无一失。

操作系统: Debian 12 ,Kubernetes 1.28.4

一、安装软件

在Kubernetes集群的master主机上,运行下列命令,安装argo rollouts

kubectl create namespace argo-rollouts
kubectl apply -n argo-rollouts -f https://github.com/argoproj/argo-rollouts/releases/latest/download/install.yaml

运行下列命令,安装kubectl插件

curl -LO https://github.com/argoproj/argo-rollouts/releases/latest/download/kubectl-argo-rollouts-linux-amd64
chmod +x ./kubectl-argo-rollouts-linux-amd64
sudo mv ./kubectl-argo-rollouts-linux-amd64 /usr/local/bin/kubectl-argo-rollouts
kubectl argo rollouts version

二、使用案例

用nginx升级作为案例,把nginx从1.24升级到1.25.2。

1.部署原有的稳定应用版本

新建文件bluegreen-rollout.yaml,内容如下:

apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: bluegreen-demo
  labels:
    app: bluegreen-demo
spec:
  replicas: 2
  revisionHistoryLimit: 1
  selector:
    matchLabels:
      app: bluegreen-demo
  template:
    metadata:
      labels:
        app: bluegreen-demo
    spec:
      containers:
        - name: mynginx
          image: atomhub.openatom.cn/library/nginx:1.24
          imagePullPolicy: Always
          ports:
            - name: http
              containerPort: 80
              protocol: TCP
  strategy:
    blueGreen:
      autoPromotionEnabled: false
      activeService: bluegreen-demo
      previewService: bluegreen-demo-preview

新建文件bluegreen-service.yaml,内容如下

apiVersion: v1
kind: Service
metadata:
  name: bluegreen-demo
  labels:
    app: bluegreen-demo
spec:
  type: NodePort
  selector:
    app: bluegreen-demo
  ports:
    - port: 80
      targetPort: http
      protocol: TCP
      name: http

---
apiVersion: v1
kind: Service
metadata:
  name: bluegreen-demo-preview
  labels:
    app: bluegreen-demo
spec:
  type: NodePort
  selector:
    app: bluegreen-demo
  ports:
    - port: 80
      targetPort: http
      protocol: TCP
      name: http

运行

kubectl apply -f bluegreen-rollout.yaml -f bluegreen-service.yaml

把nginx1.24 和service部署上去。

2.部署新的应用版本

运行

kubectl argo rollouts set image bluegreen-demo   mynginx=atomhub.openatom.cn/library/nginx:1.25.2

把nginx1.25.2也部署上去。

运行

kubectl argo rollouts get rollout bluegreen-demo

可以看到当前应用的容器部署情况。输出类似下面

Name:            bluegreen-demo
Namespace:       default
Status:          ॥ Paused
Message:         BlueGreenPause
Strategy:        BlueGreen
Images:          atomhub.openatom.cn/library/nginx:1.24 (stable, active)
                 atomhub.openatom.cn/library/nginx:1.25.2 (preview)
Replicas:
  Desired:       2
  Current:       4
  Updated:       2
  Ready:         2
  Available:     2

NAME                                        KIND        STATUS     AGE    INFO
⟳ bluegreen-demo                            Rollout     ॥ Paused   3m4s
├──# revision:2
│  └──⧉ bluegreen-demo-569b5fc765           ReplicaSet  ✔ Healthy  37s    preview
│     ├──□ bluegreen-demo-569b5fc765-6kgtl  Pod         ✔ Running  37s    ready:1/1
│     └──□ bluegreen-demo-569b5fc765-xw6j9  Pod         ✔ Running  37s    ready:1/1
└──# revision:1
   └──⧉ bluegreen-demo-745d7867df           ReplicaSet  ✔ Healthy  2m44s  stable,active
      ├──□ bluegreen-demo-745d7867df-6fgjc  Pod         ✔ Running  2m44s  ready:1/1
      └──□ bluegreen-demo-745d7867df-8wpq8  Pod         ✔ Running  2m44s  ready:1/1

可以看到,现在nginx1.24和1.25.2各自有两个pod在运行,nginx1.24处于活动状态,nginx1.25.2处于preview状态,用户流量都在1.24上面。

service bluegreen-demo指向处于活动状态的ReplicaSet,service bluegreen-demo-preview指向处于preview状态的ReplicaSet。

可以通过service bluegreen-demo-preview对新版本的运行情况进行测试。

3. 把新的应用版本切换上线

如果新版本的测试没有问题,运行

kubectl argo rollouts promote bluegreen-demo

把nginx1.25.2切换到活动状态。

运行

kubectl argo rollouts get rollout bluegreen-demo

输出类似下面

Name:            bluegreen-demo
Namespace:       default
Status:          ✔ Healthy
Strategy:        BlueGreen
Images:          atomhub.openatom.cn/library/nginx:1.24
                 atomhub.openatom.cn/library/nginx:1.25.2 (stable, active)
Replicas:
  Desired:       2
  Current:       4
  Updated:       2
  Ready:         2
  Available:     2

NAME                                        KIND        STATUS     AGE    INFO
⟳ bluegreen-demo                            Rollout     ✔ Healthy  4m33s
├──# revision:2
│  └──⧉ bluegreen-demo-569b5fc765           ReplicaSet  ✔ Healthy  2m6s   stable,active
│     ├──□ bluegreen-demo-569b5fc765-6kgtl  Pod         ✔ Running  2m6s   ready:1/1
│     └──□ bluegreen-demo-569b5fc765-xw6j9  Pod         ✔ Running  2m6s   ready:1/1
└──# revision:1
   └──⧉ bluegreen-demo-745d7867df           ReplicaSet  ✔ Healthy  4m13s  delay:26s
      ├──□ bluegreen-demo-745d7867df-6fgjc  Pod         ✔ Running  4m13s  ready:1/1
      └──□ bluegreen-demo-745d7867df-8wpq8  Pod         ✔ Running  4m13s  ready:1/1

现在,nginx1.25.2已经变成了活动状态,用户流量切到了它的上面。service bluegreen-demo指向处于活动状态的ReplicaSet,也就是nginx1.25.2对应的pod。

接下来,如果运行正常,这个过程就结束了,蓝绿部署就此完成,nginx从1.24顺利升级到了1.25.2。

4. 回退到老版本

如果新版本运行出现问题,那么可以运行下列命令

kubectl argo rollouts undo bluegreen-demo

再把nginx1.24切回到活动状态,用户流量又回到了它的上面。

蓝绿部署比较简单,实施简便,切换快速,如果应用修改比较少,对新版本比较放心的话,蓝绿部署是比较适合的升级部署方式。

参考:

https://argo-rollouts.readthedocs.io/en/stable/installation

https://faun.pub/kubernetes-practice-automating-blue-green-deployment-with-argo-rollouts-2279aa890c53

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注