蓝绿部署

在旧版本资源运行的同时直接创建一个全副副本的新版本,待所有新pod资源就绪后一次性地直接将客户端流量全部迁移到新版本上。

[root@k8s-master01 ~]# kubectl create namespace lanlv
namespace/lanlv created
[root@k8s-master01 ~]# cat /yaml/lanlv-blue-green.yaml 
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: rs-${DEPLOY}
  namespace: lanlv
spec:
  minReadySeconds: 3
  replicas: 3
  selector:
    matchLabels:
      app: demoapp
      ctr: rs-${DEPLOY}
      version: ${VERSION}
  template:
    metadata:
      labels:
        app: demoapp
        ctr: rs-${DEPLOY}
        version: ${VERSION}
    spec:
      containers:
      - name: demoapp
        image: ikubernetes/demoapp:${VERSION}
        ports:
        - name: http
          containerPort: 80
        livenessProbe:
          httpGet:
            path: '/livez'
            port: 80
          initialDelaySeconds: 5
        readinessProbe:
          httpGet:
            path: '/readyz'
            port: 80
          initialDelaySeconds: 15

上面配置清单通过环境变量方式定义了一个可以复用的replicaset资源规范,其中DEPLOY代表部署类型blue和green,而VERSION代表demoapp版本号。

[root@k8s-master01 ~]# vim /yaml/service-blue-green.yaml
[root@k8s-master01 ~]# cat /yaml/service-blue-green.yaml 
apiVersion: v1
kind: Service
metadata:
  name: demoapp
  namespace: lanlv
spec:
  type: ClusterIP
  selector:
    app: demoapp
    ctr: rs-${DEPLOY}
    version: ${VERSION}
  ports:
  - name: http
    port: 8080
    protocol: TCP
    targetPort: 8080

老版本名称为rs-blue,使用v1.0镜像

新版本名称为rs-green,使用v1.1镜像

下面创建老版本

[root@k8s-master01 ~]# DEPLOY='blue' VERSION='v1.0' envsubst < /yaml/lanlv-blue-green.yaml  | kubectl apply -f - -n lanlv
replicaset.apps/rs-blue created

[root@k8s-master01 ~]# DEPLOY='blue' VERSION='v1.0' envsubst < /yaml/service-blue-green.yaml  | kubectl apply -f - -n lanlv
service/demoapp created

状态如下:

[root@k8s-master01 ~]# kubectl get pods -n lanlv -o wide --show-labels
NAME            READY   STATUS    RESTARTS   AGE   IP            NODE         NOMINATED NODE   READINESS GATES   LABELS
rs-blue-45fx9   0/1     Running   1          91s   10.244.2.40   k8s-node01   <none>           <none>            app=demoapp,ctr=rs-blue,version=v1.0
rs-blue-4mjx8   1/1     Running   0          91s   10.244.3.44   k8s-node03   <none>           <none>            app=demoapp,ctr=rs-blue,version=v1.0
rs-blue-bj4jb   0/1     Running   1          91s   10.244.1.49   k8s-node02   <none>           <none>            app=demoapp,ctr=rs-blue,version=v1.0
[root@k8s-master01 ~]# kubectl get pods -n lanlv -o wide --show-labels
NAME            READY   STATUS    RESTARTS   AGE    IP            NODE         NOMINATED NODE   READINESS GATES   LABELS
rs-blue-45fx9   1/1     Running   1          2m1s   10.244.2.40   k8s-node01   <none>           <none>            app=demoapp,ctr=rs-blue,version=v1.0
rs-blue-4mjx8   1/1     Running   0          2m1s   10.244.3.44   k8s-node03   <none>           <none>            app=demoapp,ctr=rs-blue,version=v1.0
rs-blue-bj4jb   0/1     Running   2          2m1s   10.244.1.49   k8s-node02   <none>           <none>            app=demoapp,ctr=rs-blue,version=v1.0
[root@k8s-master01 ~]# 

 


