5.3. トラフィック管理
Knative アプリケーションでは、トラフィック分割を作成することでトラフィックを管理できます。トラフィック分割は、Knative サービスによって管理されるルートの一部として設定されます。
ルートを設定すると、サービスのさまざまなリビジョンにリクエストを送信できます。このルーティングは、Service
オブジェクトの traffic
仕様によって決定されます。
traffic
仕様宣言は、1 つ以上のリビジョンで設定され、それぞれがトラフィック全体の一部を処理する責任があります。各リビジョンにルーティングされるトラフィックの割合は、合計で 100% になる必要があります。これは、Knative 検証によって保証されます。
traffic
仕様で指定されたリビジョンは、固定の名前付きリビジョンにすることも、サービスのすべてのリビジョンのリストの先頭を追跡する最新のリビジョンを指すこともできます。最新のリビジョンは、新しいリビジョンが作成された場合に更新される一種のフローティング参照です。各リビジョンには、そのリビジョンの追加のアクセス URL を作成するタグを付けることができます。
traffic
仕様は次の方法で変更できます。
-
Service
オブジェクトの YAML を直接編集します。 -
Knative (
kn
) CLI--traffic
フラグを使用します。 - OpenShift Container Platform Web コンソールの使用
Knative サービスの作成時に、デフォルトの traffic
仕様設定は含まれません。
5.3.1. トラフィックスペックの例
以下の例は、トラフィックの 100% がサービスの最新リビジョンにルーティングされる traffic
仕様を示しています。status
では、latestRevision
が解決する最新リビジョンの名前を確認できます。
apiVersion: serving.knative.dev/v1 kind: Service metadata: name: example-service namespace: default spec: ... traffic: - latestRevision: true percent: 100 status: ... traffic: - percent: 100 revisionName: example-service
以下の例は、トラフィックの 100% が current
としてタグ付けされたリビジョンにルーティングされ、そのリビジョンの名前が example-service
として指定される traffic
仕様を示しています。latest
とタグ付けされたリビジョンは、トラフィックが宛先にルーティングされない場合でも、利用可能な状態になります。
apiVersion: serving.knative.dev/v1 kind: Service metadata: name: example-service namespace: default spec: ... traffic: - tag: current revisionName: example-service percent: 100 - tag: latest latestRevision: true percent: 0
以下の例は、トラフィックが複数のリビジョン間で分割されるように、traffic
仕様のリビジョンの一覧を拡張する方法を示しています。この例では、トラフィックの 50% を、current
としてタグ付けされたリビジョンに送信します。また、candidate
としてタグ付けされたリビジョンにトラフィックの 50% を送信します。latest
とタグ付けされたリビジョンは、トラフィックが宛先にルーティングされない場合でも、利用可能な状態になります。
apiVersion: serving.knative.dev/v1 kind: Service metadata: name: example-service namespace: default spec: ... traffic: - tag: current revisionName: example-service-1 percent: 50 - tag: candidate revisionName: example-service-2 percent: 50 - tag: latest latestRevision: true percent: 0
5.3.2. Knative CLI トラフィック管理フラグ
Knative (kn
) CLI は kn service update
コマンドの一環として、サービスのトラフィックブロックでのトラフィック操作をサポートします。
以下の表は、トラフィック分割フラグ、値の形式、およびフラグが実行する操作の概要を表示しています。Repetition 列は、フラグの特定の値が kn service update
コマンドで許可されるかどうかを示します。
フラグ | 値 | 操作 | 繰り返し |
---|---|---|---|
|
|
| はい |
|
|
| はい |
|
|
| いいえ |
|
|
| はい |
|
|
| いいえ |
|
|
リビジョンから | はい |
5.3.2.1. 複数のフラグおよび順序の優先順位
すべてのトラフィック関連のフラグは、単一の kn service update
コマンドを使用して指定できます。kn
は、これらのフラグの優先順位を定義します。コマンドの使用時に指定されるフラグの順番は考慮に入れられません。
kn
で評価されるフラグの優先順位は以下のとおりです。
-
--untag
: このフラグで参照されるすべてのリビジョンはトラフィックブロックから削除されます。 -
--tag
: リビジョンはトラフィックブロックで指定されるようにタグ付けされます。 -
--traffic
: 参照されるリビジョンには、分割されたトラフィックの一部が割り当てられます。
タグをリビジョンに追加してから、設定したタグに応じてトラフィックを分割することができます。
5.3.2.2. リビジョンのカスタム URL
kn service update
コマンドを使用して --tag
フラグをサービスに割り当てると、サービスの更新時に作成されるリビジョンのカスタム URL が作成されます。カスタム URL は、https://<tag>-<service_name>-<namespace>.<domain>
パターンまたは http://<tag>-<service_name>-<namespace>.<domain>
パターンに従います。
--tag
フラグおよび --untag
フラグは以下の構文を使用します。
- 1 つの値が必要です。
- サービスのトラフィックブロックに一意のタグを示します。
- 1 つのコマンドで複数回指定できます。
5.3.2.2.1. 例: リビジョンへのタグの割り当て
以下の例では、タグ latest
を、example-revision
という名前のリビジョンに割り当てます。
$ kn service update <service_name> --tag @latest=example-tag
5.3.2.2.2. 例: リビジョンからのタグの削除
--untag
フラグを使用して、カスタム URL を削除するタグを削除できます。
リビジョンのタグが削除され、トラフィックの 0% が割り当てられる場合、リビジョンはトラフィックブロックから完全に削除されます。
以下のコマンドは、example-revision
という名前のリビジョンからすべてのタグを削除します。
$ kn service update <service_name> --untag example-tag
5.3.3. KnativeCLI を使用してトラフィック分割を作成する
Knative (kn
) CLI を使用してトラフィック分割を作成すると、YAML ファイルを直接変更するよりも合理的で直感的なユーザーインターフェイスが提供されます。kn service update
コマンドを使用して、サービスのリビジョン間でトラフィックを分割できます。
前提条件
- OpenShift Serverless Operator および Knative Serving がクラスターにインストールされている。
-
Knative (
kn
) CLI をインストールしている。 - Knative サービスを作成している。
手順
標準の
kn service update
コマンドで--traffic
タグを使用して、サービスのリビジョンとそれにルーティングするトラフィックの割合を指定します。コマンドの例
$ kn service update <service_name> --traffic <revision>=<percentage>
詳細は以下のようになります。
-
<service_name>
は、トラフィックルーティングを設定する Knative サービスの名前です。 -
<revision>
は、一定の割合のトラフィックを受信するように設定するリビジョンです。リビジョンの名前、または--tag
フラグを使用してリビジョンに割り当てたタグのいずれかを指定できます。 -
<percentage>
は、指定されたリビジョンに送信するトラフィックのパーセンテージです。
-
オプション:
--traffic
フラグは、1 つのコマンドで複数回指定できます。たとえば、@latest
というタグの付いたリビジョンとstable
という名前のリビジョンがある場合、次のように各リビジョンに分割するトラフィックの割合を指定できます。コマンドの例
$ kn service update example-service --traffic @latest=20,stable=80
複数のリビジョンがあり、最後のリビジョンに分割する必要があるトラフィックの割合を指定しない場合、
-traffic
フラグはこれを自動的に計算できます。たとえば、example
という名前の 3 番目のリビジョンがあり、次のコマンドを使用する場合:コマンドの例
$ kn service update example-service --traffic @latest=10,stable=60
トラフィックの残りの 30% は、指定されていなくても、
example
リビジョンに分割されます。
5.3.4. OpenShift Container Platform Web コンソールを使用したリビジョン間のトラフィックの管理
サーバーレスアプリケーションの作成後、アプリケーションは OpenShift Container Platform Web コンソールの Developer パースペクティブの Topology ビューに表示されます。アプリケーションのリビジョンはノードによって表され、Knative サービスはノードの周りの四角形のマークが付けられます。
コードまたはサービス設定の新たな変更により、特定のタイミングでコードのスナップショットである新規リビジョンが作成されます。サービスの場合、必要に応じてこれを分割し、異なるリビジョンにルーティングして、サービスのリビジョン間のトラフィックを管理することができます。
前提条件
- OpenShift Serverless Operator および Knative Serving がクラスターにインストールされている。
- OpenShift Container Platform Web コンソールにログインしている。
手順
Topology ビューでアプリケーションの複数のリビジョン間でトラフィックを分割するには、以下を行います。
- Knative サービスをクリックし、サイドパネルの概要を表示します。
Resources タブをクリックして、サービスの Revisions および Routes の一覧を表示します。
図5.1 Serverless アプリケーション
- サイドパネルの上部にある S アイコンで示されるサービスをクリックし、サービスの詳細の概要を確認します。
-
YAML タブをクリックし、YAML エディターでサービス設定を変更し、Save をクリックします。たとえば、
timeoutseconds
を 300 から 301 に変更します。この設定の変更により、新規リビジョンがトリガーされます。Topology ビューでは、最新のリビジョンが表示され、サービスの Resources タブに 2 つのリビジョンが表示されるようになります。 Resources タブで をクリックして、トラフィック分配ダイアログボックスを表示します。
- Splits フィールドに、2 つのリビジョンのそれぞれの分割されたトラフィックパーセンテージを追加します。
- 2 つのリビジョンのカスタム URL を作成するタグを追加します。
Save をクリックし、Topology ビューで 2 つのリビジョンを表す 2 つのノードを表示します。
図5.2 Serverless アプリケーションのリビジョン
5.3.5. blue-green デプロイメントストラテジーを使用したトラフィックのルーティングおよび管理
Blue-green デプロイメントストラテジー を使用して、実稼働バージョンのアプリケーションから新規バージョンにトラフィックを安全に再ルーティングすることができます。
前提条件
- OpenShift Serverless Operator および Knative Serving がクラスターにインストールされている。
-
OpenShift CLI (
oc
) をインストールしている。
手順
- アプリケーションを Knative サービスとして作成し、デプロイします。
以下のコマンドから出力を表示して、サービスのデプロイ時に作成された最初のリビジョンの名前を検索します。
$ oc get ksvc <service_name> -o=jsonpath='{.status.latestCreatedRevisionName}'
コマンドの例
$ oc get ksvc example-service -o=jsonpath='{.status.latestCreatedRevisionName}'
出力例
$ example-service-00001
以下の YAML をサービスの
spec
に追加して、受信トラフィックをリビジョンに送信します。... spec: traffic: - revisionName: <first_revision_name> percent: 100 # All traffic goes to this revision ...
以下のコマンドを実行して、URL の出力でアプリケーションを表示できることを確認します。
$ oc get ksvc <service_name>
-
サービスの
template
仕様の少なくとも 1 つのフィールドを変更してアプリケーションの 2 番目のリビジョンをデプロイし、これを再デプロイします。たとえば、サービスのimage
やenv
環境変数を変更できます。サービスの再デプロイは、サービスの YAML ファイルを適用するか、Knative (kn
) CLI をインストールしている場合は、kn service update
コマンドを使用します。 以下のコマンドを実行して、サービスを再デプロイする際に作成された 2 番目の最新のリビジョンの名前を見つけます。
$ oc get ksvc <service_name> -o=jsonpath='{.status.latestCreatedRevisionName}'
この時点で、サービスの最初のバージョンと 2 番目のリビジョンの両方がデプロイされ、実行されます。
既存のサービスを更新して、2 番目のリビジョンの新規テストエンドポイントを作成し、他のすべてのトラフィックを最初のリビジョンに送信します。
テストエンドポイントのある更新されたサービス仕様の例
... spec: traffic: - revisionName: <first_revision_name> percent: 100 # All traffic is still being routed to the first revision - revisionName: <second_revision_name> percent: 0 # No traffic is routed to the second revision tag: v2 # A named route ...
YAML リソースを再適用してこのサービスを再デプロイすると、アプリケーションの 番目のリビジョンがステージングされます。トラフィックはメインの URL の 2 番目のリビジョンにルーティングされず、Knative は新たにデプロイされたリビジョンをテストするために
v2
という名前の新規サービスを作成します。以下のコマンドを実行して、2 番目のリビジョンの新規サービスの URL を取得します。
$ oc get ksvc <service_name> --output jsonpath="{.status.traffic[*].url}"
この URL を使用して、トラフィックをルーティングする前に、新しいバージョンのアプリケーションが予想通りに機能していることを検証できます。
既存のサービスを再度更新して、トラフィックの 50% が最初のリビジョンに送信され、50% が 2 番目のリビジョンに送信されます。
リビジョン間でトラフィックを 50/50 に分割する更新サービス仕様の例
... spec: traffic: - revisionName: <first_revision_name> percent: 50 - revisionName: <second_revision_name> percent: 50 tag: v2 ...
すべてのトラフィックを新しいバージョンのアプリケーションにルーティングできる状態になったら、再度サービスを更新して、100% のトラフィックを 2 番目のリビジョンに送信します。
すべてのトラフィックを 2 番目のリビジョンに送信する更新済みのサービス仕様の例
... spec: traffic: - revisionName: <first_revision_name> percent: 0 - revisionName: <second_revision_name> percent: 100 tag: v2 ...
ヒントリビジョンのロールバックを計画しない場合は、これを 0% に設定する代わりに最初のリビジョンを削除できます。その後、ルーティング不可能なリビジョンオブジェクトにはガベージコレクションが行われます。
- 最初のリビジョンの URL にアクセスして、アプリケーションの古いバージョンに送信されていないことを確認します。