《Deployment 控制器》系列,共包含以下几篇文章:
- Deployment 控制器
- Deployment 的创建和使用(实战)
- Deployment 的状态
- Deployment 的清理策略及编写规则
- 应用的部署(一):金丝雀部署
- 应用的部署(二):蓝绿部署 & 滚动部署
😊 如果您觉得这篇文章有用 ✔️ 的话,请给博主一个一键三连 🚀🚀🚀 吧 (点赞 🧡、关注 💛、收藏 💚)!!!您的支持 💖💖💖 将激励 🔥 博主输出更多优质内容!!!
应用的部署(一):金丝雀部署
在项目迭代开发过程中,经常需要对应用进行上线部署。上线部署策略主要有 3 种:金丝雀部署、蓝绿部署 和 滚动部署。
金丝雀部署 也被叫作 灰度部署。金丝雀部署过程:先让一部分用户继续使用旧版本,而另一部分用户开始使用新版本;如果新版本没有发生问题,则逐步扩大新版本的使用范围直到使用旧版本的用户都使用新版本。
通过使用金丝雀部署,可以最大限度地保证系统的整体稳定性,并能够在部署的早期就发现和解决问题。下面通过示例来演示金丝雀部署升级。
创建 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
使用以下命令应用 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-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
开启两个命令行窗口,使用 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}
do
sleep 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}
do
sleep 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