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は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ファイルのフィールドと完全に一致します。 |
高度なDaemonSet | 高度なDaemonSetsは、KubernetesネイティブのDaemonSetsと同等です。 高度なDaemonSetsは、デーモンアプリケーションの管理に使用されます。 詳細については、「高度なDaemonSet」をご参照ください。 高度なDaemonSet YAMLファイルのフィールドは、DaemonSet YAMLファイルのフィールドと完全に一致します。 |
サイドカーセット | 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
イメージをプルします。
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、 を選択します。
[アドオン] ページで、[アプリケーションの管理] タブをクリックします。 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: #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状態にとどまる時間を指定します。
を作るcloneset.yamlACKクラスターで有効なファイル。
kubectl create -f ./cloneset.yaml
期待される出力:
cloneset.apps.kruise.io/demo-clone created
ポッドのステータスを照会します。
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: 予想されるポッド数 (spec. レプリカ) 。
UPDATED: アップグレードされたポッドの数 (status.updatedReplicas) 。
UPDATED_READY: ポッドのアップグレード後に使用できるポッドの数 (status.updatedReadyReplicas) 。
READY: 使用可能なポッドの総数 (status.readyReplicas) 。
TOTAL: ポッドの総数 (status.replicas) 。
高度なStatefulSetを使用してステートフルアプリケーションをデプロイする
高度な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: #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状態にとどまる時間を指定します。
を作るstatefulset.yamlACKクラスターで有効なファイル。
kubectl create -f ./statefulset.yaml
期待される出力:
statefulset.apps.kruise.io/demo-asts created
ポッドのステータスを照会します。
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: 予想されるポッド数 (spec. レプリカ) 。
UPDATED: アップグレードされたポッドの数 (status.updatedReplicas) 。
READY: 使用可能なポッドの総数 (status.readyReplicas) 。
TOTAL: ポッドの総数 (status.replicas) 。