K8s 藍綠部署:優雅應對應用程序更新挑戰


Kubernetes 是一個開源容器編排系統,可簡化軟件部署、擴展和管理。藍綠部署是一種部署模式,通過同時運行兩個相同的生產環境來最大限度地減少停機時間。通過創建藍色和綠色部署,設置服務和路由規則,以及執行藍綠部署來更新應用程序版本,可以輕鬆管理和更新應用程序。


Kubernetes 是一個開源容器編排系統,可簡化軟件部署、擴展和管理。它最初由 Google 設計,現在由雲原生計算基金會監管。

藍綠部署概述:

藍綠部署是一種部署模式,通過運行兩個相同的生產環境(藍色和綠色)來最大限度地減少停機時間。一次只有一個環境運行,確保更改既向前又向後兼容。該方法包括設置並行基礎設施、將新版本部署到新環境、驗證,然後將所有流量切換到綠色環境。確認後,舊的基礎設施(藍色)可以移除或停止。

先決條件:

分步指南:

第 1 步:創建命名空間

kubectl create namespace blue-green-deployment

第 2 步:創建部署

創建藍色部署清單 (blue-deployment.yaml):

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

應用部署:

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

創建類似的綠色部署清單 (green-deployment.yaml) 並應用它。

第 3 步:創建服務

創建服務清單(service.yaml):selector: app: demoapp

# service.yaml
apiVersion: v1
kind: Service
metadata:
  name: demoapp-service
spec:
  selector:
    app: demoapp
  ports:
  - name: http
    port: 80
    targetPort: 80
  type: LoadBalancer

申請服務:

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

獲取服務的外部 IP 地址:

kubectl get service demoapp-service -n blue-green-deployment

第 4 步:路由規則

在服務清單 (service.yaml) 中定義路由規則,將流量路由到藍色或綠色部署:

# service.yaml
apiVersion: v1
kind: Service
metadata:
  name: demoapp-service
spec:
  selector:
    app: demoapp
  ports:
  - name: http
    port: 80
    targetPort: 80
  type: LoadBalancer
  sessionAffinity: ClientIP
  externalTrafficPolicy: Local
  loadBalancerSourceRanges:
  - 0.0.0.0/0

應用更新後的服務:

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

第 5 步:基於主機和路徑的路由

擴展服務清單 (service.yaml) 以包含基於主機和路徑的路由規則:

# service.yaml
apiVersion: v1
kind: Service
metadata:
  name: demoapp-service
spec:
  selector:
    app: demoapp
  ports:
  - name: http
    port: 80
    targetPort: 80
  type: LoadBalancer
  sessionAffinity: ClientIP
  externalTrafficPolicy: Local
  loadBalancerSourceRanges:
  - 0.0.0.0/0
  externalIPs:
  - <external_ip_address>
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: demoapp-ingress
spec:
  rules:
  - host: "demoapp.example.com"
    http:
      paths:
      - path: /blue
        backend:
          serviceName: demoapp-blue
          servicePort: 80
      - path: /green
        backend:
          serviceName: demoapp-green
          servicePort: 80

應用更新後的服務:

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

第 6 步:執行藍綠部署

在藍色和綠色部署同時運行的情況下,將流量從藍色部署路由到綠色部署。

第 7 步:更新綠色部署

使用新版本的應用程序更新綠色部署 (green-deployment-v2.yaml):

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

應用更新的綠色部署:

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

第 8 步:更新服務

更新服務以將流量路由到綠色部署 (service.yaml)。

# service.yaml
apiVersion: v1
kind: Service
metadata:
  name: demoapp-service
spec:
  selector:
    app: demoapp
    env: green
  ports:
  - name: http
    port: 80
    targetPort: 80
  type: LoadBalancer
  sessionAffinity: ClientIP
  externalTrafficPolicy: Local
  loadBalancerSourceRanges:
  - 0.0.0.0/0
  externalIPs:
  - <external_ip_address>
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: demoapp-ingress
spec:
  rules:
  - host: "demoapp.example.com"
    http:
      paths:
      - path: /blue
        backend:
          serviceName: demoapp-blue
          servicePort: 80
      - path: /green
        backend:
          serviceName: demoapp-green
          servicePort: 80

應用更新後的服務:

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

第 9 步:驗證部署成功

通過使用外部 IP 地址在 Web 瀏覽器中訪問應用程序來驗證部署是否成功。

第 10 步:回滾(如果需要)

如果出現問題,請通過更新服務清單中的標籤選擇器以選擇藍色部署並重新應用服務清單來回滾到以前的版本。

# service.yaml
apiVersion: v1
kind: Service
metadata:
  name: demoapp-service
spec:
  selector:
    app: demoapp
    env: blue
  ports:
  - name: http
    port: 80
    targetPort: 80
  type: LoadBalancer
  sessionAffinity: ClientIP
  externalTrafficPolicy: Local

本文轉載自:「DevOps 雲學堂」,原文:https://reurl.cc/g4og4X,版權歸原作者所有。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/Dc5wOBAE_jSiTKqPc6M4Dg