このページで
クラウドネイティブのContrail Networkingに仮想ネットワークルーターを導入
概要 クラウドネイティブのContrail® Networking™ は、(VNR)構成を VirtualNetworkRouter
サポートします。この構造は、 間の接続を提供します VirtualNetworks
。
VirtualNetworkRouter の概要
通常、 VirtualNetwork
(VN)トラフィックはテナントの分離を維持するために分離されます。クラウドネイティブのContrail Networking(CN2) VirtualNetworkRouter
では、(VNR)がルート漏洩を実行します。ルートリークは、ルーティングインスタンス(RI)とこれらのインスタンスに関連付けられたルーティングテーブルをインポートすることで、接続 VirtualNetworks
を確立します。その結果、あるルーティング テーブル内のデバイスは、別のルーティング テーブル内のデバイスからリソースにアクセスできます。
VNR は、次の 2 つの一般的なネットワーク モデルに接続を提供します。
-
メッシュ:接続
VirtualNetworks
されているすべてのポッドが相互に通信します。 -
ハブスポーク:
VirtualNetworks
スポークタイプVNRに接続された2つの異なるVNRタイプ(スポーク、ハブ)VirtualNetworks
に接続し、ハブタイプVNFとVirtualNetworks
通信し、その逆も接続します。VirtualNetworks
スポークVNFに接続すると、スポークVNFは他VirtualNetworks
のスポークVNFと通信できません。
VNRは、CN2内に導入されたKubernetesの構成要素です。
VirtualNetworkRouterのユースケース
以下の例は、CN2におけるVNRの機能を示す一般的なユースケースです。
メッシュの使用事例
同じ名前空間にある 2 つ以上の仮想ネットワークを接続するメッシュ VNR
- 図-1:ユーザーは、名前空間-1 に VN1 と VN2 を作成します。VN1のポッドは、VN2内のポッドに接続できません。これはCN2のデフォルト動作
VirtualNetworks
です。 - 図-2: ユーザーは、VN1 と VN2 を選択するタイプ メッシュの VNR を定義します。この VNR により、VN1 のポッドは VN2 のポッドと通信でき、その逆も同様です。
- 図-3:VN1のポッドは、VN2のポッドに接続します。VNR のルート ターゲットは
importExported
両方VirtualNetworks
です。
同じネームスペース内の新しい仮想ネットワークを既存のメッシュタイプVNRに追加する
- 図 1:2
VirtualNetworks
(VN1、VN2)は名前空間-1 の VNR に接続します。 - 図-2:ユーザーが 2 つの新しい
VirtualNetworks
(VN3、VN4)を作成します。 - 図 3:VN3 と VN4 は VNR に接続します。その結果、VNR に接続されたすべての
VirtualNetworks
接続が受信されます。
同じ名前空間にある 2 つのメッシュ VNF
-
図 1 と図 2:タイプ メッシュの VNR-Web と VNR-db はすでに名前空間-1 に存在します。それぞれの VNF に接続された VNF のみが相互に通信します。
-
図 1 と図 2:VNR-Web と VNR-db は相互に通信します。
- 図 3:VNR-Web と VNR-db の両方に接続されたすべてが
VirtualNetworks
相互に通信します。
名前空間が異なる 2 つのメッシュ VNF
-
図 1:VNR-Web が VN1 と VN2 を選択VN1およびVN2のポッドは相互に通信します。VN1 および VN2 は、VN3 または VN4 と通信できません。
-
図 2:VNR-db は VN3 と VN4 を選択します。VN3およびVN4のポッドは相互に通信します。VN3 および VN4 は VN1 または VN2 と通信できません。
-
図 3:ユーザーは VNR-Web を更新して VNR-db を選択します。
-
図 3:ユーザーは VNR-db を更新して VNR-web を選択します。
-
図 3:2 つの VNR が互いに選択するため、VNR-Web の RT(ルート ターゲット)が VN3 と VN4 に追加されます。VNR-db の RT が VN1 および VN2 に追加されます。VN1、VN2、VN3、VN4 のポッドは相互に通信します。
同じネームスペース内のハブアンドスポークVNF
-
図-1:VN1のポッドは、VN2内のポッドと通信できません。VN1 および VN2 は VN3 と通信できません。
-
図-2:ユーザーは、VNR タイプ「スポーク」と「ハブ」の VNR を作成し、VNR スポークと VNR ハブが互いの RR をインポートします。
-
図 3:VNR スポークと VNR-hub の RR は、互いの VT をインポートするため、VN1、VN2、VN3 に追加されます。その結果、VN1およびVN2のポッドはVN3と通信します。VN1およびVN2のポッドは相互に通信できません。
複数の VNR で同一の仮想ネットワークを使用
-
図 1:VN1 と VN2 のポッドは相互に通信できません。VN3、VN4 のリソースも相互に通信できます。
-
図 2:VN1 と VN2 を選択して VNR スポークを作成します。VN3 と VN4 を選択して、VNR-hub を作成します。VN3 と VN4 を選択して、VNR メッシュを作成します。
-
図 3:VNR スポークにより、VN1 と VN2 が互いに通信できず、VNR ハブによって VN1 と VN2 が VN3 と VN4 に到達でき、VN3 と VN4 間の通信が可能になります。
ユース ケースの説明
このセクションでは、以下の 2 つの VNR のユース ケースと、各ユース ケースのエンドツーエンドの説明で構成されています。
標準的なユースケース:2つの仮想ネットワークを接続する1つのVNR
apiVersion: v1 kind: Namespace metadata: name: ns-single-mesh labels: ns: ns-single-mesh spec: finalizers: - kubernetes --- apiVersion: core.contrail.juniper.net/v1alpha1 kind: Subnet metadata: namespace: ns-single-mesh name: subnet-1 annotations: core.juniper.net/display-name: subnet_vn_1 spec: cidr: "10.10.1.0/24" defaultGateway: 10.10.1.254 --- apiVersion: core.contrail.juniper.net/v1alpha1 kind: Subnet metadata: namespace: ns-single-mesh name: subnet-2 annotations: core.juniper.net/display-name: subnet_vn_2 spec: cidr: "10.10.2.0/24" defaultGateway: 10.10.2.254 --- apiVersion: core.contrail.juniper.net/v1alpha1 kind: VirtualNetwork metadata: namespace: ns-single-mesh name: vn-1 annotations: core.juniper.net/display-name: vn-1 labels: vn: web spec: v4SubnetReference: apiVersion: core.contrail.juniper.net/v1alpha1 kind: Subnet namespace: ns-single-mesh name: subnet-1 --- apiVersion: core.contrail.juniper.net/v1alpha1 kind: VirtualNetwork metadata: namespace: ns-single-mesh name: vn-2 annotations: core.juniper.net/display-name: vn-2 labels: vn: web spec: v4SubnetReference: apiVersion: core.contrail.juniper.net/v1alpha1 kind: Subnet namespace: ns-single-mesh name: subnet-2 --- apiVersion: core.contrail.juniper.net/v1alpha1 kind: VirtualNetworkRouter metadata: namespace: ns-single-mesh name: vnr-1 annotations: core.juniper.net/display-name: vnr-1 labels: vnr: web spec: type: mesh virtualNetworkSelector: matchExpressions: - key: vn operator: In values: - web --- apiVersion: v1 kind: Pod metadata: name: pod-vn-1 namespace: ns-single-mesh annotations: k8s.v1.cni.cncf.io/networks: vn-1 spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: agent-mode operator: NotIn values: - dpdk containers: - name: pod-vn-1 image: svl-artifactory.juniper.net/atom-docker/cn2/bazel-build/dev/google-containers/toolbox command: ["bash","-c","while true; do sleep 60s; done"] securityContext: privileged: true imagePullPolicy: IfNotPresent restartPolicy: OnFailure --- apiVersion: v1 kind: Pod metadata: name: pod-vn-2 namespace: ns-single-mesh annotations: k8s.v1.cni.cncf.io/networks: vn-2 spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: agent-mode operator: NotIn values: - dpdk containers: - name: pod-vn-2 image: svl-artifactory.juniper.net/atom-docker/cn2/bazel-build/dev/google-containers/toolbox command: ["bash","-c","while true; do sleep 60s; done"] securityContext: privileged: true imagePullPolicy: IfNotPresent restartPolicy: OnFailure
このユースケースは、以下の通りです。
-
名前空間
ns-single-mesh
に2つのVirtualNetworks
(vn-1
およびvn-2
)。どちらの仮想ネットワークにも.label
vn: web
それぞれにVirtualNetwork
1つのポッドが含まれています。にはVirtualNetwork
vn-1
、 が含まれていますpod-vn-1
。にはVirtualNetwork
vn-2
、 が含まれていますpod-vn-2
。 -
名前
vnr-1
がtype: mesh
付いた VNR。この VNR は、 と を使用して 2 つのVirtualNetworks
間で接続をmatchExpressions
確立しますvn: web
。VNR は RI とルーティング テーブルvn-1
をその逆にvn-2
インポートします。メッシュタイプVNRであるためvnr-1
、接続VirtualNetworks
されているすべてのポッドが相互に通信します。
導入事例を更新:追加の 2 つの仮想ネットワークを接続する単一の VNR
apiVersion: v1 kind: Namespace metadata: name: ns-single-mesh labels: ns: ns-single-mesh spec: finalizers: - kubernetes --- apiVersion: core.contrail.juniper.net/v1alpha1 kind: Subnet metadata: namespace: ns-single-mesh name: subnet-2 annotations: core.juniper.net/display-name: subnet_vn_1 spec: cidr: "10.10.3.0/24" defaultGateway: 10.10.3.254 --- apiVersion: core.contrail.juniper.net/v1alpha1 kind: Subnet metadata: namespace: ns-single-mesh name: subnet-4 annotations: core.juniper.net/display-name: subnet_vn_2 spec: cidr: "10.10.4.0/24" defaultGateway: 10.10.4.254 --- apiVersion: core.contrail.juniper.net/v1alpha1 kind: VirtualNetwork metadata: namespace: ns-single-mesh name: vn-3 annotations: core.juniper.net/display-name: vn-1 labels: vn: db spec: v4SubnetReference: apiVersion: core.contrail.juniper.net/v1alpha1 kind: Subnet namespace: ns-single-mesh name: subnet-3 --- apiVersion: core.contrail.juniper.net/v1alpha1 kind: VirtualNetwork metadata: namespace: ns-single-mesh name: vn-4 annotations: core.juniper.net/display-name: vn-2 labels: vn: middleware spec: v4SubnetReference: apiVersion: core.contrail.juniper.net/v1alpha1 kind: Subnet namespace: ns-single-mesh name: subnet-4 --- apiVersion: core.contrail.juniper.net/v1alpha1 kind: VirtualNetworkRouter metadata: namespace: ns-single-mesh name: vnr-2 annotations: core.juniper.net/display-name: vnr-1 labels: vnr: db vnr: middleware spec: type: mesh virtualNetworkSelector: matchExpressions: - key: vn operator: In values: - db, middlware --- apiVersion: v1 kind: Pod metadata: name: pod-vn-3 namespace: ns-single-mesh annotations: k8s.v1.cni.cncf.io/networks: vn-1 spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: agent-mode operator: NotIn values: - dpdk containers: - name: pod-vn-3 image: svl-artifactory.juniper.net/atom-docker/cn2/bazel-build/dev/google-containers/toolbox command: ["bash","-c","while true; do sleep 60s; done"] securityContext: privileged: true imagePullPolicy: IfNotPresent restartPolicy: OnFailure --- apiVersion: v1 kind: Pod metadata: name: pod-vn-4 namespace: ns-single-mesh annotations: k8s.v1.cni.cncf.io/networks: vn-2 spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: agent-mode operator: NotIn values: - dpdk containers: - name: pod-vn-4 image: svl-artifactory.juniper.net/atom-docker/cn2/bazel-build/dev/google-containers/toolbox command: ["bash","-c","while true; do sleep 60s; done"] securityContext: privileged: true imagePullPolicy: IfNotPresent restartPolicy: OnFailure
このユースケースは標準的なユースケースと似ていますが、このユースケースでは、ユーザーは追加type: mesh
のVNRでYAMLファイルを更新し、名前空間ns-single-mesh
に2つの新しいVirtualNetworks
(vn-3
とvn-4
)を接続します。以下の点に注意してください。
-
示されているVNRの名前
vnr-2
は、 を持つmatchExpressions: db, middlware
名前空間ns-single-mesh
にあります。 -
には
VirtualNetwork
vn-3
ラベルvn: db
、 とvn-4
のラベルvn: middleware
があります。
その結果、 vnr-2
RIとその逆のルーティングテーブル vn-3
を vn-4
インポートします。
API タイプ(スキーマ)
type VirtualNetworkRouterSpec struct { // Common spec fields CommonSpec `json:",inline" protobuf:"bytes,1,opt,name=commonSpec"` // Type of VirtualNetworkRouter. valid types - mesh, spoke, hub Type VirtualNetworkRouterType `json:"type,omitempty" protobuf:"bytes,2,opt,name=type"` // Select VirtualNetworks to which this VNR's RT be shared VirtualNetworkSelector *metav1.LabelSelector `json:"virtualNetworkSelector,omitempty" protobuf:"bytes,3,opt,name=virtualNetworkSelector"` // Import Router targets from other virtualnetworkrouters Import ImportVirtualNetworkRouter `json:"import,omitempty" protobuf:"bytes,4,opt,name=import"` } type ImportVirtualNetworkRouter struct { VirtualNetworkRouters []VirtualNetworkRouterEntry `json:"virtualNetworkRouters,omitempty" protobuf:"bytes,1,opt,name=virtualNetworkRouters"` } type VirtualNetworkRouterEntry struct { VirtualNetworkRouterSelector *metav1.LabelSelector `json:"virtualNetworkRouterSelector,omitempty" protobuf:"bytes,1,opt,name=virtualNetworkRouterSelector"` NamespaceSelector *metav1.LabelSelector `json:"namespaceSelector,omitempty" protobuf:"bytes,2,opt,name=namespaceSelector"` }
メッシュ VNR
apiVersion: core.contrail.juniper.net/v1alpha1 kind: VirtualNetworkRouter metadata: namespace: frontend name: vnr-1 annotations: core.juniper.net/display-name: vnr-1 labels: vnr: web ns: frontend spec: type: mesh virtualNetworkSelector: matchLabels: vn: web import: virtualNetworkRouters: - virtualNetworkRouterSelector: matchLabels: vnr: db namespaceSelector: matchLabels: ns: backend
前述のYAMLファイルは、 と ns: frontend
を含む名前空間frontend
の名前vnr-1
を持つメッシュVNRのlabels
vnr: web
例です。この VNR は、 で名前空間backend
matchLabel
vnr: db
内の任意の VNR にルート ターゲットをインポートします。
スポーク VNR
kind: VirtualNetworkRouter metadata: namespace: frontend name: vnr-1 annotations: core.juniper.net/display-name: vnr-1 labels: vnrgroup: spokes ns: frontend spec: type: spoke virtualNetworkSelector: matchLabels: vngroup: spokes import: virtualNetworkRouters: - virtualNetworkRouterSelector: matchLabels: vnrgroup: hubs namespaceSelector: matchLabels: ns: backend
前述のYAMLファイルは、 と ns: frontend
の名前空間labels
vnrgroup: spokes
frontend
にある名前vnr-1
を持つスポークVNRの例です。この VNR は、 で名前空間backend
matchLabel
vnrgroup: hubs
内の任意の VNR にルート ターゲットをインポートします。
ハブ VNR
apiVersion: core.contrail.juniper.net/v1alpha1 kind: VirtualNetworkRouter metadata: namespace: backend name: vnr-2 annotations: core.juniper.net/display-name: vnr-2 labels: vnrgroup: hubs ns: backend spec: type: hub virtualNetworkSelector: matchLabels: vngroup: hubs import: virtualNetworkRouters: - virtualNetworkRouterSelector: matchLabels: vnrgroup: spokes namespaceSelector: matchLabels: ns: frontend
前述のYAMLファイルは、 と ns: backend
を持つ名前空間labels
vnrgroup: hubs
backend
の名前vnr-2
を持つハブVNRの例です。この VNR は、 で名前空間frontend
matchLabels
vnrgroup: spokes
内の任意の VNR にルート ターゲットをインポートします。