应用的部署(一):金丝雀部署
在项目迭代开发过程中,经常需要对应用进行上线部署。上线部署策略主要有 3 种:金丝雀部署、蓝绿部署 和 滚动部署。
金丝雀部署 也被叫作 灰度部署。金丝雀部署过程:先让一部分用户继续使用旧版本,而另一部分用户开始使用新版本;如果新版本没有发生问题,则逐步扩大新版本的使用范围直到使用旧版本的用户都使用新版本。
通过使用金丝雀部署,可以最大限度地保证系统的整体稳定性,并能够在部署的早期就发现和解决问题。下面通过示例来演示金丝雀部署升级。
创建 canary-demo-v1.yaml
文件,并在其中输入以下内容:
apiVersion: v1
kind: Service
metadata:name: canary-demolabels:app: canary-demo
spec:type: NodePortports:- name: httpport: 80targetPort: httpselector:app: canary-demo
---
apiVersion: apps/v1
kind: Deployment
metadata:name: canary-demo-v1labels:app: canary-demo
spec:replicas: 10selector:matchLabels:app: canary-demoversion: v1.0.0template:metadata:labels:app: canary-demoversion: v1.0.0spec:containers:- name: canary-demoimage: collenzhao/k8s-deployment-strategiesports:- name: httpcontainerPort: 8080env:- name: VERSIONvalue: v1.0.0
使用以下命令应用 canary-demo-v1.yaml
文件。
kubectl apply -f canary-demo-v1.yaml
获取 Service(服务)的信息。
kubectl get service canary-demo
输出的信息如下:
通过 Service(服务)访问 Deployment。
curl 10.106.132.94:80
输出的信息如下:
可以看出,目前应用的版本是 v1.0.0
。
使用金丝雀部署来升级应用,创建 canary-demo-v2.yaml
文件并在其中输入以下内容:
apiVersion: apps/v1
kind: Deployment
metadata:name: canary-demo-v2labels:app: canary-demo
spec:replicas: 1selector:matchLabels:app: canary-demoversion: v2.0.0template:metadata:labels:app: canary-demoversion: v2.0.0spec:containers:- name: canary-demoimage: collenzhao/k8s-deployment-strategiesports:- name: httpcontainerPort: 8080env:- name: VERSIONvalue: v2.0.0
开启两个命令行窗口,使用 watch
命令来分别监控 Deployment 和 Pod 的变化。
kubectl get --watch deployment
kubectl get --watch pod
执行应用的升级。
kubectl apply -f canary-demo-v2.yaml
观察 Deployment 和 Pod 的变化。
可以看到,v1.0.0
版本共有 10 10 10 个实例,而 v2.0.0
版本只有 1 1 1 个实例。
执行以下脚本请求应用。
for a in {1..11}dosleep 1;curl "10.106.132.94:80";done
🚀
for
循环一共循环了 11 11 11 次,其中, 10 10 10 次访问的是v1.0.0
版本;只有 1 1 1 次访问的是v2.0.0
版本。
将 v2.0.0
版本的实例扩到 5 个,将 v1.0.0
版本的实例缩到 5 个。
kubectl scale --replicas=5 deploy canary-demo-v2
kubectl scale --replicas=5 deploy canary-demo-v1
观察 Deployment 的变化。
kubectl get --watch deployment
重新执行以下脚本。
for a in {1..10}dosleep 1;curl "10.106.132.94:80";done
输出的信息如下:
停止 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
循环,则所有请求的返回信息如下。
清理测试的数据。
kubectl delete all -l app=canary-demo