使用K8S進行藍綠部署的簡明實操指南

2023-03-20 12:03:24

在之前的應用部署系列文章裡,我們已經介紹過什麼是藍綠部署。如需回顧,點選下方文章連結即可重溫。本文我們將會介紹如何使用 Kubernetes 實現藍綠部署。
 

應用部署初探:3個主要階段、4種常見模式
應用部署初探:微服務的3大部署模式
應用部署初探:6個保障安全的最佳實踐

 

前期準備:

  • Kubernetes 叢集
  • kubectl
  • 要部署的應用程式的 Docker 映象
     

如果你已經準備就緒,那麼我們就開始部署啦!

 

Step 1:建立名稱空間

首先,我們需要建立名稱空間來部署我們的應用程式。輸入以下命令即可:
kubectl create namespace blue-green
 

Step 2:建立部署

接下來,我們需要建立2個部署,一個是藍環境,另一個是綠環境。除了標籤之外,兩個部署應該是相同的(標籤主要是為了辨別哪個是藍環境,哪個是綠環境)。以下是部署 manifest 範例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-blue
  labels:
    app: myapp
    env: blue
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
      env: blue
  template:
    metadata:
      labels:
        app: myapp
        env: blue
    spec:
      containers:
      - name: myapp
        image: myapp:v1.0
        ports:
        - containerPort: 80

將 manifest 儲存為 blue-deployment.yaml,並使用以下命令在藍環境中建立部署:

kubectl apply -f blue-deployment.yaml -n blue-green
 

同理,通過在 manifest 檔案中更改名稱和標籤來在綠環境中建立另一個部署,並將其儲存為 green-deployment.yaml。接下來,使用以下命令將其部署在綠環境:

kubectl apply -f green-deployment.yaml -n blue-green
 

Step 3:建立服務

現在,我們需要建立服務將我們的應用程式暴露給外部世界。該服務應該使用 label selector 來將流量路由到藍部署和綠部署中。以下是服務 manifest 範例:

apiVersion: v1
kind: Service
metadata:
  name: myapp-service
spec:
  selector:
    app: myapp
  ports:
  - name: http
    port: 80
    targetPort: 80
  type: LoadBalancer

 

將 manifest 儲存為 service.yaml,並使用以下命令建立服務:
kubectl apply -f service.yaml -n blue-green
 

Step 4:驗證部署

現在,我們來驗證部署和服務是否能正常執行。首先,我們需要獲得服務的外部IP地址:
kubectl get service myapp-service -n blue-green
 

該命令將輸出服務的外部IP地址。使用這個IP地址可以在瀏覽器記憶體取應用。你應該可以看到應用在藍環境中執行。
 

Step 5:執行藍綠部署

既然藍綠部署都在執行,我們就可以通過從藍環境路由流量到綠環境來執行藍綠部署。
 

Step 6:更新綠部署

首先,我們需要使用應用程式的新版本更新綠部署。在綠部署的 manifest 裡用新版本的 Docker 映象來更新映象欄位並將其儲存為 green-deployment-v2.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-green
  labels:
    app: myapp
    env: green
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
      env: green
  template:
    metadata:
      labels:
        app: myapp
        env: green
    spec:
      containers:
      - name: myapp
        image: myapp:v2.0
        ports:
        - containerPort: 80

 

使用以下命令,應用更新好的綠部署:

kubectl apply -f green-deployment-v2.yaml -n blue-green

 

Step 7:更新服務

接下來,我們需要更新服務以將流量路由到綠部署。首先,在服務的manifest裡更新 label selector,以選擇綠部署:

apiVersion: v1
kind: Service
metadata:
  name: myapp-service
spec:
  selector:
    app: myapp
    env: green
  ports:
  - name: http
    port: 80
    targetPort: 80
  type: LoadBalancer

 

使用以下命令應用更新完畢的服務:

kubectl apply -f service.yaml -n blue-green

 

Step 8:驗證部署

最後,我們需要驗證部署是否成功。首先,使用 kubectl get service 命令獲取服務的外部IP地址,並在瀏覽器中存取應用程式。你應該看到已經更新好的應用版本在綠環境中執行。
 

Step 9:回滾

如果在部署期間發生錯誤,我們可以輕鬆回滾到之前的應用版本:通過在服務的manifest裡更新 label selector 來選擇藍環境並重新應用服務 manifest。

apiVersion: v1
kind: Service
metadata:
  name: myapp-service
spec:
  selector:
    app: myapp
    env: blue
  ports:
  - name: http
    port: 80
    targetPort: 80
  type: LoadBalancer

 

應用更新完畢的服務:

kubectl apply -f service.yaml -n blue-green

 

需要考慮的因素

當您在 Kubernetes 中進行藍綠部署時,需要考慮一些其他因素:
 

  • 儲存:如果你的應用程式需要持久化儲存,你要確保藍綠部署都使用相同的持久卷。否則,你可能會在部署過程中丟失資料。
  • DNS:如果你的應用程式屬於自定義域名,那麼當從藍部署切換到綠部署時,你需要更新 DNS 記錄以指向新的IP地址。
  • 測試:在將流量切換到綠部署之前,徹底地測試應用新版本以保證其正常工作是至關重要的。也可以使用金絲雀釋出來將流量逐步切換的新版本並監控其效能。
     

總結

儘管藍綠部署是一種高效的部署應用程式的方法,但它可能並不適用於每種情況。例如,如果你的應用需要進行大量的資料遷移或更改資料庫格式,藍綠部署可能不是最佳策略,因為它會導致藍綠環境之間資料不一致。
 

此外,對於需要永續性儲存的有狀態的應用程式來說,藍綠部署的實施可能具有挑戰性,因為資料必須在藍色和綠色環境之間同步進行。在這些情況下,你也許需要考慮其他部署策略,比如捲動更新或金絲雀部署。
 

在本文中,我們瞭解瞭如何使用 Kubernetes 進行藍綠部署。藍綠部署是一種備受歡迎的部署策略,因為它提供了零停機時間,並在出錯時提供了快速、簡單的回滾方式。