すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:OpenKruiseを使用したクラウドネイティブアプリケーションのデプロイ

最終更新日:Nov 14, 2024

OpenKruiseは、Kubernetesの標準拡張機能のセットです。 ネイティブKubernetesと共に使用して、アプリケーションポッド、サイドカーコンテナ、イメージ配布を効率的に管理できます。 このトピックでは、OpenKruiseを使用してクラウドネイティブアプリケーションをデプロイする方法について説明します。

前提条件

Kubernetes 1.13以降を実行するContainer Service for Kubernetes (ACK) マネージドクラスターが作成されます。 詳細については、「ACK管理クラスターの作成」をご参照ください。

背景情報

OpenKruiseは、Alibaba Cloudがクラウドネイティブアプリケーションに提供するオープンソースの自動化エンジンです。 Alibaba Groupのビジネスをクラウドに移行するためのデプロイメントベースとして使用されます。 OpenKruiseは、Cloud Native Computing Foundation (CNCF) Sandboxプロジェクトに参加しました。

OpenKruiseには、さまざまなタイプのカスタムワークロードが含まれます。 ワークロードを使用して、ステートレスアプリケーション、ステートフルアプリケーション、サイドカーコンテナー、およびデーモンアプリケーションをデプロイおよび管理できます。 OpenKruiseは、インプレースアップグレード、カナリアリリース、ストリームアップグレード、優先設定などの高度な戦略もサポートしています。

コンポーネントアーキテクチャ

OpenKruise

OpenKruiseはKubernetesの標準拡張機能のセットであり、KubernetesネイティブコンポーネントとしてACKクラスターにデプロイできます。 OpenKruiseは、以下の3つのコンポーネントを含む。

コンポーネント

説明

Kruise-マネージャー

Kruise-managerは、コントローラーとwebhookを実行するコントロールプレーンコンポーネントです。 これは、配置によってkruise-system名前空間に配置されます。 コントローラーとWebhookを使用して、インプレースアップグレードやサイドカー管理などの主要機能を実装します。

Kruise-デーモン

Kruise-daemonは各ノードにDaemonSetとしてデプロイされ、イメージの事前ダウンロードやコンテナーの再起動などの機能を管理します。

Kruise-ロールアウト

Kruise-Rolloutは、Kubernetesベースの標準拡張およびバイパスコンポーネントで、完全なロールアウトモデルの定義と実装をサポートします。 Kruise-Rolloutを使用して、複数のKubernetesワークロードに対してカナリアリリース、青緑色デプロイ、およびA/Bテストを実行できます。

使用上の注意

OpenKruiseは、CloneSet、Advanced StatefulSet、Advanced DaemonSetなどのコントローラーを提供します。 一般的に使用されるコントローラの機能について説明します。

表 1. 一般的に使用されるコントローラ

コントローラ

機能

CloneSet

CloneSetsは、Kubernetesネイティブのデプロイメントと同等です。 CloneSetsは、ステートレスアプリケーションの管理に使用されます。 詳細については、「CloneSet」をご参照ください。

CloneSet YAMLファイルのフィールドは、Deployment YAMLファイルのフィールドと完全には一致しません。 ただし、CloneSetsはDeploymentsのすべての機能をサポートし、より多くの戦略を提供します。

高度なStatefulSet

高度なStatefulSetsは、KubernetesネイティブのStatefulSetsと同等です。 高度なStatefulSetsは、ステートフルアプリケーションの管理に使用されます。 詳細については、「Advanced StatefulSet」をご参照ください。

高度なStatefulSet YAMLファイルのフィールドは、StatefulSet YAMLファイルのフィールドと完全に一致します。 apiVersionの値をapps.kruise.io/v1alphaに変更するだけです。 さらに、オプションフィールドを設定して、インプレースアップグレードや並列リリースなど、より多くのリリース戦略を使用できます。

高度なDaemonSet

高度なDaemonSetsは、KubernetesネイティブのDaemonSetsと同等です。 高度なDaemonSetsは、デーモンアプリケーションの管理に使用されます。 詳細については、「高度なDaemonSet」をご参照ください。

高度なDaemonSet YAMLファイルのフィールドは、DaemonSet YAMLファイルのフィールドと完全に一致します。 apiVersionの値をapps.kruise.io/v1alphaに変更するだけです。 さらに、オプションフィールドを設定して、ホットアップグレード、カナリアリリース、ノードラベルによるカナリアリリースなど、より多くのリリース戦略を使用できます。

サイドカーセット

SidecarSetコントローラは、サイドカーコンテナを独立して管理し、サイドカーコンテナをポッドに注入します。 詳細については、「SidecarSet」をご参照ください。

独立したカスタムリソース (CR) でサイドカーコンテナーとラベルセレクターを定義した後、OpenKruiseは、ポッドの作成時に条件に一致するポッドに定義されたサイドカーコンテナーを挿入します。 SidecarSetを使用して、注入されたサイドカーコンテナのインプレースアップグレードを実行することもできます。

UnitedDeployment

UnitedDeploymentコントローラーは、異なるリージョンの複数のサブワークロードを管理します。 詳細については、「UnitedDeployment」をご参照ください。

UnitedDeploymentコントローラーは、CloneSets、StatefulSets、およびAdvanced StatefulSetsのサブワークロードをサポートしています。 1つのUnitedDeploymentを使用して、異なるリージョンのサブワークロードとこれらのサブワークロードのレプリケートされたポッドを管理できます。

次のセクションでは、OpenKruiseのCloneSet、Advanced StatefulSet、およびAdvanced DaemonSetコントローラを、Kubernetesコミュニティが提供する同等のコントローラと比較します。