[root@k8s-master01 ~]# DEPLOY='green' VERSION='v1.1' envsubst < /yaml/lanlv-blue-green.yaml  | kubectl apply -f - -n lanlv
replicaset.apps/rs-green created
[root@k8s-master01 ~]# kubectl get pods -n lanlv -o wide --show-labels
NAME                 READY   STATUS    RESTARTS   AGE     IP            NODE         NOMINATED NODE   READINESS GATES   LABELS
pod/rs-blue-45fx9    1/1     Running   7          5h19m   10.244.2.40   k8s-node01   <none>           <none>            app=demoapp,ctr=rs-blue,version=v1.0
pod/rs-blue-4mjx8    1/1     Running   0          5h19m   10.244.3.44   k8s-node03   <none>           <none>            app=demoapp,ctr=rs-blue,version=v1.0
pod/rs-blue-kdflb    1/1     Running   0          4h40m   10.244.1.52   k8s-node02   <none>           <none>            app=demoapp,ctr=rs-blue,version=v1.0
pod/rs-green-dd7h2   0/1     Running   0          30s     10.244.3.45   k8s-node03   <none>           <none>            app=demoapp,ctr=rs-green,version=v1.1
pod/rs-green-dlgxw   0/1     Running   0          30s     10.244.2.43   k8s-node01   <none>           <none>            app=demoapp,ctr=rs-green,version=v1.1
pod/rs-green-t6x5t   0/1     Running   0          30s     10.244.1.53   k8s-node02   <none>           <none>            app=demoapp,ctr=rs-green,version=v1.1

新版本还没有准备就绪,等到准备就绪之后,将service对象标签选择器修改为v1.1版本
[root@k8s-master01 ~]# DEPLOY='green' VERSION='v1.1' envsubst < /yaml/service-blue-green.yaml  | kubectl apply -f - -n lanlv
service/demoapp configured

再次查看

[root@k8s-master01 ~]# kubectl get pods,service -n lanlv -o wide --show-labels
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES LABELS
pod/rs-blue-45fx9 1/1 Running 7 5h23m 10.244.2.40 k8s-node01 <none> <none> app=demoapp,ctr=rs-blue,version=v1.0
pod/rs-blue-4mjx8 1/1 Running 0 5h23m 10.244.3.44 k8s-node03 <none> <none> app=demoapp,ctr=rs-blue,version=v1.0
pod/rs-blue-kdflb 1/1 Running 0 4h44m 10.244.1.52 k8s-node02 <none> <none> app=demoapp,ctr=rs-blue,version=v1.0
pod/rs-green-dd7h2 1/1 Running 0 4m49s 10.244.3.45 k8s-node03 <none> <none> app=demoapp,ctr=rs-green,version=v1.1
pod/rs-green-dlgxw 1/1 Running 0 4m49s 10.244.2.43 k8s-node01 <none> <none> app=demoapp,ctr=rs-green,version=v1.1
pod/rs-green-t6x5t 1/1 Running 0 4m49s 10.244.1.53 k8s-node02 <none> <none> app=demoapp,ctr=rs-green,version=v1.1


NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR LABELS
service/demoapp ClusterIP 10.110.248.68 <none> 80/TCP 5h3m app=demoapp,ctr=rs-green,version=v1.1 <none>



由上可以看到,2个版本同时存在。

 

最后将blue版本的pod的、副本数量改为0即可

