
在项目迭代开发的过程中,对应用进行上线部署是不可避免的。项目的上线部署策略主要有以下三种:金丝雀升级、蓝绿升级和滚动升级。下面将重点介绍金丝雀升级策略以及在Kubernetes中如何实现它。
| 视频讲解如下 |
|---|
| 【赵渝强老师】Kubernetes中的金丝雀升级 |
金丝雀部署,也可以叫做灰度部署。它通过在项目部署升级过程中,先让部分用户继续使用旧版本,而另一部分用户开始使用新版本。如果新版本在升级过程中没有发生问题,那么逐步扩大新版本的用户使用范围,直到使用旧版本的用户都迁移到新的新版本上面来。通过使用金丝雀部署可以最大程度地保证系统整体的稳定性,并在部署升级过程的早期就可以发现和解决问题,以保证项目部署升级的进度。下图说明了金丝雀部署升级的过程。

下面通过一个具体的示例来演示如何实现应用的金丝雀部署升级。
(1)创建"canary-demo-v1.yaml"文件,并输入下面的内容。
yaml
apiVersion: v1
kind: Service
metadata:
name: canary-demo
labels:
app: canary-demo
spec:
type: NodePort
ports:
- name: http
port: 80
targetPort: http
selector:
app: canary-demo
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: canary-demo-v1
labels:
app: canary-demo
spec:
replicas: 10
selector:
matchLabels:
app: canary-demo
version: v1.0.0
template:
metadata:
labels:
app: canary-demo
version: v1.0.0
spec:
containers:
- name: canary-demo
image: collenzhao/k8s-deployment-strategies
ports:
- name: http
containerPort: 8080
env:
- name: VERSION
value: v1.0.0
# 这里使用了Service的服务来实现Deployment的负载均衡。
(2)使用命令应用"canary-demo-v1.yaml"文件。
powershell
kubectl apply -f canary-demo-v1.yaml
(3)获取Service的信息。
powershell
kubectl get service canary-demo
# 输出的信息如下:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
canary-demo NodePort 10.1.119.250 <none> 80:30952/TCP 4s
(4)通过Service访问Deployment。
powershell
curl 10.1.119.250:80
#输出的信息如下:
Host: canary-demo-v1-78b6cd78db-skjng, Version: v1.0.0
# 这里可以看出目前应用的版本是v1.0.0。

(5)使用金丝雀来升级应用,创建"canary-demo-v2.yaml"文件并输入下面的内容:
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: canary-demo-v2
labels:
app: canary-demo
spec:
replicas: 1
selector:
matchLabels:
app: canary-demo
version: v2.0.0
template:
metadata:
labels:
app: canary-demo
version: v2.0.0
spec:
containers:
- name: canary-demo
image: collenzhao/k8s-deployment-strategies
ports:
- name: http
containerPort: 8080
env:
- name: VERSION
value: v2.0.0
(6)单开启两个命令行窗口使用"watch"命令来监控Deployment和Pod的变化。
powershell
kubectl get --watch deployment
kubectl get --watch pod
(7)执行应用的升级。
powershell
kubectl apply -f canary-demo-v2.yaml
(8)观察Deployment和Pod的变化,如下图所示。

从上图可以看出v1.0.0的版本共有10个实例;而v2.0.0的版本只有1个。
(9)执行下面的脚本来请求应用程序。
powershell
for a in {1..11}
do
sleep 1;
curl "10.1.119.250:80";
done
# 输出的信息如下:
Host: canary-demo-v1-78b6cd78db-nbbjx, Version: v1.0.0
Host: canary-demo-v1-78b6cd78db-nbbjx, Version: v1.0.0
Host: canary-demo-v1-78b6cd78db-67cg5, Version: v1.0.0
Host: canary-demo-v1-78b6cd78db-gd9kf, Version: v1.0.0
Host: canary-demo-v1-78b6cd78db-7zjwf, Version: v1.0.0
Host: canary-demo-v1-78b6cd78db-gd9kf, Version: v1.0.0
Host: canary-demo-v1-78b6cd78db-dskpc, Version: v1.0.0
Host: canary-demo-v1-78b6cd78db-gd9kf, Version: v1.0.0
Host: canary-demo-v1-78b6cd78db-67cg5, Version: v1.0.0
Host: canary-demo-v1-78b6cd78db-fdrwp, Version: v1.0.0
Host: canary-demo-v2-7c4c5f5444-g69jr, Version: v2.0.0
# 提示:for循环中一共循环了11次,其中:10次访问了v1.0.0的版本;
# 而只有1次访问了v2.0.0的版本。
(10)将v2.0.0版本的实例扩容到5个,v1.0.0版本的实例缩容到5个。
powershell
kubectl scale --replicas=5 deploy canary-demo-v2
kubectl scale --replicas=5 deploy canary-demo-v1
(11)观察Deployment的变化,如下图所示。
powershell
kubectl get --watch deployment

(12)重新执行下面的脚本。
powershell
for a in {1..10}
do
sleep 1;
curl "10.1.119.250:80";
done
# 输出的信息如下:
Host: canary-demo-v1-78b6cd78db-67cg5, Version: v1.0.0
Host: canary-demo-v1-78b6cd78db-9dphd, Version: v1.0.0
Host: canary-demo-v2-7c4c5f5444-lcbhw, Version: v2.0.0
Host: canary-demo-v1-78b6cd78db-hr9x8, Version: v1.0.0
Host: canary-demo-v1-78b6cd78db-7zjwf, Version: v1.0.0
Host: canary-demo-v2-7c4c5f5444-lcbhw, Version: v2.0.0
Host: canary-demo-v1-78b6cd78db-fdrwp, Version: v1.0.0
Host: canary-demo-v2-7c4c5f5444-9hbwr, Version: v2.0.0
Host: canary-demo-v2-7c4c5f5444-9hbwr, Version: v2.0.0
Host: canary-demo-v1-78b6cd78db-hr9x8, Version: v1.0.0
(12)停止v1.0.0的版本,并把v2.0.0版本的实例扩容到10个。
powershell
kubectl delete deployment.apps/canary-demo-v1
kubectl scale --replicas=10 deploy canary-demo-v2
# 提示:这时候应用将全部升级到v2.0.0的版本。
# 如果再次执行for循环的脚本,所有请求都将返回下面的信息。
Host: canary-demo-v2-7c4c5f5444-g69jr, Version: v2.0.0
Host: canary-demo-v2-7c4c5f5444-lcbhw, Version: v2.0.0
Host: canary-demo-v2-7c4c5f5444-hs4k2, Version: v2.0.0
Host: canary-demo-v2-7c4c5f5444-lcbhw, Version: v2.0.0
Host: canary-demo-v2-7c4c5f5444-hs4k2, Version: v2.0.0
Host: canary-demo-v2-7c4c5f5444-g69jr, Version: v2.0.0
Host: canary-demo-v2-7c4c5f5444-9hbwr, Version: v2.0.0
Host: canary-demo-v2-7c4c5f5444-5h5sm, Version: v2.0.0
Host: canary-demo-v2-7c4c5f5444-g69jr, Version: v2.0.0
Host: canary-demo-v2-7c4c5f5444-5h5sm, Version: v2.0.0

(13)清理测试的数据。
powershell
kubectl delete all -l app=canary-demo