OpenKruise は、標準の Kubernetes 拡張コンポーネントです。ネイティブの Kubernetes を拡張して、アプリケーションコンテナー、サイドカー、およびイメージ配布の効率的な管理を提供します。このトピックでは、OpenKruise を使用してクラウドネイティブアプリケーションをデプロイする方法について説明します。
前提条件
ACK マネージドクラスターを作成済みであること。
背景情報
OpenKruise は、Alibaba Cloud によってオープンソース化されたクラウドネイティブアプリケーションの自動化エンジンです。Cloud Native Computing Foundation (CNCF) Sandbox に正式に参加しています。OpenKruise には、ステートレスアプリケーション、ステートフルアプリケーション、サイドカーコンテナー、およびデーモンアプリケーションをデプロイおよび管理するためのさまざまなカスタムワークロードが含まれています。また、In-place アップグレード、段階的リリース、ストリームリリース、構成の優先順位などの高度なデプロイメントポリシーも提供します。
コンポーネントアーキテクチャ

OpenKruise は標準の Kubernetes 拡張機能であり、Kubernetes クラスターにネイティブにデプロイされます。これは、次の 3 つのコンポーネントで構成されています。
コンポーネント | 説明 |
Kruise-manager | Kruise-manager は、コントローラーと Webhook を実行する中央コンポーネントです。kruise-system 名前空間にデプロイメントとしてデプロイされます。コントローラーと Webhook を使用して、In-place アップグレードやサイドカー管理などのコア機能を実装します。 |
Kruise-daemon | 各ノードに DaemonSet としてデプロイされ、イメージのプリフェッチやコンテナーの再起動などの機能を提供します。 |
Kruise-Rollout | Kruise-Rollout は、Kubernetes に基づく標準の拡張コンポーネントです。完全な Rollout モデルの定義と実装が含まれています。アプリケーションのトラフィックやデプロイされたインスタンスと連携するカナリアリリース、ブルーグリーンデプロイメント、A/B テストリリースをサポートしています。また、シームレスなバイパス統合を提供し、さまざまな既存のワークロードと互換性があります。 |
使用上の注意
次のセクションでは、CloneSet、Advanced StatefulSet、Advanced DaemonSet などの一般的な OpenKruise コントローラーの機能について説明します。
表 1. 一般的なコントローラー
コントローラー | 特徴 |
CloneSet | ステートレスアプリケーションを管理し、ネイティブの Kubernetes Deployment と同等です。詳細については、「CloneSet」をご参照ください。 その YAML ファイルのフィールドはデプロイメントと完全な互換性はありませんが、デプロイメントのすべての機能を提供し、より高度なポリシーを提供します。 |
Advanced StatefulSet | ステートフルアプリケーションを管理し、ネイティブの Kubernetes StatefulSet に匹敵します。詳細については、「Advanced StatefulSet」をご参照ください。 その YAML ファイルのフィールドは、ネイティブの StatefulSet と完全に互換性があります。 |
Advanced DaemonSet | Advanced DaemonSet はデーモンアプリケーションを管理し、ネイティブの Kubernetes DaemonSet と同等です。詳細については、「Advanced DaemonSet」をご参照ください。 その YAML ファイルのフィールドは、ネイティブの DaemonSet と完全に互換性があります。 |
SidecarSet | SidecarSet コントローラーは、サイドカーコンテナーを独立して管理し、Pod にサイドカーコンテナーを挿入します。詳細については、「SidecarSet」をご参照ください。 別のカスタムリソース (CR) でサイドカーコンテナーとラベルセレクターを定義します。OpenKruise は、定義されたサイドカーコンテナーを、作成時にセレクターに一致するすべての Pod に挿入します。また、挿入されたサイドカーコンテナーの In-place アップグレードもサポートしています。 |
UnitedDeployment | 異なるリージョンにある複数のサブワークロードを管理します。詳細については、「UnitedDeployment」をご参照ください。 現在、サブワークロードとして CloneSet、StatefulSet、および Advanced StatefulSet をサポートしています。単一の UnitedDeployment を使用して、異なるリージョンのサブワークロードのデプロイメントレプリカを定義できます。 |
次の表は、CloneSet、Advanced StatefulSet、および Advanced DaemonSet コントローラーの機能を、Kubernetes コミュニティの対応する機能と比較したものです。
表 2. コミュニティコントローラーとの機能比較
特徴 | CloneSet vs. Deployment | Advanced StatefulSet vs. StatefulSet | Advanced DaemonSet vs. DaemonSet | |||
CloneSet | Deployment | Advanced StatefulSet | StatefulSet | Advanced DaemonSet | DaemonSet | |
ストリームスケールアウト |
|
|
|
|
|
|
ターゲット指定スケールイン |
|
|
|
|
|
|
再作成アップグレード |
|
|
|
|
|
|
In-place アップグレード |
|
|
|
|
|
|
段階的リリース |
|
|
|
|
|
|
利用可能な数量 |
|
|
|
|
|
|
最大サージ |
|
|
|
|
|
|
優先度と分散ポリシーによるリリース順序のカスタマイズ |
|
|
|
|
|
|
フックによる Pod ライフサイクルの管理 |
|
|
|
|
|
|
OpenKruise のインストール
ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
クラスター ページで、管理するクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、[アドオン] をクリックします。
[アドオン] ページで、[アプリケーション] タブをクリックします。[ack-kruise] セクションで、[インストール] をクリックします。
[Ack-kruise のインストール] ダイアログボックスで、コンポーネント情報を確認し、[OK] をクリックします。
CloneSet を使用してステートレスアプリケーションをデプロイする
CloneSet を作成します。
cloneset.yaml ファイルを作成します。
apiVersion: apps.kruise.io/v1alpha1 kind: CloneSet metadata: name: demo-clone spec: replicas: 5 selector: matchLabels: app: guestbook template: # Pod テンプレートの構造は 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 # 可能な場合は In-place 法を使用してアップグレードします。それ以外の場合は、再作成法を使用します。 maxUnavailable: 20% # リリース中、最大 20% の Pod が利用不可になる可能性があります。 inPlaceUpdateStrategy: gracePeriodSeconds: 3 # In-place アップグレード前の NotReady 状態の Pod の猶予期間。type: アップグレードポリシーを指定します。次のアップグレードメソッドがサポートされています:
ReCreate: コントローラーは古い Pod と PersistentVolumeClaim (PVC) を削除し、新しいバージョンで新しいものを作成します。
InPlaceIfPossible: コントローラーはまず Pod の In-place アップグレードを試みます。In-place アップグレードが失敗した場合、コントローラーは Pod を再作成します。
InPlaceOnly: コントローラーは In-place アップグレードのみを実行します。
maxUnavailable: リリース中に利用できなくなる可能性のある Pod の最大数。値は絶対数またはパーセンテージです。
gracePeriodSeconds: In-place アップグレードが実行される前の NotReady 状態の Pod の猶予期間 (秒)。
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 3sCloneSet を確認します。
kubectl get clone予想される出力:
NAME DESIRED UPDATED UPDATED_READY READY TOTAL AGE demo-clone 5 5 5 5 5 46sDESIRED: 目的の 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 テンプレートの構造は、ネイティブの 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 # 可能な場合は In-place 法を使用してアップグレードします。それ以外の場合は、再作成法を使用します。 maxUnavailable: 20% # リリース中、最大 20% の Pod が利用不可になる可能性があります。 inPlaceUpdateStrategy: gracePeriodSeconds: 3 # In-place アップグレード前の NotReady 状態の Pod の猶予期間。type: Pod のアップグレードポリシーを指定します。次のアップグレードメソッドがサポートされています。
ReCreate: コントローラーは古い Pod と PVC を削除し、新しいバージョンで新しいものを作成します。
InPlaceIfPossible: コントローラーはまず Pod の In-place アップグレードを試みます。In-place アップグレードが失敗した場合、コントローラーは Pod を再作成します。
InPlaceOnly: コントローラーは In-place アップグレードのみを実行します。
maxUnavailable: リリース中に利用できなくなる可能性のある Pod の最大数。値は絶対数またはパーセンテージです。
gracePeriodSeconds: In-place アップグレードが実行される前の NotReady 状態の Pod の猶予期間 (秒)。
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 3h29mAdvanced StatefulSet を確認します。
kubectl get asts予想される出力:
NAME DESIRED CURRENT UPDATED READY AGE demo-asts 3 3 3 3 3h30mDESIRED: 目的の Pod 数 (spec.replicas)。
UPDATED: 最新バージョンの Pod の数 (status.updatedReplicas)。
READY: 準備完了の Pod の総数 (status.readyReplicas)。
TOTAL: Pod の総数 (status.replicas)。