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

Container Service for Kubernetes:ACK One GitopsとArgo Rolloutsを使用してカナリアリリースを実行する

最終更新日:Oct 21, 2024

ACK Oneは、Argo CD GitOps機能を統合し、Argo Rolloutsという名前のプログレッシブロールアウトコンポーネントと連携して、Gitコミットに基づく自動カナリアリリースをサポートします。 このトピックでは、ACK One GitopsとArgo Rolloutsを使用してカナリアリリースを実行する方法について説明します。

前提条件

条件

GitOpsの用語を表示

GitOps

GitOpsは、Gitリポジトリを使用してアプリケーションテンプレートを管理し、アプリケーションの継続的なデプロイを実装するフレームワークです。 GitOpsフレームワークでは、新しいアプリケーション構成を継続的にデプロイするための単一の真実のソースとしてGitが使用されます。 GitOpsの詳細については、「GitOps overview」をご参照ください。

image

Argo Rolloutsの用語を表示

Argo Rollouts

Argo Rolloutsは、ブルーグリーンリリース、カナリアリリース、Kubernetesプログレッシブ配信などの高度なデプロイ機能を提供するKubernetesコントローラーです。 Argo Rolloutsの詳細については、Argo Rolloutsとは何ですか?

image

カナリアリリース条件の表示

カナリアリリース

カナリアリリースは展開戦略です。 カナリアリリース戦略を使用すると、運用環境全体に展開する前に、新しいバージョンのアプリケーションを少量のユーザーにゆっくりと展開することができます。 カナリアリリースを実行するには、アプリケーションバージョンが、Ingressコントローラーに基づくトラフィック制御などのトラフィック制御をサポートしている必要があります。

カナリアリリースのメリット

カナリアリリース戦略に基づいて、ステージング環境ではなく実稼働環境でアプリケーションバージョンを確認できます。 新しいバージョンでエラーが発生した場合、新しいバージョンのユーザーのサブセットのみが影響を受けます。 トラフィックを以前のバージョンにリダイレクトすることで、バージョンをすばやくロールバックできます。

カナリアリリースワークフロー

image

使用上の注意

  • 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コンポーネントをデプロイする

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

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

  3. ACKコンソールの [アドオン] ページで、[ログとモニタリング] タブをクリックし、[ack-arms-prometheus] を見つけます。

    • カードにInstalledが表示されている場合、システムがackクラスターを作成するときにACK-arms-prometheusコンポーネントがすでにインストールされています。

    • カードに [インストール] が表示されている場合は、[インストール] をクリックしてコンポーネントをACKクラスターにインストールします。

ステップ3: ACK One GitOpsを使用してアプリケーションをデプロイする

GitOpsを使用して、次のいずれかの方法でアプリケーションをデプロイできます。

  • Argo CD CLIを使用してアプリケーションをデプロイします。 Argo CD CLIを使用してアプリケーションをデプロイする方法を次の例に示します。

  • GitOpsコンソールを使用してアプリケーションをデプロイします。 詳細については、「GitOpsの使い方」をご参照ください。

  1. 次のコマンドを実行してGitリポジトリを追加します。

    argocd repo add https://github.com/AliyunContainerService/gitops-demo.git --name gitops-demo

    期待される出力:

    Repository 'https://github.com/AliyunContainerService/gitops-demo.git' added
  2. 次のコマンドを実行して、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
  3. 次のコマンドを実行してクラスターを照会します。

    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.
  4. 次のコマンドを実行して、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 
  5. 次のコマンドを実行して、アプリケーションを照会します。

    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
  6. 次のコマンドを実行して、ロールアウトステータスを照会します。

    kubectl argo rollouts get rollout rollouts-demo --watch

    期待される出力:

    1234..png

ステップ4: カナリアリリースを実行する

Argo Rolloutsを使用してカナリアリリースを実行する場合、次のいずれかの方法を使用して、新しいアプリケーションバージョンが期待どおりに機能するかどうかを確認し、検証結果に基づいて新しいバージョンにルーティングされるトラフィックの重みを増やすか、すべてのトラフィックを新しいバージョンにルーティングできます。 新しいアプリケーションバージョンが期待どおりに機能するかどうかを手動で確認したり、Managed Service for Prometheusを使用して新しいアプリケーションバージョンからパフォーマンスメトリックを収集したりできます。

新しいアプリケーションのバージョンを手動で確認する

  1. 次のサンプルコードに基づいて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        
  2. 次のコマンドを実行して、ロールアウトステータスを照会します。

    kubectl argo rollouts get rollout rollouts-demo --watch

    期待される出力:

    123..png

    rollout.yamlファイルの最初の一時停止には期間が指定されていません。 したがって、カナリアの解放は、再開または昇進した場合にのみ継続できます。

  3. カナリアのリリースを再開します。

    1. 次のサンプルコードに基づいてrollout.yamlファイルを変更し、ファイルを保存して送信します。

            steps:
              - setWeight: 20
              - pause: {duration: 10s}   # Specify the duration of the pause.

    2. 次のコマンドを実行して、カナリアリリースを再開します。

      kubectl argo rollouts get rollout rollouts-demo --watch

      期待される出力: 3..png

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

    4..png

Prometheusのマネージドサービスを使用したメトリクスの収集

  1. 次のサンプルコードに基づいて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# 新しい画像タグを指定します。         
  2. 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です。

  3. 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]))
              )
  4. Managed Service for Prometheusが継続的にメトリックデータを収集できることを確認してください。

    1. 次のコマンドを実行して、アプリケーションの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 
    2. ローカルのHostsファイルに次の設定を追加します。

      8.217.XX.XXロールアウト-demo.local
    3. 別のコマンドプロンプトを開き、次のコマンドを実行して、アプリケーションに要求を継続的に送信します。

      while true; do curl -s "http:// rollouts-demo.local/" | grep -o "<title>.*</title>" ;sleep 200ms;done
  5. 次のコマンドを実行して、ロールアウトステータスを照会します。

    kubectl argo rollouts get rollout rollouts-demo -- watch

    期待される出力:

    自动..png

  6. Prometheusのマネージドサービスによって収集されたメトリクスを表示します。

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

    2. [クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、[操作] > [Prometheusモニタリング] を選択します。

    3. [Prometheus Monitoring] ページで、[Network Monitoring] タブをクリックし、[Ingress] タブをクリックします。

      次の図は、メトリックを示しています。

      arms..png

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

    自动发布完成..png

オプション。 ステップ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.

期待される出力:

回滚..png

関連ドキュメント