表 2. 機能の比較

機能

CloneSet VSデプロイメント

高度なStatefulSet VS StatefulSet

高度なDaemonSet VS DaemonSet

CloneSet

デプロイ

高度なStatefulSet

StatefulSet

高度なDaemonSet

DaemonSet

ストリームスケーリング

对

错

错

错

对

错

選択的ポッド削除

对

错

对

错

错

错

レクリエーション時にポッドをアップグレードする

对

对

对

对

对

对

インプレースポッドのアップグレード

对

错

对

错

对

错

カナリアリリース

对

错

对

对

对

错

使用可能な最大ポッド

对

对

对

错

对

对

MaxSurge

对

对

错

错

对

错

優先順位または散布戦略を使用したカスタムリリースシーケンス

对

错

对

错

对

错

ライフサイクルフックを使用したポッドのライフサイクル管理

对

错

错

错

错

错

OpenKruiseのインストール

重要
  • OpenKruiseをインストールする前に、Kubernetesのバージョンが1.13以降であることを確認してください。 OpenKruiseをインストールする前に、Kubernetesのバージョンが1.13以降であることを確認してください。 Kubernetes 1.13または1.14を使用する場合、OpenKruiseをインストールする前に、kube-apiserverでCustomResourceWebhookConversion機能ゲートを有効にする必要があります。 詳細については、「機能ゲート」をご参照ください。

  • 中国 (杭州) リージョンのイメージリポジトリは使用できません。 registry.cn-hangzhou.cr.aliyuncs.com/openkruise/kruise-managerイメージのプルに失敗した場合は、代わりにregistry.cn-shanghai.cr.aliyuncs.com/openkruise/kruise-managerイメージをプルします。

  1. ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。

  2. [クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、[操作] > [アドオン] を選択します。

  3. [アドオン] ページで、[アプリケーションの管理] タブをクリックします。 ack-kruiseセクションで、[インストール] をクリックします。

    [メモ] ダイアログボックスで、コンポーネント情報を確認し、[OK] をクリックします。

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: #The schema of the pod template is the same as that of a 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     #We recommend that you perform an in-place upgrade instead of upgrading pods upon recreation. 
          maxUnavailable: 20%        #A maximum of 20% pods can be unavailable during the release. 
          inPlaceUpdateStrategy:
            gracePeriodSeconds: 3    #The graceful period specifies how long a pod stays in the Not-ready state before the controller performs an in-place upgrade on the pod.

      • type: アップグレード戦略を指定します。 次の3つの戦略がサポートされています。

        • ReCreate: コントローラは現在のポッドとPVCを削除し、新しいポッドとPVCを作成します。

        • InPlaceIfPossible: コントローラがインプレースアップグレードを実行しようとします。 試行が失敗した場合、コントローラはポッドを再作成してアップグレードします。

        • InPlaceOnly: コントローラはインプレースアップグレードのみを実行できます。

      • maxUnavailable: アップグレードプロセス中に使用できないポッドの最大数。 絶対値またはパーセント値を指定できます。

      • gracePeriodSeconds: 猶予期間は、コントローラがポッドでインプレースアップグレードを実行する前に、ポッドがNot-ready状態にとどまる時間を指定します。

    2. を作るcloneset.yamlACKクラスターで有効なファイル。

      kubectl create -f ./cloneset.yaml

      期待される出力:

      cloneset.apps.kruise.io/demo-clone created
  2. ポッドのステータスを照会します。

    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: 予想されるポッド数 (spec. レプリカ) 。

    • UPDATED: アップグレードされたポッドの数 (status.updatedReplicas) 。

    • UPDATED_READY: ポッドのアップグレード後に使用できるポッドの数 (status.updatedReadyReplicas) 。

    • READY: 使用可能なポッドの総数 (status.readyReplicas) 。

    • TOTAL: ポッドの総数 (status.replicas) 。

高度なStatefulSetを使用してステートフルアプリケーションをデプロイする

  1. 高度な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: #The schema of the pod template is the same as that of a StatefulSet YAML. 
          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 #We recommend that you perform an in-place upgrade instead of upgrading pods upon recreation. 
            maxUnavailable: 20%                  #A maximum of 20% pods can be unavailable during the release. 
            inPlaceUpdateStrategy:
              gracePeriodSeconds: 3    #The graceful period specifies how long a pod stays in the Not-ready state before the controller performs an in-place upgrade on the pod.

      • type: アップグレード戦略を指定します。 次の3つの戦略がサポートされています。

        • ReCreate: コントローラは現在のポッドとPVCを削除し、新しいポッドとPVCを作成します。

        • InPlaceIfPossible: コントローラがインプレースアップグレードを実行しようとします。 試行が失敗した場合、コントローラはポッドを再作成してアップグレードします。

        • InPlaceOnly: コントローラはインプレースアップグレードのみを実行できます。

      • maxUnavailable: アップグレードプロセス中に使用できないポッドの最大数。 絶対値またはパーセント値を指定できます。

      • gracePeriodSeconds: 猶予期間は、コントローラがポッドでインプレースアップグレードを実行する前に、ポッドがNot-ready状態にとどまる時間を指定します。

    2. を作るstatefulset.yamlACKクラスターで有効なファイル。

       kubectl create -f ./statefulset.yaml

      期待される出力:

      statefulset.apps.kruise.io/demo-asts created
  2. ポッドのステータスを照会します。

    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: 予想されるポッド数 (spec. レプリカ) 。

    • UPDATED: アップグレードされたポッドの数 (status.updatedReplicas) 。

    • READY: 使用可能なポッドの総数 (status.readyReplicas) 。

    • TOTAL: ポッドの総数 (status.replicas) 。