附032.Kubernetes實現藍綠髮布

藍綠髮布原理

藍綠髮布本質上是但願能優雅無誤的迭代應用,以便於使應用平穩提供服務。一般是不停老版本的同時對新版本進行先發布,而後確認無誤後進行流量切換,即並行部署。
Kubernetes中能夠經過deployment來部署一個藍髮布,而後經過控制service,來決定使用的版本。即經過label selector 將流量轉發至對應的版本。html

藍綠髮布實踐

構建環境

基礎Kubernetes環境

須要部署一個處於健壯狀態的Kubernetes,部署Kubernetes可參考
Kubernetes_v1.20.0高可用部署node

準備測試文件

root@master01:~/mystudy# mkdir -p /data/nginx/blue
root@master01:~/mystudy# mkdir -p /data/nginx/green

root@master01:~/mystudy# echo myblue > /data/nginx/blue/index.html
root@master01:~/mystudy# echo mygreen > /data/nginx/green/index.html

部署藍應用

建立Kubernetes deployment

root@master01:~/mystudy# cat mybluedp.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-blue-dp
  labels:
    dp: nginx-blue-dp
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-blue
  template:
    metadata:
      labels:
        app: nginx-blue
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
        volumeMounts:
        - mountPath: /usr/share/nginx/html/index.html
          name: nginx-pv-tpl
          readOnly: True

      volumes: 
      - name: nginx-pv-tpl
        hostPath: 
          path: /data/nginx/blue/index.html
          type: File
root@master01:~/mystudy# kubectl apply -f mybluedp.yaml

Kubernetes暴露藍應用

root@master01:~/mystudy# vim mysvc.yaml
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
  labels:
    svc: nginx-svc
spec:
  type: NodePort
  ports:
  - port: 80
    name: nginx-svc
    protocol: TCP
    targetPort: 80
    nodePort: 80
  selector:
    app: nginx-blue
root@master01:~/mystudy# kubectl apply -f mysvc.yaml

測試藍應用

[root@client ~]# curl -X GET http://172.16.10.31                #客戶端測試
myblue

[root@client ~]# while true; do curl -X GET http://172.16.10.31 ; done

部署綠應用

建立Kubernetes deployment

root@master01:~/mystudy# vim mygreendp.yaml   
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-green-dp
  labels:
    dp: nginx-green-dp
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-green
  template:
    metadata:
      labels:
        app: nginx-green
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
        volumeMounts:
        - mountPath: /usr/share/nginx/html/index.html
          name: nginx-pv-tpl
          readOnly: True

      volumes: 
      - name: nginx-pv-tpl
        hostPath: 
          path: /data/nginx/green/index.html
          type: File
root@master01:~/mystudy# kubectl apply -f mygreendp.yaml

藍綠切換

提示:部署綠應用後,若不進行流量切換,可保持藍應用對外服務,同時觀察綠應用是否部署運行正常。nginx

root@master01:~/mystudy# kubectl edit svc nginx-svc 
……
apiVersion: v1
kind: Service
……
spec: 
……
  selector:
    app: nginx-green 
……

提示:經過selector的標籤,將svc流量引向綠應用。vim

測試綠應用

[root@client ~]# curl -X GET http://172.16.10.31                      
mygreen
[root@client ~]# watch curl -X GET http://172.16.10.31

001

總結

在進行藍綠髮布的過程當中,對外服務一直處於可用狀態,綠版本部署成功以後,全部請求仍是藍應用,當流量切換後,馬上迭代至綠版本,若須要回滾只須要將流量切回藍應用便可。
一般建議對外成功發佈綠應用後,藍應用保持並行一段時間,而後根據業務狀況進行釋放。
同時,如上手動操做,可融合進相關開源devops項目中,從而實現自動化,也可以使用相關廠商現有產品,若阿里云云效、開源的CODING等。api

相關文章
相關標籤/搜索