3.2.12. ルーターシャードの使用
ルーターのシャード化 により、NAMESPACE_LABELS
と ROUTE_LABELS
を使用してルーターの namespace とルートの絞り込みが実行されます。これにより、複数のルーターデプロイメントでルートのサブセットを分散させることができます。重複しないサブセットを使用することにより、ルートセットのパーティション設定を効果的に行うことができます。または、重複するルートのサブセットを設定する複数のシャードを定義することもできます。
デフォルトで、ルーターはすべての プロジェクト (namespace) からすべてのルートを選択します。シャード化によってラベルがルートまたはルーターの namespace およびラベルセレクターに追加されます。各ルーターシャードは特定のラベルのセットで選択されるルーターを設定するか、または特定のラベルセレクターで選択される namespace に属します。
ルーターサービスアカウントには [cluster reader
] パーミッションセットを設定し、他の namespace のラベルにアクセスできるようにする必要があります。
ルーターのシャード化および DNS
外部 DNS サーバーは要求を必要なシャードにルートするために必要となるので、管理者はプロジェクトの各ルーターに個別の DNS エントリーを作成する必要があります。ルーターは不明なルートを別のルーターに転送することはありません。
以下の例を考慮してください。
-
Router A はホスト 192.168.0.5 にあり、
*.foo.com
のルートを持つ。 -
Router B はホスト 192.168.1.9 にあり、
*.example.com
のルートを持つ。
各 DNS エントリーは *.foo.com を Router A をホストするノードに解決し、*.example.com を Router B をホストするノードに解決する必要があります。
-
*.foo.com A IN 192.168.0.5
-
*.example.com A IN 192.168.1.9
ルーターのシャード化の例
このセクションでは、namespace およびルートラベルを使用するルーターのシャード化について説明します。
図3.1 namespace ラベルに基づくルーターのシャード化
namespace ラベルセレクターでルーターを設定します。
$ oc set env dc/router NAMESPACE_LABELS="router=r1"
ルーターには namespace にセレクターがあるため、ルーターは一致する namespace のルートのみを処理します。このセレクターが namespace に一致させるようにするには、namespace に適宜ラベルを付けます。
$ oc label namespace default "router=r1"
ルートをデフォルトの namespace に作成すると、ルートはデフォルトのルーターで利用できるようになります。
$ oc create -f route1.yaml
新規プロジェクト (namespace) を作成し、
route2
というルートを作成します。$ oc new-project p1 $ oc create -f route2.yaml
ルートがルーターで利用できないことを確認します。
namespace
p1
にrouter=r1
のラベルを付けます。$ oc label namespace p1 "router=r1"
このラベルを追加すると、ルートはルーターで利用できるようになります。
- 例
ルーターのデプロイメント
finops-router
はルートセレクターNAMESPACE_LABELS="name in (finance, ops)"
を使用して実行され、ルーターのデプロイメントdev-router
はラベルセレクターNAMESPACE_LABELS="name=dev"
を使用して設定されます。すべてのルートが
name=finance
、name=ops
、およびname=dev
というラベルの付けられた namespace にない場合、この設定により、2 つのルーターのデプロイメント間でルートが効果的に分散されます。上記のシナリオでは、シャード化は重複するセットを持たないパーティション設定の特別なケースとなります。ルートは複数のルーターシャード間で分割されます。
ルート選択の基準によって、ルートの分散方法が決まります。複数のルーターデプロイメントに重複するルートのサブセットを設定することも可能です。
- 例
上記の例では
finops-router
とdev-router
のほかにdevops-router
があり、これはラベルセレクターNAMESPACE_LABELS="name in (dev, ops)"
を使用して設定されます。name=dev
またはname=ops
というラベルが付けられた namespace のルートは 2 つの異なるルーターデプロイメントによって提供されるようになりました。これは、namespace ラベルに基づくルーターのシャード化 の手順で説明されているように、ルートの重複するサブセットを定義するケースです。また、これによりさらに複雑なルーティングルールを作成し、優先度の高いトラフィックを専用の
finops-router
に転送し、優先度の低いトラフィックはdevops-router
に送信できます。
ルートラベルに基づくルーターのシャード化
NAMESPACE_LABELS
によって、提供するプロジェクトをフィルターでき、それらのプロジェクトからすべてのルートを選択できますが、ルートはルート自体に関連する他の基準に基づいてパーティション設定する必要がある場合があります。ROUTE_LABELS
セレクターを使用すると、ルート自体を細かくフィルターできます。
- 例
ルーターデプロイメント
prod-router
はルートセレクターROUTE_LABELS="mydeployment=prod"
を使用して設定され、ルーターデプロイメントdevtest-router
はラベルセレクターROUTE_LABELS="mydeployment in (dev, test)"
を使用して設定されます。この設定は、namespace の種類を問わず、ルートのラベルに基づいて 2 つのルーターデプロイメント間のルートのパーティション設定を行います。
この例では、提供されるルートすべてがラベル
"mydeployment=<tag>"
でタグ付けされていることを想定しています。
3.2.12.1. ルーターシャードの作成
このセクションでは、ルーターシャードのさらに詳細な例を示します。さまざまなラベルを持つ a
— z
という 26 のルートがあることを想定してください。
ルートで使用可能なラベル
sla=high geo=east hw=modest dept=finance sla=medium geo=west hw=strong dept=dev sla=low dept=ops
これらのラベルは、サービスレベルアグリーメント、地理的な場所、ハードウェア要件、部門などの概念を表しています。ルートは各列のラベルを最大 1 つ持つことができます。ルートによっては他のラベルを持つことことも、ラベルをまったく持たないこともあります。
名前 | SLA | Geo (地理的な場所) | HW | Dept (部門) | その他のラベル |
---|---|---|---|---|---|
|
|
|
|
|
|
|
|
|
| ||
|
|
|
| ||
|
|
|
| ||
|
|
|
| ||
|
|
|
これは oc adm router
、oc set env
および oc scale
がどのように連携してルーターシャードを作成するかを表している便利なスクリプト mkshard です。
#!/bin/bash # Usage: mkshard ID SELECTION-EXPRESSION id=$1 sel="$2" router=router-shard-$id 1 oc adm router $router --replicas=0 2 dc=dc/router-shard-$id 3 oc set env $dc ROUTE_LABELS="$sel" 4 oc scale $dc --replicas=3 5
mkshard を複数回実行して、複数のルーターを作成します。
ルーター | 選択式 | ルート |
---|---|---|
|
|
|
|
|
|
|
|
|