[root@k8s-master01 ~]# kubectl scale replicaset/rs-blue -n lanlv --replicas=0
replicaset.apps/rs-blue scaled
[root@k8s-master01 ~]# kubectl get pods,service -n lanlv -o wide --show-labels
NAME                 READY   STATUS        RESTARTS   AGE     IP            NODE         NOMINATED NODE   READINESS GATES   LABELS
pod/rs-blue-45fx9    1/1     Terminating   7          5h27m   10.244.2.40   k8s-node01   <none>           <none>            app=demoapp,ctr=rs-blue,version=v1.0
pod/rs-blue-4mjx8    1/1     Terminating   0          5h27m   10.244.3.44   k8s-node03   <none>           <none>            app=demoapp,ctr=rs-blue,version=v1.0
pod/rs-blue-kdflb    1/1     Terminating   0          4h49m   10.244.1.52   k8s-node02   <none>           <none>            app=demoapp,ctr=rs-blue,version=v1.0
pod/rs-green-dd7h2   1/1     Running       0          9m9s    10.244.3.45   k8s-node03   <none>           <none>            app=demoapp,ctr=rs-green,version=v1.1
pod/rs-green-dlgxw   1/1     Running       0          9m9s    10.244.2.43   k8s-node01   <none>           <none>            app=demoapp,ctr=rs-green,version=v1.1
pod/rs-green-t6x5t   1/1     Running       0          9m9s    10.244.1.53   k8s-node02   <none>           <none>            app=demoapp,ctr=rs-green,version=v1.1

NAME              TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE    SELECTOR                                LABELS
service/demoapp   ClusterIP   10.110.248.68   <none>        80/TCP    5h7m   app=demoapp,ctr=rs-green,version=v1.1   <none>
[root@k8s-master01 ~]# kubectl get pods,service -n lanlv -o wide --show-labels
NAME                 READY   STATUS        RESTARTS   AGE     IP            NODE         NOMINATED NODE   READINESS GATES   LABELS
pod/rs-blue-45fx9    1/1     Terminating   7          5h28m   10.244.2.40   k8s-node01   <none>           <none>            app=demoapp,ctr=rs-blue,version=v1.0
pod/rs-blue-4mjx8    1/1     Terminating   0          5h28m   10.244.3.44   k8s-node03   <none>           <none>            app=demoapp,ctr=rs-blue,version=v1.0
pod/rs-blue-kdflb    1/1     Terminating   0          4h49m   10.244.1.52   k8s-node02   <none>           <none>            app=demoapp,ctr=rs-blue,version=v1.0
pod/rs-green-dd7h2   1/1     Running       0          9m29s   10.244.3.45   k8s-node03   <none>           <none>            app=demoapp,ctr=rs-green,version=v1.1
pod/rs-green-dlgxw   1/1     Running       0          9m29s   10.244.2.43   k8s-node01   <none>           <none>            app=demoapp,ctr=rs-green,version=v1.1
pod/rs-green-t6x5t   1/1     Running       0          9m29s   10.244.1.53   k8s-node02   <none>           <none>            app=demoapp,ctr=rs-green,version=v1.1

NAME              TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE    SELECTOR                                LABELS
service/demoapp   ClusterIP   10.110.248.68   <none>        80/TCP    5h8m   app=demoapp,ctr=rs-green,version=v1.1   <none>
[root@k8s-master01 ~]# kubectl get pods,service -n lanlv -o wide --show-labels
NAME                 READY   STATUS    RESTARTS   AGE     IP            NODE         NOMINATED NODE   READINESS GATES   LABELS
pod/rs-green-dd7h2   1/1     Running   0          9m45s   10.244.3.45   k8s-node03   <none>           <none>            app=demoapp,ctr=rs-green,version=v1.1
pod/rs-green-dlgxw   1/1     Running   0          9m45s   10.244.2.43   k8s-node01   <none>           <none>            app=demoapp,ctr=rs-green,version=v1.1
pod/rs-green-t6x5t   1/1     Running   0          9m45s   10.244.1.53   k8s-node02   <none>           <none>            app=demoapp,ctr=rs-green,version=v1.1

NAME              TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE    SELECTOR                                LABELS
service/demoapp   ClusterIP   10.110.248.68   <none>        80/TCP    5h8m   app=demoapp,ctr=rs-green,version=v1.1   <none>
[root@k8s-master01 ~]# 

 

posted @ 2021-08-29 01:47  拥抱大海,面向天空  阅读(64)  评论(0)    收藏  举报