第2章 リンクコストの指定
サイトをリンクする際に、各リンクにコストを割り当てて、トラフィックフローに影響を与えることができます。デフォルトでは、新しいリンクのリンクコストは 1
に設定されています。サービスネットワークでは、ルーティングアルゴリズムは、クライアントからターゲットサーバーまでの総コストが最も低いパスを使用しようとします。
さまざまなサイトにサービスを分散させている場合、クライアントが特定のターゲットまたはリンクを優先することを推奨します。この場合、代替リンクで
1
より大きいコストを指定して、これらのリンクの使用を減らすことができます。注記オープン接続の分散は統計的であり、つまりラウンドロビンシステムではありません。
- 接続が 1 つのリンクのみをトラバースする場合、パスコストはリンクコストと等しくなります。接続が複数のリンクをトラバースする場合、パスコストはパスに含まれるすべてのリンクの合計になります。
コストは、ネットワーク内のクライアントからサーバーへのパスを使用するためのしきい値として機能します。パスが 1 つしかない場合、トラフィックはコストに関係なくそのパスに流れます。
注記サービスの 2 つのターゲットから開始し、いずれかのターゲットが使用できなくなると、トラフィックはコストに関係なく残りのパスに流れます。
- クライアントからサーバーインスタンスまたはサービスへのパスが多数ある場合、トラフィックは、接続数が代替パスのコストを超えるまで、最もコストの低いパスを流れます。オープン接続のこのしきい値に達すると、新しい接続は代替パスと最低コストのパスに分散されます。
前提条件
- リンク 元 のサイトに Kubernetes コンテキストを設定している。
- リンク 先 のサイトのトークン。
手順
サービスネットワークへのリンクを作成します。
$ skupper link create <filename> --cost <integer-cost>
<integer-cost>
は 1 より大きい整数です。トラフィックは低コストのリンクを優先します。注記リンクを経由せずにサービスを呼び出すことができる場合、そのサービスはローカルであると見なされ、暗黙的なコストとして
0
が設定されます。たとえば、
token.yaml
という名前のトークンファイルを使用して、コストを2
に設定したリンクを作成します。$ skupper link create token.yaml --cost 2
リンクコストを確認します。
$ skupper link status link1 --verbose
出力は以下の例のようになります。
Cost: 2 Created: 2022-11-17 15:02:01 +0000 GMT Name: link1 Namespace: default Site: default-0d99d031-cee2-4cc6-a761-697fe0f76275 Status: Connected
コンソールを使用してトラフィックを監視します。
サイトにコンソールがある場合は、ログインして各サーバーのプロセスに移動します。各クライアントに対応するトラフィックレベルを表示できます。
注記異なるサイトに複数のクライアントがある場合は、各クライアントに対してビューをフィルタリングして、トラフィックに対するコストの影響を判断します。たとえば、高コストでリンクされている 2 つのサイトネットワークがあり、両方のサイトにサーバーとクライアントがある場合、ローカルサーバーが使用可能な間は、クライアントはローカルサーバーによってサービスを提供されていることがわかります。
2.1. Exposing services on the service network from a namespace
サービスネットワークを作成した後、公開されたサービスはそのネットワーク全体で通信できます。
skupper
CLI には、namespace に存在するサービスを公開するための 2 つのオプションがあります。
-
expose
は、単一サービスを使用するデプロイメントなど、単純なユースケースをサポートします。手順は、「サービスネットワーク上での簡単なサービスの公開」 を参照してください。 -
service create
とservice bind
は、複数のサービスでデプロイメントする場合など、より柔軟にサービスを公開する方法です。手順は、「サービスネットワーク上での複雑なサービスの公開」 を参照してください。
2.1.1. サービスネットワーク上での簡単なサービスの公開
このセクションでは、簡単なユースケースのサービスネットワークでサービスを有効にする方法を説明します。
手順
たとえば、サイトの 1 つにデプロイメント、いくつかの Pod、またはサービスを作成します。
$ kubectl create deployment hello-world-backend --image quay.io/skupper/hello-world-backend
この手順は Skupper 固有のものではありません。つまり、このプロセスはクラスターの標準プロセスから変更されていません。
サービスネットワーク上で通信可能なサービスを作成します。
デプロイメントおよび Pod
$ skupper expose [deployment <name>|pods <selector>]
ここでは、以下のようになります。
-
<name>
- デプロイメントの名前。 -
<selector>
- Pod セレクター。
Kubernetes サービス
--address
オプションを使用して結果のサービス名を指定します。$ skupper expose service <name> --address <skupper-service-name>
ここでは、以下のようになります。
-
<name>
- サービスの名前。 -
<skupper-service-name>
- サービスネットワーク上で共有される結果のサービスの名前。
StatefulSets
以下を使用して statefulset を公開できます。
$ skupper expose statefulset <statefulsetname>
Kubernetes の StatefulSet は、各 Pod に安定した一意のネットワーク識別子を提供するために、ヘッドレスサービスに関連付けられることがよくあります。サービスネットワーク上の各 Pod に安定したネットワーク識別子が必要な場合は、
--headless
オプションを使用します。$ skupper expose statefulset --headless
注記'--headless' オプションを使用すると、アドレス (ルーティングキー) を通じてサービスネットワーク内の 1 つのステートフルセットのみを公開できます。
手順 1 のサンプルデプロイメントでは、次のコマンドを使用してサービスを作成できます。
$ skupper expose deployment/hello-world-backend --port 8080
expose
コマンドのオプションには以下が含まれます。-
--port <port-number>
: このサービスがサービスネットワーク上で利用可能なポート番号を指定します。注記: このオプションを繰り返すことで、複数のポートを指定できます。 -
--target-port <port-number>
: 公開したい Pod のポート番号を指定します。 -
--protocol <protocol>
を使用すると、使用するプロトコル、tcp
、http
、またはhttp2
を指定できます。
注記ポートを指定しないと、
skupper
はデプロイメントのcontainerPort
値を使用します。-
サービスネットワークで公開されているサービスのステータスを確認します (
-v
は Kubernetes でのみ使用可能)。$ skupper service status -v Services exposed through Skupper: ╰─ backend:8080 (tcp) ╰─ Sites: ├─ 4d80f485-52fb-4d84-b10b-326b96e723b2(west) │ policy: disabled ╰─ 316fbe31-299b-490b-9391-7b46507d76f1(east) │ policy: disabled ╰─ Targets: ╰─ backend:8080 name=backend-9d84544df-rbzjx
2.1.2. サービスネットワーク上での複雑なサービスの公開
このセクションでは、より複雑なユースケースのサービスネットワークでサービスを有効にする方法を説明します。
手順
たとえば、サイトの 1 つにデプロイメント、いくつかの Pod、またはサービスを作成します。
$ kubectl create deployment hello-world-backend --image quay.io/skupper/hello-world-backend
この手順は Skupper 固有のものではありません。つまり、このプロセスはクラスターの標準プロセスから変更されていません。
サービスネットワーク上で通信可能なサービスを作成します。
$ skupper service create <name> <port>
ここでは、以下のようになります。
-
<name>
- 作成するサービスの名前。 -
<port>
- サービスが使用するポート。
手順 1 のデプロイメント例では、次のコマンドを使用してサービスを作成します。
$ skupper service create hello-world-backend 8080
-
サービスをクラスターサービスにバインドします。
$ skupper service bind <service-name> <target-type> <target-name>
ここでは、以下のようになります。
-
<service-name>
- サービスネットワーク上のサービスの名前。 -
<target-type>
は、公開するオブジェクト (deployment
、statefulset
、pods
、またはservice
) です。 -
<target-name>
- クラスターサービスの名前。
手順 1 のデプロイメント例では、次のコマンドを使用してサービスをバインドします。
$ skupper service bind hello-world-backend deployment hello-world-backend
-
2.1.3. 別の namespace からサービスネットワークへのサービスの公開
このセクションでは、Skupper がデプロイされていない namespace からサービスを公開する方法を示します。
Skupper を使用すると、任意のサイトの他の namespace から Kubernetes サービスを公開できます。ただし、デプロイメントなどのワークロードを公開する場合は、このセクションで説明するようにサイトを作成する必要があります。
前提条件
- Skupper がデプロイされている namespace。
- namespace 間の通信を許可するネットワークポリシー。
- サービス以外のリソースを公開する必要がある場合の cluster-admin 権限。
手順
サイト namespace 以外の namespace からワークロードを公開する場合は、クラスター権限でサイトを作成します。
注記このサイトには、Kubernetes サービスリソースを公開するために
--enable-cluster-permissions
で付与される追加の権限は必要ありません。$ skupper init --enable-cluster-permissions
サイト namespace 以外の namespace から Kubernetes サービスを公開するには、以下を実行します。
$ skupper expose service <service>.<namespace> --address <service>
- <service> - サービスネットワーク上のサービスの名前。
- <namespace> - 公開するサービスが実行される namespace の名前。
たとえば、Skupper を
east
namespace にデプロイし、east-backend
namespace にbackend
Kubernetes サービスを作成した場合、コンテキストをeast
namespace に設定し、以下を使用してサービスをサービスネットワーク上のbackend
として公開します。$ skupper expose service backend.east-backend --port 8080 --address backend
--enable-cluster-permissions
で作成したサイトからワークロードを公開するには、以下を実行します。$ skupper expose <resource> --port <port-number> --target-namespace <namespace>
- <resource> - リソースの名前。
- <namespace> - 公開するリソースが実行される namespace の名前。
たとえば、Skupper を
east
namespace にデプロイし、backend
デプロイメントをeast-backend
namespace に作成した場合は、コンテキストをeast
namespace に設定し、以下を使用してサービスネットワーク上でサービスをbackend
として公開します。$ skupper expose deployment/backend --port 8080 --target-namespace east-backend