在云原生 Contrail 网络中部署虚拟网络路由器
总结 云原生 Contrail® 网络™ 支持 VirtualNetworkRouter (VNR) 结构。此结构提供两者之间 VirtualNetworks的连接。
虚拟网络路由器概述
通常, VirtualNetwork 流量是隔离的,以保持租户分离。在云原生 Contrail 网络中, VirtualNetworkRouter (VNR) 执行路由泄漏。路由泄漏通过导入路由实例 (RI) 与与这些实例关联的路由表来建立连接 VirtualNetworks 。因此,一个路由表上的设备可以从另一个路由表上的设备访问资源。
VNR 为以下两种通用网络模式提供连接:
-
网格:所有连接的
VirtualNetworksPod 之间相互通信。 -
中心辐射型:
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)。两个虚拟网络均具有labelvn: web.每个 Pod 都包含VirtualNetwork一个 Pod。包含VirtualNetwork vn-1 pod-vn-1。包含VirtualNetwork vn-2 pod-vn-2。名称为type: mesh的 VNR 使用vn: webmatchExpressions在两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。有VirtualNetworkvn-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中,带有labelsvnr: 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中带有labelsvnrgroup: hubs和 ns: backend的中枢 VNR vnr-2 的示例。此 VNR 将其路由目标导入命名空间frontend中的任何 VNR,并随 matchLabels vnrgroup: spokes。
