第2章 リンクコストの指定
サイトをリンクする際に、各リンクにコストを割り当てて、トラフィックフローに影響を与えることができます。デフォルトでは、新しいリンクのリンクコストは 1 に設定されています。サービスネットワークでは、ルーティングアルゴリズムは、クライアントからターゲットサーバーまでの総コストが最も低いパスを使用しようとします。
さまざまなサイトにサービスを分散させている場合、クライアントが特定のターゲットまたはリンクを優先することを推奨します。この場合、代替リンクで
1より大きいコストを指定して、これらのリンクの使用を減らすことができます。注記オープン接続の分散は統計的であり、つまりラウンドロビンシステムではありません。
- 接続が 1 つのリンクのみをトラバースする場合、パスコストはリンクコストと等しくなります。接続が複数のリンクをトラバースする場合、パスコストはパスに含まれるすべてのリンクの合計になります。
コストは、ネットワーク内のクライアントからサーバーへのパスを使用するためのしきい値として機能します。パスが 1 つしかない場合、トラフィックはコストに関係なくそのパスに流れます。
注記サービスの 2 つのターゲットから開始し、いずれかのターゲットが使用できなくなると、トラフィックはコストに関係なく残りのパスに流れます。
- クライアントからサーバーインスタンスまたはサービスへのパスが多数ある場合、トラフィックは、接続数が代替パスのコストを超えるまで、最もコストの低いパスを流れます。オープン接続のこのしきい値に達すると、新しい接続は代替パスと最低コストのパスに分散されます。
前提条件
- リンク 元 のサイトに Kubernetes コンテキストを設定している。
- リンク 先 のサイトのトークン。
手順
サービスネットワークへのリンクを作成します。
skupper link create <filename> --cost <integer-cost>
$ skupper link create <filename> --cost <integer-cost>Copy to Clipboard Copied! Toggle word wrap Toggle overflow <integer-cost>は 1 より大きい整数です。トラフィックは低コストのリンクを優先します。注記リンクを経由せずにサービスを呼び出すことができる場合、そのサービスはローカルであると見なされ、暗黙的なコストとして
0が設定されます。たとえば、
token.yamlという名前のトークンファイルを使用して、コストを2に設定したリンクを作成します。skupper link create token.yaml --cost 2
$ skupper link create token.yaml --cost 2Copy to Clipboard Copied! Toggle word wrap Toggle overflow リンクコストを確認します。
skupper link status link1 --verbose
$ skupper link status link1 --verboseCopy to Clipboard Copied! Toggle word wrap Toggle overflow 出力は以下の例のようになります。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow コンソールを使用してトラフィックを監視します。
サイトにコンソールがある場合は、ログインして各サーバーのプロセスに移動します。各クライアントに対応するトラフィックレベルを表示できます。
注記異なるサイトに複数のクライアントがある場合は、各クライアントに対してビューをフィルタリングして、トラフィックに対するコストの影響を判断します。たとえば、高コストでリンクされている 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
$ kubectl create deployment hello-world-backend --image quay.io/skupper/hello-world-backendCopy to Clipboard Copied! Toggle word wrap Toggle overflow この手順は Skupper 固有のものではありません。つまり、このプロセスはクラスターの標準プロセスから変更されていません。
サービスネットワーク上で通信可能なサービスを作成します。
デプロイメントおよび Pod
skupper expose [deployment <name>|pods <selector>]
$ skupper expose [deployment <name>|pods <selector>]Copy to Clipboard Copied! Toggle word wrap Toggle overflow ここでは、以下のようになります。
-
<name>- デプロイメントの名前。 -
<selector>- Pod セレクター。
Kubernetes サービス
--addressオプションを使用して結果のサービス名を指定します。skupper expose service <name> --address <skupper-service-name>
$ skupper expose service <name> --address <skupper-service-name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow ここでは、以下のようになります。
-
<name>- サービスの名前。 -
<skupper-service-name>- サービスネットワーク上で共有される結果のサービスの名前。
StatefulSets
以下を使用して statefulset を公開できます。
skupper expose statefulset <statefulsetname>
$ skupper expose statefulset <statefulsetname>Copy to Clipboard Copied! Toggle word wrap Toggle overflow Kubernetes の StatefulSet は、各 Pod に安定した一意のネットワーク識別子を提供するために、ヘッドレスサービスに関連付けられることがよくあります。サービスネットワーク上の各 Pod に安定したネットワーク識別子が必要な場合は、
--headlessオプションを使用します。skupper expose statefulset --headless
$ skupper expose statefulset --headlessCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注記'--headless' オプションを使用すると、アドレス (ルーティングキー) を通じてサービスネットワーク内の 1 つのステートフルセットのみを公開できます。
手順 1 のサンプルデプロイメントでは、次のコマンドを使用してサービスを作成できます。
skupper expose deployment/hello-world-backend --port 8080
$ skupper expose deployment/hello-world-backend --port 8080Copy to Clipboard Copied! Toggle word wrap Toggle overflow exposeコマンドのオプションには以下が含まれます。-
--port <port-number>: このサービスがサービスネットワーク上で利用可能なポート番号を指定します。注記: このオプションを繰り返すことで、複数のポートを指定できます。 -
--target-port <port-number>: 公開したい Pod のポート番号を指定します。 -
--protocol <protocol>を使用すると、使用するプロトコル、tcp、http、またはhttp2を指定できます。
注記ポートを指定しないと、
skupperはデプロイメントのcontainerPort値を使用します。-
サービスネットワークで公開されているサービスのステータスを確認します (
-vは Kubernetes でのみ使用可能)。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.1.2. サービスネットワーク上での複雑なサービスの公開 リンクのコピーリンクがクリップボードにコピーされました!
このセクションでは、より複雑なユースケースのサービスネットワークでサービスを有効にする方法を説明します。
手順
たとえば、サイトの 1 つにデプロイメント、いくつかの Pod、またはサービスを作成します。
kubectl create deployment hello-world-backend --image quay.io/skupper/hello-world-backend
$ kubectl create deployment hello-world-backend --image quay.io/skupper/hello-world-backendCopy to Clipboard Copied! Toggle word wrap Toggle overflow この手順は Skupper 固有のものではありません。つまり、このプロセスはクラスターの標準プロセスから変更されていません。
サービスネットワーク上で通信可能なサービスを作成します。
skupper service create <name> <port>
$ skupper service create <name> <port>Copy to Clipboard Copied! Toggle word wrap Toggle overflow ここでは、以下のようになります。
-
<name>- 作成するサービスの名前。 -
<port>- サービスが使用するポート。
手順 1 のデプロイメント例では、次のコマンドを使用してサービスを作成します。
skupper service create hello-world-backend 8080
$ skupper service create hello-world-backend 8080Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
サービスをクラスターサービスにバインドします。
skupper service bind <service-name> <target-type> <target-name>
$ skupper service bind <service-name> <target-type> <target-name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow ここでは、以下のようになります。
-
<service-name>- サービスネットワーク上のサービスの名前。 -
<target-type>は、公開するオブジェクト (deployment、statefulset、pods、またはservice) です。 -
<target-name>- クラスターサービスの名前。
手順 1 のデプロイメント例では、次のコマンドを使用してサービスをバインドします。
skupper service bind hello-world-backend deployment hello-world-backend
$ skupper service bind hello-world-backend deployment hello-world-backendCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
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
$ skupper init --enable-cluster-permissionsCopy to Clipboard Copied! Toggle word wrap Toggle overflow サイト namespace 以外の namespace から Kubernetes サービスを公開するには、以下を実行します。
skupper expose service <service>.<namespace> --address <service>
$ skupper expose service <service>.<namespace> --address <service>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - <service> - サービスネットワーク上のサービスの名前。
- <namespace> - 公開するサービスが実行される namespace の名前。
たとえば、Skupper を
eastnamespace にデプロイし、east-backendnamespace にbackendKubernetes サービスを作成した場合、コンテキストをeastnamespace に設定し、以下を使用してサービスをサービスネットワーク上のbackendとして公開します。skupper expose service backend.east-backend --port 8080 --address backend
$ skupper expose service backend.east-backend --port 8080 --address backendCopy to Clipboard Copied! Toggle word wrap Toggle overflow --enable-cluster-permissionsで作成したサイトからワークロードを公開するには、以下を実行します。skupper expose <resource> --port <port-number> --target-namespace <namespace>
$ skupper expose <resource> --port <port-number> --target-namespace <namespace>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - <resource> - リソースの名前。
- <namespace> - 公開するリソースが実行される namespace の名前。
たとえば、Skupper を
eastnamespace にデプロイし、backendデプロイメントをeast-backendnamespace に作成した場合は、コンテキストをeastnamespace に設定し、以下を使用してサービスネットワーク上でサービスをbackendとして公開します。skupper expose deployment/backend --port 8080 --target-namespace east-backend
$ skupper expose deployment/backend --port 8080 --target-namespace east-backendCopy to Clipboard Copied! Toggle word wrap Toggle overflow