全部產品
Search
文件中心

Container Service for Kubernetes:使用OpenKruise部署雲原生應用

更新時間:Sep 11, 2024

OpenKruise是基於Kubernetes的一個標準向外延展群組件,可以配合原生Kubernetes使用,高效管理應用程式容器、Sidecar及鏡像分發等功能。本文介紹如何使用OpenKruise部署雲原生應用。

前提條件

已安裝Kubernetes託管版叢集,且叢集版本不低於1.13。具體操作,請參見建立Kubernetes託管版叢集

背景資訊

OpenKruise是阿里雲開源的雲原生應用自動化引擎,也是阿里巴巴經濟體上雲全面使用的部署基座,已正式加入CNCF Sandbox。

OpenKruise包含了多種自訂Workload,用於無狀態應用、有狀態應用、Sidecar容器、Daemon應用等部署管理,提供了原地升級、灰階、流式、配置優先順序等擴充策略。

組件架構

OpenKruise

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完全相容,只需要把apiVersion改為apps.kruise.io/v1alpha1,另外提供了optional欄位來擴充發布策略(原地升級、並行發布等)。

Advanced DaemonSet

管理Daemon應用,對標Kubernetes原生DaemonSet。關於Advanced DaemonSet的詳細介紹,請參見Advanced DaemonSet

資源(YAML)欄位與原生DaemonSet完全相容,只需要把apiVersion改為apps.kruise.io/v1alpha1,另外提供了optional欄位來擴充發布策略(熱升級、灰階、按Node標籤灰階等)。

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進行重試。

  1. 登入Container Service管理主控台,在左側導覽列選擇叢集

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇營運管理 > 組件管理

  3. 組件管理頁面,單擊應用管理頁簽。在ack-kruise地區,單擊安裝

    提示對話方塊確認組件資訊後,單擊確定

使用CloneSet部署無狀態應用

  1. 建立CloneSet。

    1. 建立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優雅等待時間。

    2. 使cloneset.yaml在ACK叢集中生效。

      kubectl create -f ./cloneset.yaml

      預期輸出:

      cloneset.apps.kruise.io/demo-clone created
  2. 查看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
  3. 查看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部署有狀態應用

  1. 建立Advanced StatefulSet。

    1. 建立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優雅等待時間。

    2. 使statefulset.yaml在ACK叢集中生效。

       kubectl create -f ./statefulset.yaml

      預期輸出:

      statefulset.apps.kruise.io/demo-asts created
  2. 查看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
  3. 查看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)。