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

Container Service for Kubernetes:Kruise Rolloutを使用して、ACK One GitOpsに基づくカナリアリリースを実装する

最終更新日:Nov 14, 2024

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を使用したカナリアリリースの実行方法を示しています。

image

使用上の注意

  • GitHubリポジトリを使用する場合は、中国本土のリージョンにACKクラスターを作成しないことをお勧めします。 中国本土のリージョンでACKクラスターを既に作成している場合は、GitHubサービスプロバイダーを使用します。

  • この例では、フリートインスタンスと関連するACKクラスターが中国 (香港) リージョンにデプロイされています。

ステップ1: ACKクラスターにKruiseロールアウトをデプロイする

Kruise Rolloutをインストールします。

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

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

  3. [アドオン] ページで、[アプリケーションの管理] タブをクリックします。 ack-kruiseカードの右下隅にある [インストール] をクリックします。

  4. 表示されるメッセージで、情報を確認して [OK] をクリックします。

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

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

  • ArgoCD CLIを使用してアプリケーションをデプロイします。 次の例は、この方法を使用してアプリケーションをデプロイする方法を示しています。

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

  1. 次のコマンドを実行して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
  2. 次のコマンドを実行してクラスターを照会します。

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

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

    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

  6. ArgoCD UIで、[アプリケーション] ページの [アプリケーションロールアウト-デモ] をクリックします。 アプリケーションの詳細を次の図に示します。

    image.png

  7. 次のコマンドを実行して、ロールアウトステータスを照会します。

    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
  1. 次のコマンドを実行して、アプリケーションを新しいバージョンに更新します。 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
  2. このステップが完了するまで待ちます。 次のコマンドを実行して、ロールアウトステータスを確認します。

    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
  3. 次のコマンドを実行して、カナリアリリースを再開します。

    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
  4. このステップが完了するまで待ちます。 次のコマンドを実行して、ロールアウトステータスを確認します。

    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 9m56s
  5. Kruise Rolloutは、リリースが完了するまで60秒ごとに次のリリースフェーズを開始します。

  6. リリースが完了するまで待ちます。 次のコマンドを実行して、ロールアウトステータスを確認します。

    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

関連ドキュメント