×

作为集群管理员,您可以使用 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 接口。

使用 CNI VRF 插件创建附加网络附件

集群网络操作员 (CNO) 管理附加网络定义。当您指定要创建的附加网络时,CNO 会自动创建NetworkAttachmentDefinition自定义资源 (CR)。

不要编辑集群网络操作员管理的NetworkAttachmentDefinition CR。这样做可能会中断附加网络上的网络流量。

要使用 CNI VRF 插件创建附加网络附件,请执行以下步骤。

先决条件
  • 安装 OpenShift Container Platform CLI (oc)。

  • 以具有集群管理员权限的用户身份登录到 OpenShift 集群。

步骤
  1. 为附加网络附件创建Network自定义资源 (CR),并插入附加网络的rawCNIConfig配置,如下例 CR 所示。将 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)
            }]
          }'
    1 plugins必须是一个列表。列表中的第一项必须是作为 VRF 网络基础的辅助网络。列表中的第二项是 VRF 插件配置。
    2 type必须设置为vrf
    3 vrfname是分配给接口的 VRF 的名称。如果它不存在于 Pod 中,则会创建它。
    4 可选。table是路由表 ID。默认情况下,使用tableid参数。如果未指定,CNI 会将空闲路由表 ID 分配给 VRF。

    只有当资源类型为netdevice时,VRF 才能正常工作。

  2. 创建Network资源

    $ oc create -f additional-network-attachment.yaml
  3. 通过运行以下命令确认 CNO 是否创建了NetworkAttachmentDefinition CR。将<namespace>替换为您在配置网络附件时指定的命名空间,例如additional-network-1

    $ oc get network-attachment-definitions -n <namespace>
    示例输出
    NAME                       AGE
    additional-network-1       14m

    CNO 创建 CR 之前可能会有延迟。

验证
  1. 创建一个 Pod 并将其分配到具有 VRF 实例的附加网络

    1. 创建一个定义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 实例的附加网络的名称。
    2. 通过运行以下命令创建Pod资源

      $ oc create -f pod-additional-net.yaml
      示例输出
      pod/test-pod created
  2. 验证 Pod 网络附件是否连接到 VRF 附加网络。启动与 Pod 的远程会话并运行以下命令

    $ ip vrf show
    示例输出
    Name              Table
    -----------------------
    vrf-1             1001
  3. 确认 VRF 接口是附加接口的控制器

    $ ip link
    示例输出
    5: net1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master red state UP mode