22.9. 为 VRF 分配从属网络
作为集群管理员,您可以使用 CNI VRF 插件为虚拟路由和转发 (VRF) 域配置额外网络。此插件创建的虚拟网络与您指定的物理接口关联。
使用带有 VRF 实例的二级网络有以下优点:
- 工作负载隔离
- 通过为额外网络配置 VRF 实例来隔离工作负载流量。
- 提高了安全性
- 通过 VRF 域中的隔离网络路径启用更高的安全性。
- 多租户支持
- 通过网络分段支持每个租户的 VRF 域中唯一路由表的多租户。
使用 VRF 的应用程序必须绑定到特定设备。通常的用法是在套接字中使用 SO_BINDTODEVICE
选项。SO_BINDTODEVICE
选项将套接字绑定到在传递接口名称中指定的设备,如 eth1
。要使用 SO_BINDTODEVICE
选项,应用程序必须具有 CAP_NET_RAW
功能。
OpenShift Container Platform pod 不支持通过 ip vrf exec
命令使用 VRF。要使用 VRF,将应用程序直接绑定到 VRF 接口。
其他资源
22.9.1. 使用 CNI VRF 插件创建额外网络附加
Cluster Network Operator (CNO) 管理额外网络定义。当您指定要创建的额外网络时,CNO 会自动创建 NetworkAttachmentDefinition
自定义资源(CR)。
请勿编辑 Cluster Network Operator 所管理的 NetworkAttachmentDefinition
CR。这样做可能会破坏额外网络上的网络流量。
要使用 CNI VRF 插件创建额外网络附加,请执行以下步骤。
先决条件
- 安装 OpenShift Container Platform CLI(oc)。
- 以具有 cluster-admin 权限的用户身份登录 OpenShift 集群。
流程
为额外网络附加创建
Network
自定义资源 (CR),并为额外网络插入rawCNIConfig
配置,如下例所示。将 YAML 保存为文件additional-network-attachment.yaml
。apiVersion: operator.openshift.io/v1 kind: Network metadata: name: cluster spec: additionalNetworks: - name: test-network-1 namespace: additional-network-1 type: Raw rawCNIConfig: '{ "cniVersion": "0.3.1", "name": "macvlan-vrf", "plugins": [ 1 { "type": "macvlan", "master": "eth1", "ipam": { "type": "static", "addresses": [ { "address": "191.168.1.23/24" } ] } }, { "type": "vrf", 2 "vrfname": "vrf-1", 3 "table": 1001 4 }] }'
注意只有在资源类型为
netdevice
时,VRF 才能正常工作。创建
Network
资源:$ oc create -f additional-network-attachment.yaml
通过运行以下命令确认 CNO 创建了
NetworkAttachmentDefinition
CR。将<namespace>
替换为您在配置网络附加时指定的命名空间,如additional-network-1
。$ oc get network-attachment-definitions -n <namespace>
输出示例
NAME AGE additional-network-1 14m
注意CNO 创建 CR 之前可能会有延迟。
验证
创建 pod,并使用 VRF 实例将其分配给额外网络:
创建定义
Pod
资源的 YAML 文件:pod-additional-net.yaml
文件示例apiVersion: v1 kind: Pod metadata: name: pod-additional-net annotations: k8s.v1.cni.cncf.io/networks: '[ { "name": "test-network-1" 1 } ]' spec: containers: - name: example-pod-1 command: ["/bin/bash", "-c", "sleep 9000000"] image: centos:8
- 1
- 使用 VRF 实例指定额外网络的名称。
运行以下命令来创建
Pod
资源:$ oc create -f pod-additional-net.yaml
输出示例
pod/test-pod created
验证 Pod 网络附加是否已连接到 VRF 额外网络。使用 pod 启动远程会话并运行以下命令:
$ ip vrf show
输出示例
Name Table ----------------------- vrf-1 1001
确认 VRF 接口是额外接口的控制器:
$ ip link
输出示例
5: net1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master red state UP mode