K8s 藍綠部署:優雅應對應用程序更新挑戰
Kubernetes 是一個開源容器編排系統,可簡化軟件部署、擴展和管理。藍綠部署是一種部署模式,通過同時運行兩個相同的生產環境來最大限度地減少停機時間。通過創建藍色和綠色部署,設置服務和路由規則,以及執行藍綠部署來更新應用程序版本,可以輕鬆管理和更新應用程序。
Kubernetes 是一個開源容器編排系統,可簡化軟件部署、擴展和管理。它最初由 Google 設計,現在由雲原生計算基金會監管。
藍綠部署概述:
藍綠部署是一種部署模式,通過運行兩個相同的生產環境(藍色和綠色)來最大限度地減少停機時間。一次只有一個環境運行,確保更改既向前又向後兼容。該方法包括設置並行基礎設施、將新版本部署到新環境、驗證,然後將所有流量切換到綠色環境。確認後,舊的基礎設施(藍色)可以移除或停止。
先決條件:
-
Kubernetes 集羣
-
kubectl 命令行工具
-
待部署應用程序的 Docker 鏡像
分步指南:
第 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