《Deployment 控制器》系列,共包含以下几篇文章:
- Deployment 控制器
- Deployment 的创建和使用(实战)
- Deployment 的状态
- Deployment 的清理策略及编写规则
- 应用的部署(一):金丝雀部署
- 应用的部署(二):蓝绿部署 & 滚动部署
😊 如果您觉得这篇文章有用 ✔️ 的话,请给博主一个一键三连 🚀🚀🚀 吧 (点赞 🧡、关注 💛、收藏 💚)!!!您的支持 💖💖💖 将激励 🔥 博主输出更多优质内容!!!
1.蓝绿部署
蓝绿部署:同时部署旧版本和新版本(旧版本 被叫作 蓝色版本,新版本 被叫作 绿色版本);在绿色版本中对应用进行测试,待测试完全通过后,将应用从蓝色版本路由到绿色版本,然后将绿色版本变成新的生产环境。
🚀 蓝绿部署可以在线进行,具有较小的风险,但是会对用户的体验有影响。另外,蓝绿部署由于同时部署了新旧两套版本,所以需要双倍的资源。
创建 blue-green-demo-v1.yaml
文件,并在其中输入以下内容。
apiVersion: v1
kind: Service
metadata:
name: blue-green-demo
labels:
app: blue-green-demo
spec:
type: NodePort
ports:
- name: http
port: 80
targetPort: http
selector:
app: blue-green-demo
version: v1.0.0
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: blue-green-demo-v1
labels:
app: blue-green-demo
spec:
replicas: 3
selector:
matchLabels:
app: blue-green-demo
version: v1.0.0
template:
metadata:
labels:
app: blue-green-demo
version: v1.0.0
spec:
containers:
- name: blue-green-demo
image: collenzhao/k8s-deployment-strategies
ports:
- name: http
containerPort: 8080
env:
- name: VERSION
value: v1.0.0
部署应用的 v1.0.0
版本。
kubectl apply -f blue-green-demo-v1.yaml
查看创建的 Pod。
kubectl get pod
查看创建的 Service(服务)。
kubectl get service
输出的信息如下:
执行以下脚本请求应用。
for a in {1..3}
do
sleep 1;
curl "10.108.180.158:80";
done
这时所有的请求将访问 v1.0.0
版本,输出的信息如下:
创建 blue-green-demo-v2.yaml
文件,并在其中输入以下内容。
apiVersion: apps/v1
kind: Deployment
metadata:
name: blue-green-demo-v2
labels:
app: blue-green-demo
spec:
replicas: 3
selector:
matchLabels:
app: blue-green-demo
version: v2.0.0
template:
metadata:
labels:
app: blue-green-demo
version: v2.0.0
spec:
containers:
- name: blue-green-demo
image: collenzhao/k8s-deployment-strategies
ports:
- name: http
containerPort: 8080
env:
- name: VERSION
value: v2.0.0
将应用升级到 v2.0.0
版本。
kubectl apply -f blue-green-demo-v2.yaml
查看 Pod 的信息。
kubectl get pod
输出的信息如下:
🚀 这里可以看到前 3 3 3 个 Pod 是
v1.0.0
版本,而后 3 3 3 个 Pod 是v2.0.0
版本。
将 Service(服务)全部切换到 v2.0.0
版本。
kubectl patch service blue-green-demo \
-p '{"spec": {"selector": {"version":"v2.0.0"}}}'
重新执行以下脚本请求应用。
for a in {1..3}
do
sleep 1;
curl "10.1.88.3:80";
done
这时所有的请求将访问 v2.0.0
版本,输出的信息如下:
删除应用的 v1.0.0
版本。
kubectl delete deploy blue-green-demo-v1
2.滚动部署
滚动部署:先将新版本部署到集群中的一台或几台服务器上,在更新版本后将这些服务器重新投入使用;循环这个过程,直到集群中的所有服务器都更新成新版本。
相对于蓝绿部署,这种部署方式更加节约资源。下面来演示如何实现应用的滚动部署升级。
创建 rolling-update-demo-v1.yaml
文件,并在其中输入以下内容。
apiVersion: v1
kind: Service
metadata:
name: rolling-update-demo
labels:
app: rolling-update-demo
spec:
type: NodePort
ports:
- name: http
port: 80
targetPort: http
selector:
app: rolling-update-demo
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: rolling-update-demo
labels:
app: rolling-update-demo
spec:
replicas: 3
selector:
matchLabels:
app: rolling-update-demo
template:
metadata:
labels:
app: rolling-update-demo
version: v1.0.0
spec:
containers:
- name: rolling-update-demo
image: collenzhao/k8s-deployment-strategies
ports:
- name: http
containerPort: 8080
env:
- name: VERSION
value: v1.0.0
部署应用的 v1.0.0
版本。
kubectl apply -f rolling-update-demo-v1.yaml
使用 watch
命令监控 Pod 的变化.
kubectl get --watch pod
创建 rolling-update-demo-v2.yaml
文件,并在其中输入以下内容。
apiVersion: apps/v1
kind: Deployment
metadata:
name: rolling-update-demo
labels:
app: rolling-update-demo
spec:
replicas: 3
selector:
matchLabels:
app: rolling-update-demo
template:
metadata:
labels:
app: rolling-update-demo
version: v2.0.0
spec:
containers:
- name: rolling-update-demo
image: collenzhao/k8s-deployment-strategies
ports:
- name: http
containerPort: 8080
env:
- name: VERSION
value: v2.0.0
将应用升级到 v2.0.0
版本。
kubectl apply -f rolling-update-demo-v2.yaml
这时会发现 v1.0.0
版本的 Pod 正在逐步被替换成 v2.0.0
版本的 Pod。