33-服务版本的发布策略
一、升级/发布策略的分类
- 金丝雀发布:
又称为"灰度发布",其发布特点是新服务逐步替代旧服务。
在发布过程中,存在新版本和旧版本共存的特点。说白了,就是在升级过程中,新版本旧版本对外提供服务。
在升级过程中,可能存在版本升级失败的问题,可以快速回滚,仍用旧的版本提供服务。
- 蓝绿部署:
同时存在两套版本,新版本和旧版本只有一套环境对外提供服务。
在发布过程中,故障概率小,因为2套版本都经过测试,但同时只有一套环境对外提供服务,另一套环境空跑。
- A/B测试
相比于灰度发布而言,可以做到更加细粒度更新,比如基于用户类型,比如百分比等实现特定的升级。
二、k8s实现灰度发布
1.灰度发布实现流程
- 1.部署旧版本,副本数为3
- 2.部署svc暴露服务
- 3.部署新版本,副本数为1
- 4.新版本副本数量逐步变为3;
- 5.旧版本副本数量逐步变为0;
- 6.完成升级
2.实战案例
2.1 部署旧服务
[root@master231 update]# cat 01-deploy-old.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: xiuxian-v1
spec:
replicas: 3
selector:
matchLabels:
apps: xiuxian
template:
metadata:
labels:
apps: xiuxian
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1
name: c1
[root@master231 update]#
[root@master231 update]# cat 02-svc-xiuxian.yaml
apiVersion: v1
kind: Service
metadata:
name: svc-xiuxian
spec:
ports:
- port: 80
selector:
apps: xiuxian
type: NodePort
[root@master231 update]#
[root@master231 update]#
[root@master231 update]# kubectl apply -f 01-deploy-old.yaml -f 02-svc-xiuxian.yaml
deployment.apps/xiuxian-v1 created
service/svc-xiuxian created
[root@master231 update]#
[root@master231 update]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
xiuxian-v1-7c5f7d7ff-495w8 1/1 Running 0 4s 10.100.203.149 worker232 <none> <none>
xiuxian-v1-7c5f7d7ff-4smq7 1/1 Running 0 4s 10.100.140.114 worker233 <none> <none>
xiuxian-v1-7c5f7d7ff-qdnlc 1/1 Running 0 4s 10.100.140.109 worker233 <none> <none>
[root@master231 update]#
2.2 访问测试
[root@master231 update]# kubectl get svc svc-xiuxian
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
svc-xiuxian NodePort 10.200.231.215 <none> 80:7423/TCP 58s
[root@master231 update]#
[root@master231 update]# while true ;do curl 10.200.231.215;sleep 0.5; done
2.3 部署新版本
[root@master231 update]# cat 03-deploy-new.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: xiuxian-v2
spec:
replicas: 1
selector:
matchLabels:
apps: xiuxian
template:
metadata:
labels:
apps: xiuxian
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v2
name: c1
[root@master231 update]#
[root@master231 update]# kubectl apply -f 03-deploy-new.yaml
deployment.apps/xiuxian-v2 created
[root@master231 update]#
[root@master231 update]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
xiuxian-v1-7c5f7d7ff-495w8 1/1 Running 0 111s 10.100.203.149 worker232 <none> <none>
xiuxian-v1-7c5f7d7ff-4smq7 1/1 Running 0 111s 10.100.140.114 worker233 <none> <none>
xiuxian-v1-7c5f7d7ff-qdnlc 1/1 Running 0 111s 10.100.140.109 worker233 <none> <none>
xiuxian-v2-5d8c4d7d64-b8dwq 1/1 Running 0 14s 10.100.140.105 worker233 <none> <none>
[root@master231 update]#
2.4 将旧版本副本数量减少,将新版本副本数量增多
[root@master231 update]#
[root@master231 update]# kubectl scale deployment xiuxian-v1 --replicas=2
deployment.apps/xiuxian-v1 scaled
[root@master231 update]#
[root@master231 update]# kubectl scale deployment xiuxian-v2 --replicas=2
deployment.apps/xiuxian-v2 scaled
[root@master231 update]#
[root@master231 update]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
xiuxian-v1-7c5f7d7ff-495w8 1/1 Running 0 2m44s 10.100.203.149 worker232 <none> <none>
xiuxian-v1-7c5f7d7ff-4smq7 1/1 Running 0 2m44s 10.100.140.114 worker233 <none> <none>
xiuxian-v2-5d8c4d7d64-b8dwq 1/1 Running 0 67s 10.100.140.105 worker233 <none> <none>
xiuxian-v2-5d8c4d7d64-btldq 1/1 Running 0 2s 10.100.203.129 worker232 <none> <none>
[root@master231 update]#
[root@master231 update]# kubectl scale deployment xiuxian-v1 --replicas=1
deployment.apps/xiuxian-v1 scaled
[root@master231 update]#
[root@master231 update]# kubectl scale deployment xiuxian-v2 --replicas=3
deployment.apps/xiuxian-v2 scaled
[root@master231 update]#
[root@master231 update]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
xiuxian-v1-7c5f7d7ff-4smq7 1/1 Running 0 3m8s 10.100.140.114 worker233 <none> <none>
xiuxian-v2-5d8c4d7d64-b8dwq 1/1 Running 0 91s 10.100.140.105 worker233 <none> <none>
xiuxian-v2-5d8c4d7d64-btldq 1/1 Running 0 26s 10.100.203.129 worker232 <none> <none>
xiuxian-v2-5d8c4d7d64-vfzcw 1/1 Running 0 2s 10.100.140.106 worker233 <none> <none>
[root@master231 update]#
[root@master231 update]# kubectl scale deployment xiuxian-v1 --replicas=0
deployment.apps/xiuxian-v1 scaled
[root@master231 update]#
[root@master231 update]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
xiuxian-v2-5d8c4d7d64-b8dwq 1/1 Running 0 2m3s 10.100.140.105 worker233 <none> <none>
xiuxian-v2-5d8c4d7d64-btldq 1/1 Running 0 58s 10.100.203.129 worker232 <none> <none>
xiuxian-v2-5d8c4d7d64-vfzcw 1/1 Running 0 34s 10.100.140.106 worker233 <none> <none>
[root@master231 update]#
[root@master231 update]#
二、k8s实现蓝绿部署
1.蓝绿部署实现流程
- 1.部署旧版本,副本数为3
- 2.部署svc暴露服务指向旧版本的pod标签;
- 3.部署新版本,副本数为3
- 4.修改svc标签指向新版本
- 5.完成升级
2.实战案例
2.1 创建蓝版本
[root@master231 blue-green]# cat 01-deploy-blue.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: xiuxian-blue
spec:
replicas: 3
selector:
matchLabels:
apps: blue
template:
metadata:
labels:
apps: blue
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1
name: c1
[root@master231 blue-green]#
[root@master231 blue-green]# cat 02-svc-xiuxian.yaml
apiVersion: v1
kind: Service
metadata:
name: svc-xiuxian
spec:
clusterIP: 10.200.0.25
ports:
- port: 80
selector:
apps: blue
type: NodePort
[root@master231 blue-green]#
[root@master231 blue-green]# kubectl apply -f 01-deploy-blue.yaml -f 02-svc-xiuxian.yaml
deployment.apps/xiuxian-blue created
service/svc-xiuxian created
[root@master231 blue-green]#
2.2 访问测试
[root@master231 blue-green]# kubectl get svc svc-xiuxian
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
svc-xiuxian NodePort 10.200.0.25 <none> 80:43675/TCP 25s
[root@master231 blue-green]#
[root@master231 blue-green]# while true;do curl 10.200.0.25; sleep 0.1;done
2.3 部署绿版本
[root@master231 blue-green]# cat 03-deploy-green.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: xiuxian-green
spec:
replicas: 3
selector:
matchLabels:
apps: green
template:
metadata:
labels:
apps: green
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v2
name: c1
[root@master231 blue-green]#
[root@master231 blue-green]#
[root@master231 blue-green]# kubectl apply -f 03-deploy-green.yaml
deployment.apps/xiuxian-green created
[root@master231 blue-green]#
[root@master231 blue-green]#
[root@master231 blue-green]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
xiuxian-blue-6df4c5dfc-2lsn5 1/1 Running 0 99s 10.100.203.154 worker232 <none> <none>
xiuxian-blue-6df4c5dfc-fqqvt 1/1 Running 0 99s 10.100.140.115 worker233 <none> <none>
xiuxian-blue-6df4c5dfc-scm9s 1/1 Running 0 99s 10.100.140.113 worker233 <none> <none>
xiuxian-green-89ccc9dd9-s52bl 1/1 Running 0 3s 10.100.140.119 worker233 <none> <none>
xiuxian-green-89ccc9dd9-vtd9q 1/1 Running 0 3s 10.100.140.118 worker233 <none> <none>
xiuxian-green-89ccc9dd9-zgdj4 1/1 Running 0 3s 10.100.203.135 worker232 <none> <none>
[root@master231 blue-green]#
2.4 切换版本
[root@master231 blue-green]# cat 02-svc-xiuxian.yaml
apiVersion: v1
kind: Service
metadata:
name: svc-xiuxian
spec:
clusterIP: 10.200.0.25
ports:
- port: 80
selector:
# apps: blue
apps: green
type: NodePort
[root@master231 blue-green]#
[root@master231 blue-green]# kubectl apply -f 02-svc-xiuxian.yaml
service/svc-xiuxian configured
[root@master231 blue-green]#
[root@master231 blue-green]#
2.5 尝试回滚
三、deployment的滚动更新策略之Recreate
1.编写资源清单
[root@master231 update]# cat deploy-strategy-Recreate.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy-strategy
spec:
# 配置更新策略
strategy:
# 指定更新策略的类型,有效值: "Recreate","RollingUpdate"
# Recreate:
# 删除所有的旧的Pod,再重新创建新的Pod。
# RollingUpdate:
# 滚动更新,删除一部分Pod,更新一部分Pod,默认值就是滚动更新。
type: Recreate
replicas: 3
selector:
matchLabels:
apps: xiuxian
template:
metadata:
labels:
apps: xiuxian
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v11111
name: c1
imagePullPolicy: Always
2.测试样例
[root@master231 sts]# kubectl get pods -o wide -w
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
deploy-strategy-867ff4f-fvnvk 1/1 Running 0 14s 10.100.203.158 worker232 <none> <none>
deploy-strategy-867ff4f-lbzcj 1/1 Running 0 14s 10.100.140.121 worker233 <none> <none>
deploy-strategy-867ff4f-p96qs 1/1 Running 0 14s 10.100.140.123 worker233 <none> <none>
deploy-strategy-867ff4f-fvnvk 1/1 Terminating 0 30s 10.100.203.158 worker232 <none> <none>
deploy-strategy-867ff4f-lbzcj 1/1 Terminating 0 30s 10.100.140.121 worker233 <none> <none>
deploy-strategy-867ff4f-p96qs 1/1 Terminating 0 30s 10.100.140.123 worker233 <none> <none>
deploy-strategy-867ff4f-fvnvk 1/1 Terminating 0 30s 10.100.203.158 worker232 <none> <none>
deploy-strategy-867ff4f-lbzcj 1/1 Terminating 0 30s 10.100.140.121 worker233 <none> <none>
deploy-strategy-867ff4f-p96qs 1/1 Terminating 0 30s 10.100.140.123 worker233 <none> <none>
deploy-strategy-867ff4f-p96qs 0/1 Terminating 0 31s 10.100.140.123 worker233 <none> <none>
deploy-strategy-867ff4f-p96qs 0/1 Terminating 0 31s 10.100.140.123 worker233 <none> <none>
deploy-strategy-867ff4f-p96qs 0/1 Terminating 0 31s 10.100.140.123 worker233 <none> <none>
deploy-strategy-867ff4f-lbzcj 0/1 Terminating 0 31s 10.100.140.121 worker233 <none> <none>
deploy-strategy-867ff4f-lbzcj 0/1 Terminating 0 31s 10.100.140.121 worker233 <none> <none>
deploy-strategy-867ff4f-lbzcj 0/1 Terminating 0 31s 10.100.140.121 worker233 <none> <none>
deploy-strategy-867ff4f-fvnvk 0/1 Terminating 0 31s <none> worker232 <none> <none>
deploy-strategy-867ff4f-fvnvk 0/1 Terminating 0 31s <none> worker232 <none> <none>
deploy-strategy-867ff4f-fvnvk 0/1 Terminating 0 32s <none> worker232 <none> <none>
deploy-strategy-6777f5bc79-bdzbr 0/1 Pending 0 0s <none> <none> <none> <none>
deploy-strategy-6777f5bc79-bdzbr 0/1 Pending 0 0s <none> worker233 <none> <none>
deploy-strategy-6777f5bc79-jpf5h 0/1 Pending 0 0s <none> <none> <none> <none>
deploy-strategy-6777f5bc79-h6nwp 0/1 Pending 0 0s <none> <none> <none> <none>
deploy-strategy-6777f5bc79-jpf5h 0/1 Pending 0 0s <none> worker232 <none> <none>
deploy-strategy-6777f5bc79-bdzbr 0/1 ContainerCreating 0 0s <none> worker233 <none> <none>
deploy-strategy-6777f5bc79-jpf5h 0/1 ContainerCreating 0 0s <none> worker232 <none> <none>
deploy-strategy-6777f5bc79-h6nwp 0/1 Pending 0 0s <none> worker233 <none> <none>
deploy-strategy-6777f5bc79-h6nwp 0/1 ContainerCreating 0 0s <none> worker233 <none> <none>
deploy-strategy-6777f5bc79-h6nwp 0/1 ContainerCreating 0 0s <none> worker233 <none> <none>
deploy-strategy-6777f5bc79-bdzbr 0/1 ContainerCreating 0 1s <none> worker233 <none> <none>
deploy-strategy-6777f5bc79-h6nwp 1/1 Running 0 1s 10.100.140.117 worker233 <none> <none>
deploy-strategy-6777f5bc79-jpf5h 0/1 ContainerCreating 0 1s <none> worker232 <none> <none>
deploy-strategy-6777f5bc79-bdzbr 1/1 Running 0 2s 10.100.140.116 worker233 <none> <none>
deploy-strategy-6777f5bc79-jpf5h 1/1 Running 0 3s 10.100.203.159 worker232 <none> <none>
四、deployment的滚动更新策略之RollingUpdate
1.编写资源清单
[root@master231 update]# cat deploy-strategy-RollingUpdate.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy-strategy
spec:
strategy:
type: RollingUpdate
# 定义滚动更新的策略,前提是: 'type: RollingUpdate'
rollingUpdate:
# 在升级过程中,最大不可用的Pod数量或百分比,若不定义,则默认值为: 25%。
maxUnavailable: 1
# 在升级过程中,在原有Pod副本基础之上新增的Pod数量或百分比,若不定义,则默认值为: 25%。
maxSurge: 2
replicas: 5
selector:
matchLabels:
apps: xiuxian
template:
metadata:
labels:
apps: xiuxian
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v2
name: c1
imagePullPolicy: Always
[root@master231 update]#
[root@master231 update]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
deploy-strategy-6777f5bc79-bzkxk 1/1 Running 0 6m31s 10.100.140.125 worker233 <none> <none>
deploy-strategy-6777f5bc79-kb2gq 1/1 Running 0 6m31s 10.100.140.69 worker233 <none> <none>
deploy-strategy-6777f5bc79-lp6pj 1/1 Running 0 6m31s 10.100.203.161 worker232 <none> <none>
deploy-strategy-6777f5bc79-xv9pz 1/1 Running 0 6m29s 10.100.140.64 worker233 <none> <none>
deploy-strategy-6777f5bc79-z66w9 1/1 Running 0 6m29s 10.100.203.160 worker232 <none> <none>
[root@master231 update]#
[root@master231 update]#
2.测试验证
[root@master231 update]# kubectl apply -f deploy-strategy-RollingUpdate.yaml
deployment.apps/deploy-strategy configured
[root@master231 update]#
[root@master231 update]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
deploy-strategy-544d595886-ljjhf 0/1 ContainerCreating 0 1s <none> worker232 <none> <none>
deploy-strategy-544d595886-prk7p 0/1 ContainerCreating 0 1s <none> worker233 <none> <none>
deploy-strategy-544d595886-q89pd 0/1 ContainerCreating 0 1s <none> worker233 <none> <none>
deploy-strategy-6777f5bc79-kb2gq 1/1 Running 0 6m49s 10.100.140.69 worker233 <none> <none>
deploy-strategy-6777f5bc79-lp6pj 1/1 Running 0 6m49s 10.100.203.161 worker232 <none> <none>
deploy-strategy-6777f5bc79-xv9pz 1/1 Running 0 6m47s 10.100.140.64 worker233 <none> <none>
deploy-strategy-6777f5bc79-z66w9 1/1 Running 0 6m47s 10.100.203.160 worker232 <none> <none>
[root@master231 update]#
[root@master231 update]#
[root@master231 update]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
deploy-strategy-544d595886-k2tqz 1/1 Running 0 7s 10.100.203.167 worker232 <none> <none>
deploy-strategy-544d595886-ljjhf 1/1 Running 0 9s 10.100.203.165 worker232 <none> <none>
deploy-strategy-544d595886-prk7p 1/1 Running 0 9s 10.100.140.71 worker233 <none> <none>
deploy-strategy-544d595886-q89pd 1/1 Running 0 9s 10.100.140.70 worker233 <none> <none>
deploy-strategy-544d595886-wl6fr 1/1 Running 0 7s 10.100.140.74 worker233 <none> <none>
[root@master231 update]#
本文来自博客园,作者:丁志岩,转载请注明原文链接:https://www.cnblogs.com/dezyan/p/18888859

浙公网安备 33010602011771号