蓝绿部署
在旧版本资源运行的同时直接创建一个全副副本的新版本,待所有新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 ~]#
浙公网安备 33010602011771号