OpenKruise是基於Kubernetes的一個標準向外延展群組件,可以配合原生Kubernetes使用,高效管理應用程式容器、Sidecar及鏡像分發等功能。本文介紹如何使用OpenKruise部署雲原生應用。
前提條件
已安裝Kubernetes託管版叢集,且叢集版本不低於1.13。具體操作,請參見建立Kubernetes託管版叢集。
背景資訊
OpenKruise是阿里雲開源的雲原生應用自動化引擎,也是阿里巴巴經濟體上雲全面使用的部署基座,已正式加入CNCF Sandbox。
OpenKruise包含了多種自訂Workload,用於無狀態應用、有狀態應用、Sidecar容器、Daemon應用等部署管理,提供了原地升級、灰階、流式、配置優先順序等擴充策略。
組件架構
OpenKruise是Kubernetes的一個標準擴充,所以也可以原生地部署到K8s叢集當中,主要包含以下三個組件。
組件 | 說明 |
Kruise-manager | Kruise-manager是一個運行Controller和Webhook的中心組件,通過Deployment部署在kruise-system命名空間中。通過Controller以及Webhook實現原地升級及Sidecar管理等核心能力。 |
Kruise-daemon | 通過DaemonSet部署到每個節點上,提供鏡像預熱及容器重啟等功能。 |
Kruise-Rollout | Kruise-Rollout是基於Kubernetes的一個標準向外延展群組件,包含完整的Rollout模型定義與方案實現,滿足配合應用流量和實際部署執行個體的金絲雀發布、藍綠髮布、A/B Testing發布,並能提供旁路的無感對接、相容已有的多種工作負載。 |
使用說明
OpenKruise包含CloneSet、Advanced StatefulSet、Advanced DaemonSet等控制器。以下介紹常用控制器的功能。
表 1. 常用控制器介紹
控制器 | 功能 |
CloneSet | 管理無狀態應用,對標Kubernetes原生Deployment。關於CloneSet的詳細介紹,請參見CloneSet。 資源(YAML)的欄位與Deployment不完全相容,但功能上全覆蓋,並提供比Deployment更豐富的策略。 |
Advanced StatefulSet | 管理有狀態應用,對標Kubernetes原生StatefulSet。關於Advanced StatefulSet的詳細介紹,請參見Advanced StatefulSet。 資源(YAML)欄位與原生StatefulSet完全相容,只需要把 |
Advanced DaemonSet | 管理Daemon應用,對標Kubernetes原生DaemonSet。關於Advanced DaemonSet的詳細介紹,請參見Advanced DaemonSet。 資源(YAML)欄位與原生DaemonSet完全相容,只需要把 |
SidecarSet | 獨立管理Sidecar容器和注入。關於SidecarSet的詳細介紹,請參見SidecarSet。 在獨立CR中定義Sidecar容器和Label Selector,OpenKruise會在所有符合Selector條件的Pod建立時注入定義好的Sidecar容器,並支援對已注入Sidecar容器做原地升級。 |
UnitedDeployment | 管理不同地區下的多個Sub Workload,關於UnitedDeployment的詳細介紹,請參見UnitedDeployment。 目前支援將CloneSet、StatefulSet、Advanced StatefulSet作為Sub Workload,您可以用一個UnitedDeployment來定義不同地區中的Sub Workload部署Replicas。 |
以下介紹CloneSet、Advanced StatefulSet、Advanced DaemonSet與社區對標控制器的功能對比。
表 2. 與社區控制器功能對比
功能 | CloneSet VS Deployment | Advanced StatefulSet VS StatefulSet | Advanced DaemonSet VS DaemonSet | |||
CloneSet | Deployment | Advanced StatefulSet | StatefulSet | Advanced DaemonSet | DaemonSet | |
流式擴容 | ||||||
指定縮容 | ||||||
Pod重建升級 | ||||||
Pod原地升級 | ||||||
分批灰階發布 | ||||||
最大可用數量 | ||||||
最大彈性數量 | ||||||
通過使用優先順序策略和打散策略來自訂發布順序 | ||||||
通過lifecycle hook管理Pod生命週期 |
安裝OpenKruise
安裝OpenKruise前,請確保Kubernetes版本不低於1.13。如果您使用的是Kubernetes 1.13或1.14版本,必須先在kube-apiserver中開啟
CustomResourceWebhookConversion
feature-gate。更多資訊,請參見特性門控。由於杭州倉庫已不可用,您如果遇到鏡像
registry.cn-hangzhou.cr.aliyuncs.com/openkruise/kruise-manager
拉取失敗,請將鏡像地址調整為registry.cn-shanghai.cr.aliyuncs.com/openkruise/kruise-manager
進行重試。
登入Container Service管理主控台,在左側導覽列選擇叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇 。
在組件管理頁面,單擊應用管理頁簽。在ack-kruise地區,單擊安裝。
在提示對話方塊確認組件資訊後,單擊確定。
使用CloneSet部署無狀態應用
建立CloneSet。
建立cloneset.yaml。
apiVersion: apps.kruise.io/v1alpha1 kind: CloneSet metadata: name: demo-clone spec: replicas: 5 selector: matchLabels: app: guestbook template: # Pod template和Deployment的結構完全一致。 metadata: labels: app: guestbook spec: containers: - name: guestbook image: openkruise-registry.cn-shanghai.cr.aliyuncs.com/openkruise/demo:1.10.2 env: - name: test value: foo updateStrategy: type: InPlaceIfPossible # 盡量使用原地升級,否則重建升級。 maxUnavailable: 20% # 發布過程最多20%不可用。 inPlaceUpdateStrategy: gracePeriodSeconds: 3 # 每個Pod原地升級前Not Ready優雅等待時間。
type:設定升級策略,支援以下3種升級方式。
ReCreate:控制器會刪除舊Pod和PVC,然後用新版本重新建立Pod和PVC。
InPlaceIfPossible:控制器會優先嘗試原地升級Pod,如果不行再採用重建升級。
InPlaceOnly:控制器只允許採用原地升級。
maxUnavailable:發布過程中,限制最多停用Pod數量,可以設定為一個絕對值或者百分比。
gracePeriodSeconds:每個Pod原地升級前Not Ready優雅等待時間。
使cloneset.yaml在ACK叢集中生效。
kubectl create -f ./cloneset.yaml
預期輸出:
cloneset.apps.kruise.io/demo-clone created
查看Pod運行狀態。
kubectl get pod
預期輸出:
NAME READY STATUS RESTARTS AGE demo-clone-5b9kl 1/1 Running 0 3s demo-clone-6xjdg 1/1 Running 0 3s demo-clone-bvmdj 1/1 Running 0 3s demo-clone-dm22s 1/1 Running 0 3s demo-clone-rbpg9 1/1 Running 0 3s
查看CloneSet。
kubectl get clone
預期輸出:
NAME DESIRED UPDATED UPDATED_READY READY TOTAL AGE demo-clone 5 5 5 5 5 46s
DESIRED:期望Pod數量(spec.replicas)。
UPDATED:最新版本的Pod數量(status.updatedReplicas)。
UPDATED_READY:最新版本的可用Pod數量(status.updatedReadyReplicas)。
READY:可用Pod總量(status.readyReplicas)。
TOTAL:實際Pod總量(status.replicas)。
使用Advanced StatefulSet部署有狀態應用
建立Advanced StatefulSet。
建立statefulset.yaml。
apiVersion: apps.kruise.io/v1alpha1 kind: StatefulSet metadata: name: demo-asts spec: replicas: 3 selector: matchLabels: app: guestbook-sts podManagementPolicy: Parallel template: # Pod template和官方StatefulSet的結構完全一致。 metadata: labels: app: guestbook-sts spec: containers: - name: guestbook image: openkruise-registry.cn-shanghai.cr.aliyuncs.com/openkruise/demo:1.10.2 env: - name: test value: foo readinessGates: - conditionType: InPlaceUpdateReady updateStrategy: type: RollingUpdate rollingUpdate: podUpdatePolicy: InPlaceIfPossible # 盡量使用原地升級,否則重建升級。 maxUnavailable: 20% # 發布過程最多20%不可用。 inPlaceUpdateStrategy: gracePeriodSeconds: 3 # 每個Pod原地升級前Not ready優雅等待時間。
type:設定Pod升級策略,支援以下3種方式升級。
ReCreate:控制器會刪除舊Pod和PVC,然後用新版本重新建立Pod和PVC。
InPlaceIfPossible:控制器會優先嘗試原地升級Pod,如果不行再採用重建升級。
InPlaceOnly:控制器只允許採用原地升級。
maxUnavailable:發布過程中,限制最多停用Pod數量,可以設定為一個絕對值或者百分比。
gracePeriodSeconds:每個Pod原地升級前Not ready優雅等待時間。
使statefulset.yaml在ACK叢集中生效。
kubectl create -f ./statefulset.yaml
預期輸出:
statefulset.apps.kruise.io/demo-asts created
查看Pod運行狀態。
kubectl get pod
預期輸出:
NAME READY STATUS RESTARTS AGE demo-asts-0 1/1 Running 0 3h29m demo-asts-1 1/1 Running 0 3h29m demo-asts-2 1/1 Running 0 3h29m
查看Advanced StatefulSet。
kubectl get asts
預期輸出:
NAME DESIRED CURRENT UPDATED READY AGE demo-asts 3 3 3 3 3h30m
DESIRED:期望Pod數量(spec.replicas)。
UPDATED:最新版本的Pod數量(status.updatedReplicas)。
READY:可用Pod總量(status.readyReplicas)。
TOTAL:實際Pod總量(status.replicas)。