静态路由
总结 瞻博网络云原生 Contrail 网络 (CN2) 23.1 版支持群集的静态路由。本文介绍如何为 CN2 群集配置静态路由。
了解静态路由
当网络不需要动态路由协议的复杂性时,您可以使用静态路由。在路由和转发表中作为永久固定装置的路由通常配置为静态路由。来自剩余网络的内部流量受益于静态路由。
路由由目标前缀和下一跃点转发地址组成。静态路由在路由表中被激活,并在可访问下一跃点地址时插入转发表。与静态路由匹配的流量将被转发到指定的下一跃点地址。
CN2 中的静态路由
CN2 通过以下两个自定义资源 (CR) 实施静态路由:RouteTable
:包含用户定义的下一跃点目标 (nextHop
),以及用于识别下一跃点流量的目标前缀。该nextHop
IP 地址必须是另一个 VMI 对象的 IP 地址。前缀定义用作匹配流量的下一跃点的目标网络。ARouteTable
允许您定义静态路由。您可以将 ARouteTable
与虚拟网络 (VN) 关联。以下是 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
与 , 您不需要定义nextHop
IP 地址,因为当关联 VMIInterfaceRouteTable
时,关联的 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 在其规格中引用了一个
RouteTable
。因此,与
RouteTable
该 VN 关联并配置了静态路由。下面是一个 VN 对象,带有关联的
RouteTable
:
apiVersion: core.contrail.juniper.net/v3 kind: VirtualNetwork metadata: namespace: static-route name: vn-route spec: v4SubnetReference: apiVersion: core.contrail.juniper.net/v1alpha1 kind: Subnet namespace: static-route name: vn-subnet routeTableReferences: - apiVersion: core.contrail.juniper.net/v3 kind: RouteTable namespace: static-route name: static-rt
为 VMI 配置静态路由
配置 anInterfaceRouteTable
以将静态路由应用于 VMI。VMI 在其
InterfaceRouteTableReference
部分引用了一个
InterfaceRouteTable
。下面是一个引用了
InterfaceRouteTable
以下内容的 VMI 对象:
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
在 Pod 接口上配置静态路由
您可以使用 Pod 清单的注释部分为 Pod 的默认接口或辅助接口配置静态路由。Pod 协调器处理注释部分,以创建具有关联的InterfaceRouteTable
VMI 对象。协调器在注释部分查找字符串密钥:“core.juniper.net/interface-route-table”。Pod 的 VMI 使用该字符串作为元数据标签,与 。
InterfaceRouteTable
以下是为默认接口定义的 Pod 清单 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
对于主接口
InterfaceRouteTable
是
vmi-rt
,
name
对于辅助接口是
vn-route
。在同一中定义两
InterfaceRouteTables
个不同
names
接口会自动为该 Pod 的主接口和辅助接口创建一个
InterfaceRouteTable
。
namespace
为具有 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" }'
Pod 接口上的多个静态路由
您可以使用InterfaceRouteTable,
它们将多个静态路由关联到单个 Pod 接口 (VMI)。这意味着该 VMI 对象有多个默认的下一跃点目标,具体取决于 IP 前缀。您可以使用群集服务版本 (CSV) 语法或 JSON 语法annotations
指定多个InterfaceRouteTable
参考。
引用时 InterfaceRouteTable
必须采用“命名空间/名称”格式。在以下示例中, static-route
是命名空间和 to-right
和 to-zone-1
,是 InterfaceRouteTable
VMI 的对象或下 left-vn
一跃点目标。
以下示例包含 Deployment
多个 InterfaceRouteTable
参考:
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
引用的 Pod 清单:
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 故障排除
以下部分包含对各种 RouteTable
问题和 InterfaceRouteTable
问题进行故障排除时的有用命令。
配置平面验证
-
验证和对象的状态
RouteTable
InterfaceRouteTable
。-
检查对象的协调器
InterfaceRouteTable
状态。kubectl get interfaceroutetable -n
-
检查对象的协调器
RouteTable
状态。kubectl get routetable -n
-
-
RouteTable
验证相关 VN 中的参考。InterfaceRouteTable
验证关联 VMI 中的参考。-
检查 VMI 协调器的状态。您应该会看到
InterfaceRouteTable
VMI 中带有关联的通用唯一标识符 (UUID) Contrail FQ(元信息,如apiversion
、kind
namespace
、name
)名称。kubectl get vmi -n -oyaml | grep -i interfaceRouteTable
kubectl get vn -n -oyaml | grep -i routeTable
-
数据平面验证
-
在内省中,使用以下步骤验证 VN 的 VRF 是否显示一行,该行具有 RT 中指定的匹配静态路由前缀:
-
验证 VRF 是否与 VN 关联。
-
导航至 VRF 单播
RouteTable
中的 ucindex 列。 -
验证表中是否包含具有正确静态路由前缀的行。
-
- 在内省中,验证 VN 的下一跃点属性是否有效。在内省中,前缀的下一跃点列应包含以下内容:
-
下一跃点接口名称必须是有效的分路接口。
-
必须是
label
正整数。 -
值
resolved
必须为true
。 -
值
route-type:
必须为InterfaceStaticRoute
。
-