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]# 
posted @ 2025-05-21 13:23  丁志岩  阅读(18)  评论(0)    收藏  举报