在云原生 Contrail 网络中部署虚拟网络路由器
总结 云原生 Contrail® 网络™ 支持 VirtualNetworkRouter
(VNR) 结构。此结构提供两者之间 VirtualNetworks
的连接。
虚拟网络路由器概述
通常, VirtualNetwork
流量是隔离的,以保持租户分离。在云原生 Contrail 网络中, VirtualNetworkRouter
(VNR) 执行路由泄漏。路由泄漏通过导入路由实例 (RI) 与与这些实例关联的路由表来建立连接 VirtualNetworks
。因此,一个路由表上的设备可以从另一个路由表上的设备访问资源。
VNR 为以下两种通用网络模式提供连接:
-
网格:所有连接的
VirtualNetworks
Pod 之间相互通信。 -
中心辐射型:
VirtualNetworks
连接到两种不同的 VNR 类型(辐射型、中心)。VirtualNetworks
连接到辐射型 VNF 与VirtualNetworks
连接到中心型 VNF 通信,反之亦然。VirtualNetworks
连接到辐射型 VNF 不能与其他VirtualNetworks
连接到辐射型 VNR 通信。
VNR 是部署在云原生 Contrail 网络内的 Kubernetes 结构。
虚拟网络路由器用例
以下示例是一些常见用例,展示了 VNR 在云原生 Contrail 网络中的功能。
网状 VNR,用于连接同一命名空间中的两个或多个虚拟网络
- 图 1:用户在命名空间 1 中创建 VN1 和 VN2。VN1 中的 Pod 无法连接到 VN2 中的 Pod。这是云原生 Contrail 网络的默认行为
VirtualNetworks
。 - 图 2:用户定义一个选择 VN1 和 VN2 的网格类型。这种 VNR 允许 VN1 中的 Pod 与 VN2 中的 Pod 通信,反之亦然。
- 图 3:VN1 中的 Pod 连接到 VN2 中的 Pod。VNR 的路由目标同时针对
importExported
两者VirtualNetworks
。
将同一命名空间中的新虚拟网络添加到现有网状类型 VNR
- 图 1:两个
VirtualNetworks
(VN1、VN2)连接到命名空间 1 中的 VNR。 - 图 2:用户创建两个新
VirtualNetworks
(VN3、VN4)。 - 图 3:VN3 和 VN4 连接到 VNR。因此,所有
VirtualNetworks
连接到 VNR 的 VNR 都会收到连接。
同一命名空间中的两个网状 VNR
- 图 1:命名空间 1 中已存在 VNR-web 和 VNR-db 类型的网格。只有连接到相应 VNR 的 VN 相互通信。
- 图 2:VNR-web 和 VNR-db 相互通信。
- 图 3:所有
VirtualNetworks
连接到 VNR-Web 和 VNR-db 的互连设备相互通信。
具有不同名称空间的两个网状 VNR
- 图 1:VNR-web 选择 VN1 和 VN2。VN1 和 VN2 中的 Pod 相互通信。VN1 和 VN2 无法与 VN3 和 VN4 通信。
- 图 2:VNR-db 选择 VN3 和 VN4。VN3 和 VN4 中的 Pod 相互通信。VN3 和 VN4 无法与 VN1 和 VN2 通信。
- 图 3:用户更新 VNR-web 以选择 VNR-db。
- 图 3:用户更新 VNR-db 以选择 VNR-web。
- 图 3:由于两个 VNR 相互选择,VNR-web 的 RT(路由目标)被添加到 VN3 和 VN4 中。VNR-db 的 RT 被添加到 VN1 和 VN2 中。VN1、VN2、VN3 和 VN4 中的 Pod 相互通信。
同一命名空间中的中心辐射型 VNR
- 图 1:VN1 中的 Pod 无法与 VN2 中的 Pod 通信。VN1 和 VN2 无法与 VN3 通信。
- 图 2:用户创建类型为“辐射”和“中心”的 VNR。VNR 辐射型和 VNR 中心相互导入对方的 RT。
- 图 3:VNR 辐射型和 VNR-hub 的 RT 被添加到 VN1、VN2 和 VN3 中,因为它们相互导入了对方的 RT。因此,VN1 和 VN2 中的 Pod 会与 VN3 通信。VN1 和 VN2 中的 Pod 无法通信。
多个 VNR 下的相同虚拟网络
- 图 1:VN1 和 VN2 中的 Pod 无法相互通信。但 VN3、VN4关于 VN3、VN4 的资源也可以相互通信
- 图 2:创建 VNR 辐射选择 VN1、VN2、VNR 中心选择 VN3、VN4、VNR 网格选择 VN3、VN4
- 图 3:VNR 辐射确保 VN1、VN2 之间无法相互通信,VNR-hub 允许 VN1、VN2 到达 VN3、VN4,而 VNR 网状网络可实现 VN3、VN4 之间的通信
标准用例:单个 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
中的两个 VirtualNetworks
(vn-1
, vn-2
)。两个虚拟网络均具有label
vn: web
.每个 Pod 都包含VirtualNetwork
一个 Pod。包含VirtualNetwork
vn-1
pod-vn-1
。包含VirtualNetwork
vn-2
pod-vn-2
。名称为type: mesh
的 VNR 使用vn: web
matchExpressions
在两VirtualNetworks
者之间建立vnr-1
连接。VNR 将 RI 和路由表vn-1
导入到vn-2
,反之亦然。由于vnr-1
是网状型 VNR,因此所有连接的 VirtualNetworks
Pod 相互通信。
更新用例:单个 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
中的两个新 VirtualNetworks
(vn-3
, vn-4
)。所示的 VNR 名称名称vnr-2
与 ns-single-mesh
matchExpressions: db, middlware
。有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 是一个网格 VNR 的示例,名称vnr-1
在命名空间frontend
中,带有labels
vnr: web
和ns: frontend
。此 VNR 将其路由目标导入命名空间backend
中的任何 VNR,并随 matchLabel
vnr: db
。
辐射型 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 是分支 VNR 的示例,名称vnr-1
在命名空间vnrgroup: spokes
frontend
labels
中带有 and。ns: frontend
此 VNR 将其路由目标导入命名空间backend
中的任何 VNR,并随 matchLabel
vnrgroup: hubs
。
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 是名称在命名空间backend
中带有labels
vnrgroup: hubs
和 ns: backend
的中枢 VNR vnr-2
的示例。此 VNR 将其路由目标导入命名空间frontend
中的任何 VNR,并随 matchLabels
vnrgroup: spokes
。