ACK Oneは、ArgoCD GitOpsとKruiseRolloutの機能を統合しています。 Kruise Rolloutは、オープンソースのプログレッシブロールアウトフレームワークです。 ACK One GitOpsとKruiseロールアウトに基づいて、カナリアリリースを自動化するためにGitHubに変更をコミットできます。 このトピックでは、ACK One GitOpsとKruise Rolloutを使用してアプリケーションのカナリアリリースを実装する方法について説明します。
前提条件
フリート管理機能が有効になっています。 詳細については、「マルチクラスター管理の有効化」をご参照ください。
Container Service for Kubernetes (ACK) クラスターが作成され、ACK Oneフリートインスタンスに関連付けられます。 詳細については、「ACK管理クラスターの作成」および「クラスターとフリートインスタンスの関連付け」をご参照ください。
A/Bテストまたはカナリアリリースを実行するには、Kubernetes 1.19以降を実行するクラスターを作成する必要があります。
段階的リリースを実行するには、Kubernetes 1.16以降を実行するクラスターを作成する必要があります。
FleetインスタンスのkubeconfigファイルはDistributed Cloud Container Platform for Kubernetes (ACK One) コンソールで取得され、kubectlクライアントはFleetインスタンスに接続されています。
kubectl-kruiseがインストールされています。 kubectl-kruiseのインストールパスの詳細については、「kubectl-kruise」をご参照ください。
Kruiseロールアウトの概要
Kruise Rolloutは、OpenKruiseが提供するオープンソースのプログレッシブロールアウトフレームワークです。 Kruise Rolloutを使用して、カナリアリリース、ブルーグリーン展開、およびA/Bテストを実行できます。 Kruise Rolloutを使用して、カナリアのトラフィックとポッドを制御することもできます。 リリースプロセスは、バッチで自動化し、Prometheusメトリクスに基づいて一時停止できます。 Kruise Rolloutは、シームレスなバイパス接続も提供し、Deployments、CloneSets、StatefulSetsなどのさまざまなワークロードと互換性があります。 詳細については、「Kruiseロールアウト」をご参照ください。
Kruise Rolloutはバイパスコンポーネントです。 アプリケーションのリリースと更新を自動化するには、クラスターでロールアウトを作成するだけです。 Kruise Rolloutは、HelmおよびPaaSプラットフォームとのシームレスな統合を低コストでサポートします。 次の図は、Kruise Rolloutを使用したカナリアリリースの実行方法を示しています。
使用上の注意
GitHubリポジトリを使用する場合は、中国本土のリージョンにACKクラスターを作成しないことをお勧めします。 中国本土のリージョンでACKクラスターを既に作成している場合は、GitHubサービスプロバイダーを使用します。
この例では、フリートインスタンスと関連するACKクラスターが中国 (香港) リージョンにデプロイされています。
ステップ1: ACKクラスターにKruiseロールアウトをデプロイする
Kruise Rolloutをインストールします。
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、 を選択します。
[アドオン] ページで、[アプリケーションの管理] タブをクリックします。 ack-kruiseカードの右下隅にある [インストール] をクリックします。
表示されるメッセージで、情報を確認して [OK] をクリックします。
ステップ2: ACK One GitOpsを使用してアプリケーションをデプロイする
GitOpsを使用して、次の方法でアプリケーションをデプロイできます。
ArgoCD CLIを使用してアプリケーションをデプロイします。 次の例は、この方法を使用してアプリケーションをデプロイする方法を示しています。
GitOpsコンソールを使用してアプリケーションをデプロイします。 詳細については、「GitOpsの操作」をご参照ください。
次のコマンドを実行してGitリポジトリを追加します。
argocd repo add https://github.com/openkruise/samples.git --name gitops-demo期待される出力:
Repository 'https://github.com/openkruise/samples.git' added次のコマンドを実行して、Gitリポジトリを照会します。
argocd repo list期待される出力:
TYPE NAME REPO INSECURE OCI LFS CREDS STATUS MESSAGE PROJECT git gitops-demo https://github.com/openkruise/samples.git false false false false Successful次のコマンドを実行してクラスターを照会します。
argocd cluster list期待される出力:
SERVER NAME VERSION STATUS MESSAGE PROJECT https://192.168.XX.XX:6443 c76073b011afb4de2a8****-ack-gitops-demo-192-10-110-0-0-16 1.26+ Successful https://kubernetes.default.svc in-cluster Unknown Cluster has no applications and is not being monitored.次のコマンドを実行して、ArgoCD application CustomResourceDefinition (CRD) を定義してアプリケーションを作成します。
revisionは、安定したアプリケーションバージョンのタグを示します。argocd app create rollouts-demo --repo https://github.com/openkruise/samples.git --project default --sync-policy none --revision gitops-demo-version-stable --path gitops-demo --dest-namespace default --dest-server https://192.168.XX.XX:6443次のコマンドを実行して、アプリケーションを照会します。
argocd app list期待される出力:
NAME CLUSTER NAMESPACE PROJECT STATUS HEALTH SYNCPOLICY CONDITIONS REPO PATH TARGET rollouts-demo https://192.168.XX.XX:6443 default default OutOfSync Healthy <none> <none> https://github.com/openkruise/samples.git gitops-demo 616b4b6次のコマンドを実行して、アプリケーションを同期します。
argocd app sync rollouts-demo期待される出力:
Name: argocd/rollouts-demo Project: default Server: https://192.168.XX.XX:6443 Namespace: default URL: https://127.0.0.1:61231/applications/rollouts-demo Repo: https://github.com/openkruise/samples.git Target: 616b4b6 Path: gitops-demo SyncWindow: Sync Allowed Sync Policy: <none> Sync Status: Synced to 616b4b6 Health Status: Progressing Operation: Sync Sync Revision: 616b4b6e010ba4d71a92c0e7d050162956b169b7 Phase: Succeeded Start: 2023-08-07 16:02:12 +0800 CST Finished: 2023-08-07 16:02:13 +0800 CST Duration: 1s Message: successfully synced (all tasks run) GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE Service default echo-server Synced Healthy service/echo-server created apps Deployment default echo-server Synced Progressing deployment.apps/echo-server created networking.k8s.io Ingress default ingress-demo Synced Progressing ingress.networking.k8s.io/ingress-demo created rollouts.kruise.io Rollout default rollouts-demo Synced rollout.rollouts.kruise.io/rollouts-demo createdた
ArgoCD UIで、[アプリケーション] ページの [アプリケーションロールアウト-デモ] をクリックします。 アプリケーションの詳細を次の図に示します。

次のコマンドを実行して、ロールアウトステータスを照会します。
kubectl get rollout --kubeconfig <The path of the kubeconfig file of the cluster>重要クラスターで
kubectl get rolloutコマンドを実行して、ロールアウトステータスを照会します。 コマンドを実行するときに、クラスターのkubeconfigファイルのパスを指定する必要があります。KUBECONFIG環境変数を設定するか、他の方法を使用してクラスターのkubeconfigファイルのパスを指定することもできます。
期待される出力:
NAME STATUS CANARY_STEP CANARY_STATE MESSAGE AGE rollouts-demo Healthy 4 Completed workload deployment is completed 3m22s
ステップ3: カナリアリリースを実行する
Gitリポジトリのrollout.yamlファイルには、ロールアウト設定が記述されています。 次のロールアウト設定では、カナリアリリースの手順を説明します。
アプリケーションポッドの20% を古いバージョンから新しいバージョンに更新し、トラフィックの20% を新しいバージョンに転送します。 次のリリースフェーズに進むには、手動で確認する必要があります。
アプリケーションポッドの40% を古いバージョンから新しいバージョンに更新し、トラフィックの40% を新しいバージョンに転送します。 アプリケーションリリースは、60秒間中断されると自動的に再開されます。
アプリケーションポッドの60% を古いバージョンから新しいバージョンに更新し、トラフィックの60% を新しいバージョンに転送します。 アプリケーションリリースは、60秒間中断されると自動的に再開されます。
アプリケーションポッドの80% を古いバージョンから新しいバージョンに更新し、トラフィックの80% を新しいバージョンに転送します。 アプリケーションリリースは、60秒間中断されると自動的に再開されます。
apiVersion: rollouts.kruise.io/v1alpha1
kind: Rollout
metadata:
name: rollouts-demo
annotations:
rollouts.kruise.io/rolling-style: partition
spec:
objectRef:
workloadRef:
apiVersion: apps/v1
kind: Deployment
name: echo-server
strategy:
canary:
steps:
- replicas: 20%
weight: 20 # The application release is not suspended. You need to manually confirm to proceed to the next release phase.
- replicas: 40%
weight: 40
pause:
duration: 60
- replicas: 60%
weight: 60
pause:
duration: 60
- replicas: 80%
weight: 80
pause:
duration: 60
trafficRoutings:
- service: echo-server
ingress:
classType: nginx
name: ingress-demo次のコマンドを実行して、アプリケーションを新しいバージョンに更新します。
revisionは、新しいバージョンのタグを示します。argocd app sync rollouts-demo --revision gitops-demo-version-canary期待される出力:
Name: argocd/rollouts-demo Project: default Server: https://192.168.XX.XX:6443 Namespace: default URL: https://127.0.0.1:62461/applications/rollouts-demo Repo: https://github.com/openkruise/samples.git Target: 616b4b6 Path: gitops-demo SyncWindow: Sync Allowed Sync Policy: <none> Sync Status: OutOfSync from 616b4b6 Health Status: Progressing Operation: Sync Sync Revision: 3d14cc011bb090dd2243f70a3741e9b8f5332cb9 Phase: Succeeded Start: 2023-08-07 16:20:07 +0800 CST Finished: 2023-08-07 16:20:07 +0800 CST Duration: 0s Message: successfully synced (all tasks run) GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE Service default echo-server Synced Healthy service/echo-server unchanged apps Deployment default echo-server OutOfSync Suspended deployment.apps/echo-server configured networking.k8s.io Ingress default ingress-demo Synced Progressing ingress.networking.k8s.io/ingress-demo unchanged rollouts.kruise.io Rollout default rollouts-demo Synced rollout.rollouts.kruise.io/rollouts-demo configuredこのステップが完了するまで待ちます。 次のコマンドを実行して、ロールアウトステータスを確認します。
kubectl get rollout --kubeconfig <The path of the kubeconfig file of the cluster>重要クラスターで
kubectl get rolloutコマンドを実行して、ロールアウトステータスを照会します。 コマンドを実行するときに、クラスターのkubeconfigファイルのパスを指定する必要があります。KUBECONFIG環境変数を設定するか、他の方法を使用してクラスターのkubeconfigファイルのパスを指定することもできます。
次の出力が返された場合は、手動で次のリリースフェーズに進む必要があります。
NAME STATUS CANARY_STEP CANARY_STATE MESSAGE AGE rollouts-demo Progressing 1 StepPaused Rollout is in step(1/4), and you need manually confirm to enter the next step 7m57s次のコマンドを実行して、カナリアリリースを再開します。
kubectl-kruise rollout approve rollout/rollouts-demo --kubeconfig <The path of the kubeconfig file of the cluster>重要クラスターで
kubectl-kruiseコマンドを実行し、カナリアのリリースを再開します。 コマンドを実行するときに、クラスターのkubeconfigファイルのパスを指定する必要があります。KUBECONFIG環境変数を設定するか、他の方法を使用してクラスターのkubeconfigファイルのパスを指定することもできます。
期待される出力:
rollout.rollouts.kruise.io/rollouts-demo approvedこのステップが完了するまで待ちます。 次のコマンドを実行して、ロールアウトステータスを確認します。
kubectl get rollout --kubeconfig <The path of the kubeconfig file of the cluster>重要クラスターで
kubectl get rolloutコマンドを実行して、ロールアウトステータスを照会します。 コマンドを実行するときに、クラスターのkubeconfigファイルのパスを指定する必要があります。KUBECONFIG環境変数を設定するか、他の方法を使用してクラスターのkubeconfigファイルのパスを指定することもできます。
次の出力が返された場合、次のリリースフェーズは60秒後に開始されます。
NAME STATUS CANARY_STEP CANARY_STATE MESSAGE AGE rollouts-demo Progressing 2 StepPaused Rollout is in step(2/4), and wait duration(60 seconds) to enter the next step 9m56sKruise Rolloutは、リリースが完了するまで60秒ごとに次のリリースフェーズを開始します。
リリースが完了するまで待ちます。 次のコマンドを実行して、ロールアウトステータスを確認します。
kubectl get rollout --kubeconfig <The path of the kubeconfig file of the cluster>重要クラスターで
kubectl get rolloutコマンドを実行して、ロールアウトステータスを照会します。 コマンドを実行するときに、クラスターのkubeconfigファイルのパスを指定する必要があります。KUBECONFIG環境変数を設定するか、他の方法を使用してクラスターのkubeconfigファイルのパスを指定することもできます。
次の出力が返されると、リリースは完了です。
NAME STATUS CANARY_STEP CANARY_STATE MESSAGE AGE rollouts-demo Healthy 4 Completed Rollout progressing has been completed 15m完了しました
(オプション) ステップ4: カナリアのリリースをロールバックする
カナリアリリース中にアプリケーションでエラーが発生した場合は、改訂パラメーターを古いバージョンのタグに設定し、変更をGitHubにコミットしてアプリケーションをロールバックできます。
次のコマンドを実行して、古いバージョンにロールバックします。 revisionは古いバージョンのタグを示します。
argocd app sync rollouts-demo --revision gitops-demo-version-stable期待される出力:
Project: default
Server: https://192.168.XX.XX:6443
Namespace: default
URL: https://127.0.0.1:49922/applications/rollouts-demo
Repo: https://github.com/Kuromesi/samples.git
Target: 616b4b6
Path: gitops-demo
SyncWindow: Sync Allowed
Sync Policy: <none>
Sync Status: Synced to 616b4b6
Health Status: Progressing
Operation: Sync
Sync Revision: 616b4b6e010ba4d71a92c0e7d050162956b169b7
Phase: Succeeded
Start: 2023-08-07 16:52:53 +0800 CST
Finished: 2023-08-07 16:52:54 +0800 CST
Duration: 1s
Message: successfully synced (all tasks run)
GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE
Service default echo-server Synced Healthy service/echo-server unchanged
apps Deployment default echo-server Synced Suspended deployment.apps/echo-server configured
networking.k8s.io Ingress default ingress-demo Synced Progressing ingress.networking.k8s.io/ingress-demo unchanged
rollouts.kruise.io Rollout default rollouts-demo Synced rollout.rollouts.kruise.io/rollouts-demo unchanged