Kubernetes常見的部署方案(十四)

童話述說我的結局發表於2022-01-29

一、常見的部署方案

  • 滾動更新

 

    • 服務不會停止,但是整個pod會有新舊並存的情況。
  • 重新建立
    • 先停止舊的pod,然後再建立新的pod,這個過程服務是會間斷的。
  • 藍綠 (無需停機,風險較小)
    • 部署v1的應用(一開始的狀態)所有外部請求的流量都打到這個版本上
    • 部署版本2的應用版本2的程式碼與版本1不同(新功能、Bug修復等)
    • 將流量從版本1切換到版本2。 
    • 如版本2測試正常,就刪除版本1正在使用的資源(例如例項),從此正式用版本2。
  • 金絲雀 

 

 

1.1 、滾動更新 

  • maxSurge :滾動升級時先啟動的pod數量 
  • maxUnavailable :滾動升級時允許的最大unavailable的pod數量 
(1)建立檔案rollingupdate.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: rollingupdate
spec:
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  selector:
    matchLabels:
      app: rollingupdate
  replicas: 4
  template:
    metadata:
      labels:
        app: rollingupdate
    spec:
      containers:
      - name: rollingupdate
        image: registry.cn-hangzhou.aliyuncs.com/ghy/test-docker-image:v1.0
        ports:
        - containerPort: 8080  
---
apiVersion: v1
kind: Service
metadata:
  name: rollingupdate
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 8080
  selector:
    app: rollingupdate
  type: ClusterIP

(2)執行指令碼

kubectl apply -f rollingupdate.yaml

(3)檢視pods

kubectl get pods

(4) 檢視svc

kubectl get svc

(5) 上面成功後就可以直接通過ip進行訪問pod對應的服務的

curl cluster-ip/dockerfile

(6) 前面如果都成功了,那下面要做的事就是實現滾動更新動作了,先修改rollingupdate.yaml檔案,將映象修改成v2.0 然後儲存檔案

(7)在w1上,不斷地訪問觀察輸出 

while sleep 0.2;do curl cluster-ip/dockerfile;echo "";done

(8)在w2上,監控pod

kubectl get pods -w

(7)執行apply操作讓檔案重新生效變成2.0版本

kubectl apply -f rollingupdate.yaml

(8)執行下面命令會發現有新老版本的替換的過程

kubectl get pods

1.2、 重新建立

如果我們需求不希望新老版本共存,希望老版本全停後再上新版本就要用到這方法了
(1)編寫recreate.yaml 檔案
apiVersion: apps/v1
kind: Deployment
metadata:
  name: recreate
spec:
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app: recreate
  replicas: 4
  template:
    metadata:
      labels:
        app: recreate
    spec:
      containers:
      - name: recreate
        image: registry.cn-hangzhou.aliyuncs.com/ghy/test-docker-image:v1.0
        ports:
        - containerPort: 8080
        livenessProbe:
          tcpSocket:
            port: 8080

(2)執行指令碼

kubectl apply -f rollingupdate.yaml

(3)檢視pods

kubectl get pods

(4)和前面一樣修改recreate.yaml檔案的版本號

kubectl apply -f recreate.yaml

(5)檢視pod

kubectl get pods

(6)執行apply操作讓檔案重新生效變成2.0版本

kubectl apply -f rollingupdate.yaml

(7)執行下面命令會發現老版本停止後再啟動新版本

kubectl get pods

1.3 、藍綠 

藍綠部署呢其實就是一個標飾,標記一個藍色一個綠色,版本切換通過藍和綠進行宣告;
(1)建立一個bluegreen.yaml 
#deploy
apiVersion: apps/v1
kind: Deployment
metadata:
  name: blue
spec:
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  selector:
    matchLabels:
      app: bluegreen
  replicas: 4
  template:
    metadata:
      labels:
        app: bluegreen
        version: v1.0
    spec:
      containers:
      - name: bluegreen
        image: registry.cn-hangzhou.aliyuncs.com/ghy/test-docker-image:v1.0
        ports:
        - containerPort: 8080

(2)執行指令碼

kubectl apply -f bluegreen.yaml

(3)檢視pods

kubectl get pods
 (4)寫一個service指令碼,檔名是bluegreen-service.yaml
 
apiVersion: v1
kind: Service
metadata:
  name: bluegreen
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 8080
  selector:
    app: bluegreen
    version: v1.0
  type: ClusterIP

(5)重新啟動指令碼

kubectl apply -f bluegreen-service.yaml

(6)檢視svc

kubectl get svc

(7)在w1上不斷訪問觀察

while sleep 0.3;do curl cluster-ip/dockerfile;echo "";done

(8)接下來就是要做將1.0版本升級到2.0版本了修改bluegreen.yaml,修改的內容我標記不同顏色

#deploy
apiVersion: apps/v1
kind: Deployment
metadata:
  name: green
spec:
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  selector:
    matchLabels:
      app: bluegreen
  replicas: 4
  template:
    metadata:
      labels:
        app: bluegreen
        version: v2.0
    spec:
      containers:
      - name: bluegreen
        image: registry.cn-hangzhou.aliyuncs.com/ghy/test-docker-image:v2.0
        ports:
        - containerPort: 8080

(9)重新啟動指令碼

kubectl apply -f bluegreen.yaml

(10)檢視pod

kubectl get pods

(11)同時觀察剛才訪問的地址有沒有變化,可以發現,兩個版本就共存了,並且之前訪問的地址沒有變化,那怎麼切換版本呢,前面不是寫了個bluegreen-service.yaml檔案嗎,很簡單,修改bluegreen-service.yaml檔案的指向就行,修改後的bluegreen-service.yaml檔案如下

apiVersion: v1
kind: Service
metadata:
  name: bluegreen
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 8080
#也就是把流量切到了2.0版本中 selector: app: bluegreen version: v2.0 type: ClusterIP

(12)重啟下bluegreen-service.yaml檔案

kubectl apply -f bluegreen-service.yaml

(13)重新檢視svc

kubectl get svc

(14)同時觀察剛才訪問的地址有沒有變化,發現流量已經完全切到了v2.0的版本上

1.4、金絲雀

前面三種介紹完了,接下來說一種開發中常用的一種部署方式,在有些場景中,如果我們希望多版本共存,那部署怎麼搞呢,方法就是接下來要說明的

(1)其實很簡單,只用在我們1.3中的藍綠部署中做一些小小的改變就好。修改下bluegreen-service.yaml檔案,改動如下

apiVersion: v1
kind: Service
metadata:
  name: bluegreen
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 8080
  selector:
    app: bluegreen
    version: v2.0  #把veersion刪除掉只根據bluegreen進行選擇
  type: ClusterIP

(2)重啟下bluegreen-service.yaml檔案

kubectl apply -f bluegreen-service.yaml

(3)同時觀察剛才訪問的地址有沒有變化,istio中就更方便咯,此時新舊版本能夠同時被訪問到,AB測試,新功能部署少一些的例項

相關文章