Kubernetes 原生的應用升級基于終態模型,一旦發布出現問題無法暫停,只能通過YAML回滾應用。為了使 Kubernetes 應用發布過程更加可控。Flow 提供了 Kubernetes 分批發布的能力,以讓發布過程更加可控。
實現原理
Kubernetes 使用 Service 在集群內暴露服務
Service 與Deployment 的 Pod 實例之間使用 Lables 進行關聯,Service 的流量會轉到關聯的 Deployment 實例
假設 serviceA 關聯了應用 app-v1 并且其 Replicas 副本數 > 1
分批發布開始創建 app-v2 并繼承 app-v1 的所有標簽,此時 serviceA 的流量會隨機轉發到 v1 和 v2
分批發布過程通過擴容 app-v2 和縮容 app-v1 實現應用的發布
發布過程暫停時,用戶可以選擇繼續發布,直到 app-v2 達到預期狀態
或者回滾移除 app-v2 并恢復 app-v1 的副本數
前提
Deployment 上不能關聯 HPA,否則會導致舊版本無法縮容,發布可能超時失敗
Deployment 的 labels 內包含有 Service 的全部 selector labels,如:
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
run: spring-boot-sample
name: spring-boot-sample
spec:
replicas: 2
selector:
matchLabels:
run: spring-boot-sample
template:
metadata:
labels:
run: spring-boot-sample
spec:
containers:
- image: ${IMAGE}
name: app
---
apiVersion: v1
kind: Service
metadata:
name: spring-boot-service
labels:
test: test
labele2: label
spec:
ports:
- name: http
port: 8080
protocol: TCP
targetPort: 8080
- name: https
port: 443
protocol: TCP
targetPort: 443
selector:
run: spring-boot-sample
sessionAffinity: None
type: ClusterIP
添加分批發布任務
用戶可以通過添加流水線任務并選擇 ”Kubernetes 分批發布“任務:
配置發布任務
首次使用 Kubernetes 相關發布功能的用戶需要首先建立 Kubernetes 服務連接。
選擇發布的目標 Service 以及 Service 關聯的 Deployment 中的容器名稱。鏡像需要由上游鏡像構建步驟產生:
執行分批發布
當使用分批發布第一批暫停,當第一批次發布完成后,卡片會顯示暫停狀態,并提示用戶繼續下一批次或者回滾
在人工驗證完成后,選擇繼續發布完成后續批次的發布