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
進行重試。
登錄容器服務管理控制臺,在左側導航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇 。
在組件管理頁面,單擊應用管理頁簽。在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)。