ACK Oneは、Argo CD GitOps機能を統合し、Argo Rolloutsという名前のプログレッシブロールアウトコンポーネントと連携して、Gitコミットに基づく自動カナリアリリースをサポートします。 このトピックでは、ACK One GitopsとArgo Rolloutsを使用してカナリアリリースを実行する方法について説明します。
前提条件
フリート管理機能が有効になっています。 詳細については、「マルチクラスター管理の有効化」をご参照ください。
Container Service for Kubernetes (ACK) クラスターが作成され、ACK Oneフリートインスタンスに関連付けられます。 詳細については、「マネージド Kubernetes クラスターの作成」および「関連クラスターの管理」トピックの「クラスターとフリートインスタンスの関連付け」セクションをご参照ください。
FleetインスタンスのkubeconfigファイルはDistributed Cloud Container Platform for Kubernetes (ACK One) コンソールで取得され、kubectlクライアントはFleetインスタンスに接続されています。
Argo Rollouts kubectlプラグインの最新バージョンがインストールされています。 詳細については、「コントローラーのインストール」をご参照ください。
条件
使用上の注意
GitHubリポジトリを使用する場合は、中国本土のリージョンにACKクラスターを作成しないことをお勧めします。 中国本土のリージョンでACKクラスターを既に作成している場合は、GitHubサービスプロバイダーを使用します。
この例では、フリートインスタンスと関連するACKクラスターが中国 (香港) リージョンにデプロイされています。
手順1: Argo RolloutsコンポーネントをACKクラスターにデプロイする
次のコマンドを実行して、Argo RolloutsコンポーネントをACKクラスターにデプロイします。 Argo Rolloutsコンポーネントのインストール方法の詳細については、「Controllerのインストール」をご参照ください。
kubectl create namespace argo-rollouts
kubectl apply -n argo-rollouts -f https://github.com/argoproj/argo-rollouts/releases/latest/download/install.yaml手順2: ackクラスターにACK-arms-prometheusコンポーネントをデプロイする
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、 を選択します。
ACKコンソールの [アドオン] ページで、[ログとモニタリング] タブをクリックし、[ack-arms-prometheus] を見つけます。
カードにInstalledが表示されている場合、システムがackクラスターを作成するときにACK-arms-prometheusコンポーネントがすでにインストールされています。
カードに [インストール] が表示されている場合は、[インストール] をクリックしてコンポーネントをACKクラスターにインストールします。
ステップ3: ACK One GitOpsを使用してアプリケーションをデプロイする
GitOpsを使用して、次のいずれかの方法でアプリケーションをデプロイできます。
Argo CD CLIを使用してアプリケーションをデプロイします。 Argo CD CLIを使用してアプリケーションをデプロイする方法を次の例に示します。
GitOpsコンソールを使用してアプリケーションをデプロイします。 詳細については、「GitOpsの使い方」をご参照ください。
次のコマンドを実行してGitリポジトリを追加します。
argocd repo add https://github.com/AliyunContainerService/gitops-demo.git --name gitops-demo期待される出力:
Repository 'https://github.com/AliyunContainerService/gitops-demo.git' added次のコマンドを実行して、Gitリポジトリを照会します。
argocd repo list期待される出力:
TYPE NAME REPO INSECURE OCI LFS CREDS STATUS MESSAGE PROJECT git gitops-demo https://github.com/AliyunContainerService/gitops-demo.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.次のコマンドを実行して、Argo CD application CustomResourceDefinition (CRD) を定義してアプリケーションを作成します。
argocd app create rollouts-demo --repo https://github.com/AliyunContainerService/gitops-demo.git --project default --sync-policy automated --revision rollouts --path . --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 Synced Healthy Auto <none> https://github.com/AliyunContainerService/gitops-demo.git . rollouts次のコマンドを実行して、ロールアウトステータスを照会します。
kubectl argo rollouts get rollout rollouts-demo --watch期待される出力:

ステップ4: カナリアリリースを実行する
Argo Rolloutsを使用してカナリアリリースを実行する場合、次のいずれかの方法を使用して、新しいアプリケーションバージョンが期待どおりに機能するかどうかを確認し、検証結果に基づいて新しいバージョンにルーティングされるトラフィックの重みを増やすか、すべてのトラフィックを新しいバージョンにルーティングできます。 新しいアプリケーションバージョンが期待どおりに機能するかどうかを手動で確認したり、Managed Service for Prometheusを使用して新しいアプリケーションバージョンからパフォーマンスメトリックを収集したりできます。
新しいアプリケーションのバージョンを手動で確認する
次のサンプルコードに基づいてrollout.yamlファイルを変更し、ファイルを保存して送信します。
apiVersion: argoproj.io/v1alpha1 kind: Rollout metadata: name: rollouts-demo spec: replicas: 4 strategy: canary: # You do not need to configure metric analysis. canaryService: rollouts-demo-canary stableService: rollouts-demo-stable trafficRouting: nginx: stableIngress: rollouts-demo-stable steps: - setWeight: 20 - pause: {} # Pause the canary release. The canary release continues only if it is resumed or promoted. - setWeight: 40 - pause: {duration: 5m} - setWeight: 60 - pause: {duration: 5m} - setWeight: 80 - pause: {duration: 5m} revisionHistoryLimit: 2 selector: matchLabels: app: rollouts-demo template: metadata: labels: app: rollouts-demo spec: containers: - name: rollouts-demo image: argoproj/rollouts-demo:yellow # Modify the image tag. ports: - name: http containerPort: 8080 protocol: TCP resources: requests: memory: 32Mi cpu: 5m次のコマンドを実行して、ロールアウトステータスを照会します。
kubectl argo rollouts get rollout rollouts-demo --watch期待される出力:

