第5章 OpenShift Service Mesh の Argo Rollouts を使用したトラフィックのルーティング
Red Hat OpenShift GitOps の Argo Rollouts は、OpenShift Routes や Istio ベースの OpenShift Service Mesh などのさまざまなトラフィック管理メカニズムをサポートします。
Argo Rollouts で使用するトラフィックマネージャーの選択は、クラスターワークロードをデプロイするために使用している既存のトラフィック管理ソリューションによって異なります。たとえば、Red Hat OpenShift Routes は基本的なトラフィック管理機能を提供するため、サイドカーコンテナーを使用する必要はありません。ただし、Red Hat OpenShift Service Mesh は Istio を使用して、より高度なルーティング機能を提供しますが、サイドカーコンテナーの設定が必要です。
OpenShift Service Mesh を使用して、2 つのアプリケーションバージョン間でトラフィックを分割できます。
- canary バージョン: トラフィックを段階的にルーティングするアプリケーションの新しいバージョン。
- 安定バージョン: アプリケーションの最新バージョン。canary バージョンが安定し、すべてのユーザートラフィックがそのバージョンに送信されるようになると、canary バージョンが新しい安定バージョンになります。以前の安定バージョンは破棄されます。
Argo Rollouts 内の Istio サポートは、ゲートウェイおよび VirtualService リソースを使用してトラフィックルーティングを処理します。
- Gateway: ゲートウェイを使用して、メッシュの受信トラフィックと送信トラフィックを管理できます。ゲートウェイは OpenShift Service Mesh のエントリーポイントであり、アプリケーションに送信されるトラフィック要求を処理します。
- VirtualService: VirtualService は、トラフィックルーティングルールと、stable サービスや canary サービスなどの基盤となるサービスに送信されるトラフィックの割合を定義します。
デプロイメントシナリオの例
たとえば、サンプルのデプロイメントシナリオでは、初期インスタンス中にトラフィックの 100% がアプリケーションの stable バージョンに送信されます。アプリケーションは想定どおりに実行されており、新規バージョンのデプロイは追加で試行されません。
ただし、アプリケーションの新しいバージョンをデプロイした後、Argo Rollouts はアプリケーションの新しいバージョンに基づいて新しい canary アデプロイメントを作成し、トラフィックの一部がその新しいバージョンにルーティングされます。
Service Mesh を使用すると、Argo Rollouts は VirtualService リソースを自動的に変更して、stable アプリケーションバージョンと canary アプリケーションバージョン間でトラフィック分割されたパーセンテージを制御します。以下の図では、トラフィックの 20% が最初のプロモーション後に canary アプリケーションバージョンに送信され、80% は stable サービスによって stable バージョンに送信されます。
5.1. OpenShift Service Mesh を使用してトラフィックをルーティングするように Argo Rollouts を設定する リンクのコピーリンクがクリップボードにコピーされました!
次の項目を作成することで、OpenShift Service Mesh を使用して Argo Rollouts を設定できます。
- ゲートウェイ
- 2 つの Kubernetes サービス: stable と canary。これらはサービスの各バージョン内の Pod を指します。
- VirtualService
- rollout カスタムリソース (CR)
以下の手順例では、ロールアウトによってトラフィックの 20% が canary バージョンにルーティングされます。手動プロモーションの後、ロールアウトによってトラフィックの 40% がルーティングされます。別の手動プロモーションの後、すべてのトラフィックが新しいアプリケーションバージョンにルーティングされるまで、ロールアウトは複数の自動プロモーションを実行します。
前提条件
- 管理者として OpenShift Container Platform クラスターにログインしている。
- OpenShift Container Platform クラスターに Red Hat OpenShift GitOps がインストールされている。
- OpenShift Container Platform クラスターに Argo Rollouts がインストールされている。
- システムに Argo Rollouts CLI がインストールされている。
- OpenShift Service Mesh Operator をクラスターにインストールし、ServiceMeshControlPlane を設定している。
手順
メッシュの受信トラフィックを受け入れる
Gateway
オブジェクトを作成します。次のスニペットコンテンツを含む YAML ファイルを作成します。
rollouts-demo-gateway
というサンプルゲートウェイCopy to Clipboard Copied! Toggle word wrap Toggle overflow 以下のコマンドを実行して、YAML ファイルを適用します。
oc apply -f gateway.yaml
$ oc apply -f gateway.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
アプリケーションの canary および stable バージョンのサービスを作成します。
-
Web コンソールの Administrator パースペクティブで、Networking
Services に移動します。 - Create Service をクリックします。
Create Service ページで、YAML view をクリックし、以下のスニペットを追加します。次の例では、
rollouts-demo-stable
という安定したサービスを作成します。安定したトラフィックがこのサービスに送られます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Create をクリックして stable サービスを作成します。
Create Service ページで、YAML view をクリックし、以下のスニペットを追加します。以下の例では、
rollouts-demo-canary
という canary サービスを作成します。canary トラフィックはこのサービスに転送されます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Create をクリックして canary サービスを作成します。
-
Web コンソールの Administrator パースペクティブで、Networking
着信トラフィックを stable サービスと canary サービスにルーティングするための VirtualService を作成します。
YAML ファイルを作成し、以下の YAML をこれにコピーします。以下の例では、
rollouts-demo-vsvc
という名前のVirtualService
を作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下のコマンドを実行して、YAML ファイルを適用します。
oc apply -f virtual-service.yaml
$ oc apply -f virtual-service.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Rollout
CR を作成します。この例では、Istio
がトラフィックマネージャーとして使用されます。-
Web コンソールの Administrator パースペクティブで、Operator
Installed Operator Red Hat OpenShift GitOps Rollout に移動します。 Create Rollout ページで、YAML view をクリックし、以下のスニペットを追加します。次の例では、
rollouts-demo
というRollout
CR を作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Create をクリックします。
- Rollout タブの Rollout セクションで、ロールアウトの Status フィールドに Phase: Healthy と表示されていることを確認します。
-
Web コンソールの Administrator パースペクティブで、Operator
ルートがトラフィックの 100% をアプリケーションの安定バージョンに送信していることを確認します。
次のコマンドを実行して、ロールアウトの進行状況を確認します。
oc argo rollouts get rollout rollouts-demo --watch -n <namespace>
$ oc argo rollouts get rollout rollouts-demo --watch -n <namespace>
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
Rollout
リソースが定義されている namespace を指定します。
出力例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記Rollout
リソースの最初のインスタンスが作成されると、ロールアウトによって、stable バージョンおよび canary バージョンのアプリケーションに送信されるトラフィックの量が調整されます。最初のインスタンスでは、Rollout
リソースの作成により、すべてのトラフィックがアプリケーションの stable バージョンにルーティングされ、トラフィックが canary バージョンに送信される部分がスキップされます。サービスメッシュが stable サービスに対してトラフィックの 100% を送信し、canary サービスに対して 0% を送信していることを確認するには、次のコマンドを実行します。
oc describe virtualservice/rollouts-demo-vsvc -n <namespace>
$ oc describe virtualservice/rollouts-demo-vsvc -n <namespace>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ターミナルに表示される以下の出力を表示します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
ロールアウトでデプロイされたコンテナーイメージを変更して、アプリケーションの新しい canary バージョンをシミュレートします。
次のコマンドを実行して、
.spec.template.spec.containers.image
の値をargoproj/rollouts-demo:blue
からargoproj/rollouts-demo:yellow
に変更します。oc argo rollouts set image rollouts-demo rollouts-demo=argoproj/rollouts-demo:yellow -n <namespace>
$ oc argo rollouts set image rollouts-demo rollouts-demo=argoproj/rollouts-demo:yellow -n <namespace>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow その結果、ロールアウトにデプロイされたコンテナーイメージが変更され、ロールアウトによって新規の canary デプロイメントが開始されます。
注記Rollout
リソースの.spec.strategy.canary.steps
フィールドで定義されているsetWeight
プロパティーに従って、最初はルートへのトラフィックの 20% が canary バージョンに到達し、トラフィックの 80% が stable バージョンに向けられます。トラフィックの 20% が canary バージョンに転送されると、ロールアウトは一時停止されます。次のコマンドを実行して、ロールアウトの進行状況を確認します。
oc argo rollouts get rollout rollouts-demo --watch -n <namespace>
$ oc argo rollouts get rollout rollouts-demo --watch -n <namespace>
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
Rollout
リソースが定義されている namespace を指定します。
次の例では、トラフィックの 80% が stable サービスにルーティングされ、トラフィックの 20% が canary サービスにルーティングされます。手動で次のレベルにプロモートするまで、デプロイメントは無期限に一時停止されます。
出力例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow トラフィックの 80% が canary バージョンに送られ、20% が stable バージョンに送られるルートの例。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
デプロイメントを手動で次のプロモート手順にプロモートします。
oc argo rollouts promote rollouts-demo -n <namespace>
$ oc argo rollouts promote rollouts-demo -n <namespace>
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
Rollout
リソースが定義されている namespace を指定します。
次のコマンドを実行して、ロールアウトの進行状況を確認します。
oc argo rollouts get rollout rollouts-demo --watch -n <namespace>
$ oc argo rollouts get rollout rollouts-demo --watch -n <namespace>
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
Rollout
リソースが定義されている namespace を指定します。
次の例では、トラフィックの 60% が stable サービスにルーティングされ、トラフィックの 40% が canary サービスにルーティングされます。手動で次のレベルにプロモートするまで、デプロイメントは無期限に一時停止されます。
出力例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 60% のトラフィックが stable バージョンに送られ、40% が canary バージョンに送られる例。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
次のコマンドを実行して、canary バージョンのトラフィックの重みを 100% に増やし、アプリケーションの以前の stable バージョンのトラフィックを破棄します。
oc argo rollouts promote rollouts-demo -n <namespace>
$ oc argo rollouts promote rollouts-demo -n <namespace>
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
Rollout
リソースが定義されている namespace を指定します。
次のコマンドを実行して、ロールアウトの進行状況を確認します。
oc argo rollouts get rollout rollouts-demo --watch -n <namespace>
$ oc argo rollouts get rollout rollouts-demo --watch -n <namespace>
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
Rollout
リソースが定義されている namespace を指定します。
正常に完了すると、stable サービスに対する重みは 100%、canary サービスに対する重みは 0% になります。