スタティック ルート
概要 ジュニパークラウドネイティブのContrail Networking(CN2)リリース23.1は、クラスターの静的ルートをサポートしています。この記事では、CN2クラスターの静的ルートを設定する方法について説明します。
スタティック ルートについて
ネットワークに動的ルーティング プロトコルの複雑さが不要な場合は、静的ルートを使用できます。ルーティングテーブルと転送テーブルの永続的な固定ルートは、静的ルートとして設定されることがよくあります。スタブネットワークからの内部トラフィックは、静的ルートからメリットがあります。
ルートは、宛先プレフィックスとネクストホップ転送アドレスで構成されています。スタティックルートはルーティングテーブルでアクティブ化され、ネクストホップアドレスに到達可能になると転送テーブルに挿入されます。静的ルートに一致するトラフィックは、指定されたネクストホップアドレスに転送されます。
CN2の静的ルート
CN2は、以下の2つのカスタムリソース(RR)を介して静的ルートを実装します。RouteTable
:ユーザー定義のネクストホップ宛先(nextHop
)と、ネクストホップトラフィックを識別する宛先プレフィックスが含まれます。IP アドレスはnextHop
、別の VMI オブジェクトの IP アドレスである必要があります。プレフィックスは、一致するトラフィックのネクストホップとして機能する宛先ネットワークを定義します。ARouteTable
では、静的ルートを定義できます。を仮想ネットワーク(VN)に関連付けることができますRouteTable
。CRの例を以下にRouteTable
示します。apiVersion: core.contrail.juniper.net/v3 kind: RouteTable metadata: name: static-rt namespace: static-route spec: routes: route: - nextHop: 10.20.30.2 nextHopType: ip-address prefix: 10.20.30.0/24 communityAttributes: communityAttribute: - accept-own - no-advertise
nextHopType
には、 の値ip-address
が必要です。それ以外の値を指定すると、ユーザー入力エラーが発生します。フィールドをcommunityAttributes
使用すると、BGP経由でルート学習を制御できます。InterfaceRouteTable
: 仮想InterfaceRouteTable
マシン インターフェイス(VMI)の静的ルーティングを設定します。はInterfaceRouteTable
、ネクストホップエントリーを必要としない宛先プレフィックスを含みます。とRouteTable
同様に、プレフィックスは宛先ネットワーク、またはネクストホップを定義します。RouteTable
とは異なり、IP アドレスをnextHop
定義する必要はありません。これは、VMI に関連付InterfaceRouteTable
けると、関連する VMI がこのプレフィックスのネクスト ホップとして機能するためです。CRの例を以下に
InterfaceRouteTable
示します。apiVersion: core.contrail.juniper.net/v3 kind: InterfaceRouteTable metadata: name: static-rt namespace: static-route spec: interfaceRouteTableRoutes: route: - nextHopType: ip-address prefix: 10.20.30.0/24 communityAttributes: communityAttribute: - accept-own
nextHopType
には、 の値ip-address
が必要です。それ以外の値を指定すると、ユーザー入力エラーが発生します。
仮想ネットワークの静的ルートの設定
CR をRouteTable
設定して、スタティック ルートを VN に適用します。VNは仕様内のaを
RouteTable
参照します。その結果、
RouteTable
はVNに関連付けされ、静的ルートが設定されます。以下は、関連
RouteTable
するVNオブジェクトを示しています。
apiVersion: core.contrail.juniper.net/v3 kind: VirtualNetwork metadata: namespace: static-route name: vn-route spec: v4SubnetReference: apiVersion: core.contrail.juniper.net/v1 kind: Subnet namespace: static-route name: vn-subnet routeTableReferences: - apiVersion: core.contrail.juniper.net/v3 kind: RouteTable namespace: static-route name: static-rt
VMIの静的ルートを設定する
VMIInterfaceRouteTable
に静的ルートを適用するように を設定します。VMIは、そのセクション内の
InterfaceRouteTableReference
を
InterfaceRouteTable
参照しています。以下は、 を参照する VMI オブジェクトです
InterfaceRouteTable
。
apiVersion: v3 kind: VirtualMachineInterface metadata: name: static-route-pod namespace: static-route annotations: core.juniper.net/interface-route-table: '[{"name": "static-rt", "namespace": "static-route"}]' spec: <VMI_SPEC> status: interfaceRouteTableReferences: - apiVersion: core.contrail.juniper.net/v3 kind: InterfaceRouteTable namespace: static-route name: static-rt
ポッドインターフェイスで静的ルートを設定する
ポッドのマニフェストのアノテーションセクションを使用して、ポッドのデフォルトまたはセカンダリインターフェイスの静的ルートを設定できます。ポッド調整機能は、アノテーションセクションを処理して、関連付けられたInterfaceRouteTable
VMI オブジェクトを作成します。調整では、注釈セクションで文字列キー「core.juniper.net/interface-route-table」を探します。ポッドのVMEは、その文字列をメタデータラベルとして使用して、 に関連付
InterfaceRouteTable
けます。
次に、デフォルトインターフェイスで定義された InterfaceRouteTable
ポッドマニフェストの例を示します。
apiVersion: v1 kind: Pod metadata: name: static-route-pod namespace: static-route annotations: core.juniper.net/interface-route-table: '[{"name": "vmi-rt", "namespace": "static-route"}]' spec: containers: - name: praqma image: <image-repository>:<tag> imagePullPolicy: Always securityContext: capabilities: add: - NET_ADMIN privileged: true
InterfaceRouteTable
次に示します。プライマリインターフェイス
apiVersion: v1 kind: Pod metadata: name: static-route-pod namespace: static-route annotations: k8s.v1.cni.cncf.io/networks: | [ { "name": "vn-route", "namespace": "static-route", "cni-args": { "core.juniper.net/interface-route-table": "[{\"name\": \"vmi-rt\", \"namespace\": "static-route\"}]" } } ] spec: containers: - name: praqma image: <image-repository>:<tag> imagePullPolicy: Always securityContext: capabilities: add: - NET_ADMIN privileged: true
name
は であり
name
、セカンダリインターフェイス
InterfaceRouteTable
の は
vmi-rt
です
vn-route
。同じ
namespace
で異なる
names
2つ
InterfaceRouteTables
を定義すると、そのポッドのプライマリおよびセカンダリインターフェイスが自動的に作成
InterfaceRouteTable
されます。
NAD を使用した仮想ネットワークの静的ルートの設定
ネットワーク添付ファイル定義(NAD)オブジェクトで静的ルート プロパティを指定することもできます。NAD が調整または適用されると、aRouteTable
が作成され、結果として生成される VN オブジェクトは、 を参照します
RouteTable
。静的ルート情報が定義された NAD の例を以下に示します。
apiVersion: "k8s.cni.cncf.io/v1" kind: NetworkAttachmentDefinition metadata: name: vn-route namespace: static-route labels: vn: vn-route annotations: juniper.net/networks: '{ "ipamV4Subnet": "108.108.2.0/24" "routeTableReferences": '[{"name": "vn-rt", "namespace": "static-route"}]' }' spec: config: '{ "cniVersion": "0.3.1", "name": "vn-route", "type": "contrail-k8s-cni" }'
ポッドインターフェイス上の複数のスタティックルート
使用するとInterfaceRouteTable,
、複数の静的ルートを単一のポッドインターフェイス(VMI)に関連付けることができます。これは、IP プレフィックスに応じて、VMI オブジェクトにデフォルトのネクスト ホップの宛先が複数存在することを意味します。クラスター・サービス・バージョン (CSV) 構文または JSON 構文annotations
を使用して、複数InterfaceRouteTable
の参照を指定することができます。
「名前空間/名前」形式で参照 InterfaceRouteTable
する必要があります。次の例では、 static-route
は名前空間であり to-right
、 to-zone-1
は VMI の InterfaceRouteTable
オブジェクトまたはネクスト ホップの left-vn
宛先です。
以下の例は、複数InterfaceRouteTable
参照を持つ場合のDeployment
例です。
apiVersion: apps/v1 kind: Deployment metadata: name: forwarder namespace: static-route labels: app: forwarder spec: replicas: 3 selector: matchLabels: app: forwarder template: metadata: labels: app: forwarder annotations: k8s.v1.cni.cncf.io/networks: | [ { "name": "left-vn", "namespace": "static-route", "cni-args": { "core.juniper.net/interface-route-table": "static-route/to-right,static-route/to-zone-1" } }, { "name": "right-vn", "namespace": "static-route", "cni-args": { "core.juniper.net/interface-route-table": "static-route/to-left" } }, { "name": "zone-1", "namespace": "static-route", "cni-args": { "core.juniper.net/interface-route-table": "static-route/to-left" } }, { "name": "zone-2", "namespace": "static-route", "cni-args": { "core.juniper.net/interface-route-table": "static-route/to-left" } } ] spec: containers: - name: praqma image: <repository>:<tag> securityContext: capabilities: add: - NET_ADMIN privileged: true
次の例は、JSON構文を使用した複数 InterfaceRouteTable
の参照を含むポッドマニフェストです。
apiVersion: v1 kind: Pod metadata: name: irt-right namespace: static-route annotations: k8s.v1.cni.cncf.io/networks: | [{ "name": "right-vn", "namespace": "static-route", "cni-args": { "core.juniper.net/interface-route-table": "[{\"namespace\": \"static-route\", "\name\": \"to-left\"}, {\"namespace\": \"static-route\", \"name\": \"to-zone-1\"}]" } }] spec: containers: - name: praqma image: <image-repository>:<tag> securityContext: capabilities: add: - NET_ADMIN privileged: true
JSON 構文ではバックスラッシュを使用する必要があります。後方スラッシュは、別の JSON 文字列内で JSON 文字列をエンコードする必要があります。
RouteTable と InterfaceRouteTable のトラブルシューティング
以下のセクションには、さまざまな RouteTable
問題をトラブルシューティングする際に役立つコマンドが InterfaceRouteTable
含まれています。
設定プレーンの検証
-
と
InterfaceRouteTable
オブジェクトの状態をRouteTable
確認します。-
オブジェクトの調整のステータスを
InterfaceRouteTable
確認します。kubectl get interfaceroutetable -n
-
オブジェクトの調整のステータスを
RouteTable
確認します。kubectl get routetable -n
-
-
関連する
RouteTable
VN のリファレンスを確認します。関連するInterfaceRouteTable
VMI のリファレンスを確認します。-
VMI の調整のステータスを確認します。VMI には、
InterfaceRouteTable
関連するユニバーサル一意識別子(UUID)、Contrail FQ(、kind
、namespace
、name
)名などのapiversion
メタ情報が表示されます。kubectl get vmi -n -oyaml | grep -i interfaceRouteTable
kubectl get vn -n -oyaml | grep -i routeTable
-
データプレーンの検証
-
イントロスペクションで、以下の手順を使用して、VN の VRF が RT で指定されたスタティック ルート プレフィックスと一致する行を示していることを確認します。
-
VRF が VN に関連付けられていることを確認します。
-
VRF ユニキャストの ucindex 列に移動します
RouteTable
。 -
テーブルに正しい静的ルート プレフィックスを持つ行が含まれていることを確認します。
-
- イントロスペクションで、VNのネクストホッププロパティが有効であることを確認します。イントロスペクションでは、プレフィックスのネクストホップ列には以下が含まれている必要があります。
-
ネクストホップインターフェイス名は、有効なタップインターフェイスである必要があります。
-
は
label
正の整数でなければなりません。 -
値は
resolved
. でなければなりませんtrue
。 -
値は
route-type:
. でなければなりませんInterfaceStaticRoute
。
-