rollout.yamlファイルの最初の
一時停止には期間が指定されていません。 したがって、カナリアの解放は、再開または昇進した場合にのみ継続できます。カナリアのリリースを再開します。
次のサンプルコードに基づいてrollout.yamlファイルを変更し、ファイルを保存して送信します。
steps: - setWeight: 20 - pause: {duration: 10s} # Specify the duration of the pause.次のコマンドを実行して、カナリアリリースを再開します。
kubectl argo rollouts get rollout rollouts-demo --watch期待される出力:

カナリアのリリースが完了すると、次の図の結果が返されます。

Prometheusのマネージドサービスを使用したメトリクスの収集
次のサンプルコードに基づいてrollout.yamlファイルを変更し、ファイルを保存して送信します。
戦略: カナリア: analysis: # メトリック分析を設定します。 templates: # メトリック分析テンプレートを設定します。 -templateName: success-rate startingStep: 2# setWeight: 40% まで分析の開始を遅らせる args: -name: サービス名 値: rollouts-demo-stable canaryService: rollouts-demo-canary stableService: rollouts-demo-stable trafficRouting: nginx: stableIngress: rollouts-demo-stable steps: -setWeight: 20 -一時停止: {duration: 5m} -setWeight: 40 -一時停止: {duration: 5m} -setWeight: 60 -一時停止: {duration: 5m} -setWeight: 80 -一時停止: {duration: 5m} revisionHistoryLimit: 2 セレクタ: matchLabels: app: rollouts-デモ template: metadata: labels: app: rollouts-デモ 仕様: containers: -name: rollouts-デモ image: argoproj/rollouts-demo:blue# 新しい画像タグを指定します。Prometheusのマネージドサービスのエンドポイントを取得します。
マネージドサービスfor Prometheusは、Kubernetes Serviceアドレスを介して次の形式で公開されます。
{ServiceName}.{Namespace}.svc.{ClusterDomain }:{ ServicePort}。 この例では、PrometheusのManaged Serviceを公開するサービスがarms-prom名前空間にデプロイされます。 サービスの名前はarms-prom-server、デフォルトのClusterDomainはcluster.local、サービスポートは9090です。 したがって、Prometheusのマネージドサービスのエンドポイントはhttp:// arms-prom-server.arms-prom.svc.cluster.local:9090です。Managed Service for Prometheusメトリックコレクションに関連する設定をanalysis.yamlファイルに追加します。
addressパラメーターの値を、前の手順で取得したPrometheusのManaged Serviceのエンドポイントに設定します。 次のサンプルコードでは、カナリアリリースの成功を確認するための条件が追加されています。 成功したカナリアリクエストの比率がメトリック収集サイクル内で95% に達した場合、カナリアリリースは成功したと見なされ、自動的に次のフェーズに進みます。 メトリクスの設定方法の詳細については、「Prometheus metrics」をご参照ください。apiVersion: argoproj.io/v1alpha 1 kind: AnalysisTemplate メタデータ: 名前: success-rate spec: args: -name: サービス名 metrics: -name: success-rate 間隔: 5m successCondition: result[0] >= 0.95# カナリアリリースが成功したことを確認する条件を追加します。 failureLimit: 10 プロバイダー: prometheus: # メトリック収集サービスのエンドポイントを指定します。 address: http:// arms-prom-server.arms-prom.svc.cluster.local:9090# 前の手順で取得したPrometheusのManaged Serviceのエンドポイントを指定します。 クエリ: | sum( irate(nginx_ingress_controller_requests{status=~ "(1 | 2).*", canary!=" ,service="{{args.service-name}}"}[5m])) / sum(irate(nginx_ingress_controller_requests{canary!="",service="{{args.service-name}}"}[5m])) )Managed Service for Prometheusが継続的にメトリックデータを収集できることを確認してください。
次のコマンドを実行して、アプリケーションのIngressを照会します。
kubectl get ingress期待される出力:
NAME CLASS HOSTS ADDRESS PORTS AGE rollouts-demo-rollouts-demo-stable-canary nginx rollouts-demo.local 8.217.XX.XX 80 9h ロールアウト-デモ安定nginx rollouts-demo.local 8.217.XX.XX 80 9hローカルのHostsファイルに次の設定を追加します。
8.217.XX.XXロールアウト-demo.local別のコマンドプロンプトを開き、次のコマンドを実行して、アプリケーションに要求を継続的に送信します。
while true; do curl -s "http:// rollouts-demo.local/" | grep -o "<title>.*</title>" ;sleep 200ms;done
次のコマンドを実行して、ロールアウトステータスを照会します。
kubectl argo rollouts get rollout rollouts-demo -- watch期待される出力:

Prometheusのマネージドサービスによって収集されたメトリクスを表示します。
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、 を選択します。
[Prometheus Monitoring] ページで、[Network Monitoring] タブをクリックし、[Ingress] タブをクリックします。
次の図は、メトリックを示しています。

カナリアのリリースが完了すると、次の図の結果が返されます。

オプション。 ステップ5: カナリアリリースをロールバックする
アプリケーションでカナリアリリース中にエラーが発生した場合は、次の操作を実行して、canaryリリースをロールバックするようにrollout.yamlファイルを変更できます。
次のサンプルコードに基づいてrollout.yamlファイルを変更し、ファイルを保存して送信します。
spec:
containers:
- name: rollouts-demo
image: argoproj/rollouts-demo:yellow # Specify the image tag of a stable application version, save the file, and then submit the file to the Git repository.
期待される出力:
