在项目迭代开发的过程中,对应用进行上线部署是不可避免的。项目的上线部署策略主要有以下三种:金丝雀升级、蓝绿升级和滚动升级。下面将重点介绍金丝雀升级策略以及在Kubernetes中如何实现它。视
频讲解如下:
https://www.bilibili.com/video/BV13aEK6nEZ9/?aid=116712028510...
金丝雀部署,也可以叫做灰度部署。它通过在项目部署升级过程中,先让部分用户继续使用旧版本,而另一部分用户开始使用新版本。如果新版本在升级过程中没有发生问题,那么逐步扩大新版本的用户使用范围,直到使用旧版本的用户都迁移到新的新版本上面来。通过使用金丝雀部署可以最大程度地保证系统整体的稳定性,并在部署升级过程的早期就可以发现和解决问题,以保证项目部署升级的进度。下图说明了金丝雀部署升级的过程。
下面通过一个具体的示例来演示如何实现应用的金丝雀部署升级。
(1)创建“canary-demo-v1.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”文件。
kubectl apply -f canary-demo-v1.yaml(3)获取Service的信息。
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。
curl 10.1.119.250:80
#输出的信息如下:
Host: canary-demo-v1-78b6cd78db-skjng, Version: v1.0.0
# 这里可以看出目前应用的版本是v1.0.0。(5)使用金丝雀来升级应用,创建“canary-demo-v2.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的变化。
kubectl get --watch deployment
kubectl get --watch pod(7)执行应用的升级。
kubectl apply -f canary-demo-v2.yaml(8)观察Deployment和Pod的变化,如下图所示。
从上图可以看出v1.0.0的版本共有10个实例;而v2.0.0的版本只有1个。
(9)执行下面的脚本来请求应用程序。
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个。
kubectl scale --replicas=5 deploy canary-demo-v2
kubectl scale --replicas=5 deploy canary-demo-v1(11)观察Deployment的变化,如下图所示。
kubectl get --watch deployment
(12)重新执行下面的脚本。
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个。
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)清理测试的数据。
kubectl delete all -l app=canary-demo
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。