
在正式生产环境中,新的应用版本的升级,是一件需要加倍小心的事情。
因为在升级的同时,有很多用户正在使用你的应用,进行版本升级,必须要考虑业务的连续性和平滑性,尽量减少对业务的影响。
万一升级出现问题,还要能够快速回退到原来的稳定版本,让系统能够保持平稳运行。
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切回到活动状态,用户流量又回到了它的上面。
蓝绿部署比较简单,实施简便,切换快速,如果应用修改比较少,对新版本比较放心的话,蓝绿部署是比较适合的升级部署方式。
参考: