通过路由目标配置虚拟网络间路由
总结 云原生 Contrail 网络支持使用路由目标的虚拟网络间路由。指定通用路由目标,以在虚拟网络之间路由流量。
虚拟网络和路由实例概述
路由实例是路由表、接口和路由协议参数的集合。路由实例中的接口集属于路由表,路由协议参数控制路由表中的信息。单个路由实例可能具有多个路由表,例如,单个路由实例中可以存在单播 IPv4、单播 IPv6 和组播 IPv4 路由表。
在虚拟网络中,物理网络设备可能被拆分成多个虚拟路由器,每个路由器都有自己的接口、路由实例和关联的虚拟网络。路由实例将隔离一个 VirtualNetwork
中的流量。如果要在虚拟网络之间路由流量,可以为这些网络定义通用路由目标。
路由目标概述
通过路由目标,您的虚拟网络(命名空间)能够在 MPLS(多协议标签交换)配置中交换虚拟路由和转发 (VRF) 路由表。路由目标是定义 VPN 成员资格的 BGP 扩展社区属性。换句话说,在扩展社区属性中定义的所有路由都由该 VPN 的其他成员共享。您可以在 VRF 策略中定义以下两个路由目标:
-
路由目标导入列表:定义要导入的 VRF 可接受路由目标列表。当提供商边缘 (PE) 路由器从其他 PE 路由器收到路由时,它会将连接到每个路由的路由目标与为其每个 VRF 定义的路由目标导入列表进行比较。如果新路由目标与导入列表中定义的路由目标匹配,则 VRF 会拒绝该路由。
-
路由目标导出列表:定义连接到 VPN 中其他 PE 路由器的每个路由的路由目标列表。
根据您的网络配置,导入列表和导出列表可能相同。通常,请执行以下操作:
-
为每个 VPN 分配一个路由目标扩展社区值。
-
将导入列表和导出列表配置为包含相同信息:包含与 VRF 关联的站点的 VPN 集。
对于更复杂的配置(如中心辐射型 VPN),路由目标导入列表和路由目标导出列表可能不相同。
使用 NAD 通过路由目标启用虚拟网络间路由
通过在资源中VirtualNetwork
定义匹配的路由目标,建立路由目标社区。这样,您可以在虚拟网络(命名空间)之间路由流量。使用NAD
(网络附件定义)将路由目标添加到VirtualNetwork
资源对象。
网络附件定义 (NAD) 是由 Kubernetes 网络管道工作组指定的自定义资源定义 (CRD)。此 CRD NAD
定义 Pod 如何连接到该NAD
对象引用的逻辑(虚拟)或物理网络。换句话说,该NAD
对象包含 Pod 与网络相关的网络信息(命名空间、子网、路由、接口)。您可以在 YAML 中annotations
NAD
为VirtualNetwork
资源定义以下选项:
-
ipamV4Subnet
(可选):为您的VirtualNetwork
IPv4 CIDR 子网指定。 -
ipamV6Subnet
(可选):为您的VirtualNetwork
IPv6 CIDR 子网指定。 -
routeTargetList
(可选):列出导入和导出路由目标。 -
importRouteTargetList
(可选):列出用作导入的路由目标。 -
exportRouteTargetList
(可选):列出用作导出的路由目标。 -
fabricSNAT
(可选):通过端口映射切换与底层网络的连接。默认设置为false
。
此外,该控制器还NAD-Controller
NAD
监控对象创建事件,并相应地创建和更新。VirtualNetwork
NAD
在juniper.net/networks-status
创建期间VirtualNetwork
更新成功或错误事件的说明。
如果未指定 juniper.net/networks
注释,则云原生 Contrail 网络将资源 NAD
视为第三方资源,不会创建 Contrail 资源(如 VirtualNetwork
和 Subnet
)。
以下示例显示了一个已定义多个annotations
的示例 NAD
YAML 文件:
示例 1:
apiVersion: "k8s.cni.cncf.io/v1" kind: NetworkAttachmentDefinition metadata: name: nasa-network namespace: nm1 annotations: juniper.net/networks: '{ "ipamV4Subnet": "172.16.10.0/24", "ipamV6Subnet": "2001:db8::/64", "routeTargetList": ["target:23:4561"], "importRouteTargetList": ["target:10.2.2.2:561"], "exportRouteTargetList": ["target:10.1.1.1:561"], "fabricSNAT": true }' juniper.net/networks-status: # should be updated by Kube-Manager to status of NAD object. spec: config: '{ "cniVersion": "0.3.1", "name": "nasa-network", "type": "contrail-k8s-cni" }'
应用 NAD
YAML 文件后,该NAD-Controller
消息会自动更新VirtualNetwork
资源。
以下示例显示了定义了 VirtualNetwork
多个路由目标选项的资源:
示例 2:
apiVersion: core.contrail.juniper.net/v1alpha1 kind: VirtualNetwork metadata: namespace: project-sample name: virtualnetwork-sample spec: routeTargetList: - target:23:4561 - target:21L:7000 - target:871:6540 importRouteTargetList: - target:10.2.2.2:561 - target:97:651 exportRouteTargetList: - target:10.1.1.1:561 - target:97:651
建立所需的网络注释后,您可以使用连接到具有共享路由目标的网络的自定义接口来创建一个 Pod。由于和 VirtualNetwork
对象中NAD
定义的共享路由目标,这些网络相互路由流量。
以下示例显示了一个 Pod YAML 文件,其自定义接口源自示例 1 中的注释。
示例 3:
apiVersion: v1 kind: Pod metadata: name: nasa-pod-1 annotations: k8s.v1.cni.cncf.io/networks: |- [ { "name":"nasa-network1", "namespace":"nasa-ns", "cni-args":null, "ips":["172.16.20.42"], "mac":"de:ad:00:00:be:ef", "interface":"tap1" }, { "name":"nasa-network2", "namespace":"nasa-ns", "cni-args":null, "ips":["172.16.21.42"], "mac":"de:ad:00:00:be:ee", "interface":"tap2" } ]
请注意,在前面的代码示例中nasa-network1
(和 nasa-network2
)中显示的两个接口连接到不同网络。由于 NAD
功能,您可以在这些网络之间路由流量。