第10章 リンクコストの指定
サイトをリンクする際に、各リンクにコストを割り当てて、トラフィックフローに影響を与えることができます。デフォルトでは、新しいリンクのリンクコストは 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 つのサイトネットワークがあり、両方のサイトにサーバーとクライアントがある場合、ローカルサーバーが使用可能な間は、クライアントはローカルサーバーによってサービスを提供されていることがわかります。
10.1. Linux ホストからサービスネットワーク上でサービスを公開する
サービスネットワークを作成した後、公開されたサービスはそのネットワーク全体で通信できます。
サービスを使用する一般的なフローは、Kubernetes サイトと Podman サイトの場合と同じです。
skupper
CLI には、ホスト上にすでに存在するサービスを公開するための 2 つのオプションがあります。
-
expose
は、単一サービスを持つホストなどの単純なユースケースをサポートします。手順は、「サービスネットワーク上での簡単なサービスの公開」 を参照してください。 -
service create
およびservice bind
は、ホストに複数のサービスがある場合など、より柔軟にサービスを公開する方法です。手順は、「サービスネットワーク上での複雑なサービスの公開」 を参照してください。
10.1.1. サービスネットワーク上での簡単なサービスの公開
このセクションでは、簡単なユースケースのサービスネットワークでサービスを有効にする方法を説明します。
前提条件
- Skupper Podman サイト
手順
以下のようにサーバーを実行します。
$ podman run --name backend-target --network skupper --detach --rm -p 8080:8080 quay.io/skupper/hello-world-backend
この手順は Skupper 固有のものではありません。つまり、このプロセスはホストの標準プロセスから変更されません。たとえば、公開するネイティブプロセスがある場合があります。
サービスネットワーク上で通信可能なサービスを作成します。
$ skupper expose [host <hostname|ip>]
ここでは、以下のようになります。
-
<host>
は、サーバーが実行されているホストの名前です。たとえば、サーバーをコンテナーとして実行する場合は、コンテナーの名前になります。 -
<ip>
は、サーバーが実行されている IP アドレスです。
手順 1 のデプロイメント例では、次のコマンドを使用してサービスを作成します。
$ skupper expose host backend-target --address backend --port 8080
このコマンドのオプションは以下の通りです。
-
--port <port-number>
: このサービスがサービスネットワーク上で利用可能なポート番号を指定します。注記: このオプションを繰り返すことで、複数のポートを指定できます。 -
--target-port <port-number>
: 公開したい Pod のポート番号を指定します。 -
--protocol <protocol>
を使用すると、使用するプロトコル、tcp
、http
、またはhttp2
を指定できます。
podman コンテナーではない、サイトと同じホスト上で実行されているサービスを公開する場合は、
localhost
を使用しないでください。代わりに、ローカルサービスを公開するときにhost.containers.internal
を使用します。skupper expose host host.containers.internal --address backend --port 8080
-
サービスネットワークの別のサイトにサービスを作成します。
$ skupper service create backend 8080
10.1.2. サービスネットワーク上での複雑なサービスの公開
このセクションでは、より複雑なユースケースのサービスネットワークでサービスを有効にする方法を説明します。
前提条件
- Skupper Podman サイト
手順
以下のようにサーバーを実行します。
$ podman run --name backend-target --network skupper --detach --rm -p 8080:8080 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>
- 公開するオブジェクト。現在有効な値はhost
のみです。 -
<target-name>
- クラスターサービスの名前。
手順 1 のデプロイメント例では、次のコマンドを使用してサービスをバインドします。
$ skupper service bind hello-world-backend host hello-world-backend
-
10.1.3. サービスネットワークからの簡単なサービスの消費
Podman サイトで公開されているサービスは、他のサイトでは自動的に利用できません。これは、skupper init --enable-service-sync false
を使用して作成された Kubernetes サイトと同じです。
前提条件
- サービスネットワーク上でサービスを公開するリモートサイト
- Podman サイト
手順
- Skupper サイトに関連付けられたユーザーとしてホストにログインします。
ローカルサービスを作成します。
$ skupper service create <service-name> <port number>