×

以下部分提供有关如何创建和管理基于主接口的 MAC-VLAN、IP-VLAN 和 VLAN 子接口的说明和信息。

关于在容器网络命名空间中配置主接口

您可以创建一个基于存在于容器命名空间中的master接口的 MAC-VLAN、IP-VLAN 或 VLAN 子接口。您也可以在单独的网络附件定义 CRD 中将master接口作为 Pod 网络配置的一部分创建。

要使用容器命名空间master接口,必须为NetworkAttachmentDefinition CRD 的子接口配置中存在的linkInContainer参数指定true

在 SR-IOV VF 上创建多个 VLAN

利用此功能的一个用例示例是基于 SR-IOV VF 创建多个 VLAN。为此,首先创建一个 SR-IOV 网络,然后为 VLAN 接口定义网络附件。

以下示例显示如何配置此图中所示的设置。

Creating VLANs
图 1. 创建 VLAN
先决条件
  • 您已安装 OpenShift CLI (oc)。

  • 您可以作为具有cluster-admin角色的用户访问集群。

  • 您已安装 SR-IOV 网络操作符。

步骤
  1. 使用以下命令创建一个要部署 Pod 的专用容器命名空间

    $ oc new-project test-namespace
  2. 创建 SR-IOV 节点策略

    1. 创建一个SriovNetworkNodePolicy对象,然后将 YAML 保存到sriov-node-network-policy.yaml文件中

      apiVersion: sriovnetwork.openshift.io/v1
      kind: SriovNetworkNodePolicy
      metadata:
       name: sriovnic
       namespace: openshift-sriov-network-operator
      spec:
       deviceType: netdevice
       isRdma: false
       needVhostNet: true
       nicSelector:
         vendor: "15b3" (1)
         deviceID: "101b" (2)
         rootDevices: ["00:05.0"]
       numVfs: 10
       priority: 99
       resourceName: sriovnic
       nodeSelector:
          feature.node.kubernetes.io/network-sriov.capable: "true"

      SR-IOV 网络节点策略配置示例,设置deviceType: netdevice,专门针对 Mellanox 网络接口卡 (NIC) 量身定制。

      1 SR-IOV 网络设备的供应商十六进制代码。值15b3与 Mellanox NIC 相关联。
      2 SR-IOV 网络设备的设备十六进制代码。
    2. 运行以下命令应用 YAML

      $ oc apply -f sriov-node-network-policy.yaml

      由于节点需要重新启动,因此应用此操作可能需要一些时间。

  3. 创建 SR-IOV 网络

    1. 为附加 SR-IOV 网络附件创建SriovNetwork自定义资源 (CR),如以下示例 CR 中所示。将 YAML 保存为文件sriov-network-attachment.yaml

      apiVersion: sriovnetwork.openshift.io/v1
      kind: SriovNetwork
      metadata:
       name: sriov-network
       namespace: openshift-sriov-network-operator
      spec:
       networkNamespace: test-namespace
       resourceName: sriovnic
       spoofChk: "off"
       trust: "on"
    2. 运行以下命令应用 YAML

      $ oc apply -f sriov-network-attachment.yaml
  4. 创建 VLAN 附加网络

    1. 使用以下 YAML 示例,创建一个名为vlan100-additional-network-configuration.yaml的文件

      apiVersion: k8s.cni.cncf.io/v1
      kind: NetworkAttachmentDefinition
      metadata:
        name: vlan-100
        namespace: test-namespace
      spec:
        config: |
          {
            "cniVersion": "0.4.0",
            "name": "vlan-100",
            "plugins": [
              {
                "type": "vlan",
                "master": "ext0", (1)
                "mtu": 1500,
                "vlanId": 100,
                "linkInContainer": true, (2)
                "ipam": {"type": "whereabouts", "ipRanges": [{"range": "1.1.1.0/24"}]}
              }
            ]
          }
      1 VLAN 配置需要指定master名称。这可以在 Pod 网络注释中配置。
      2 必须指定linkInContainer参数。
    2. 运行以下命令应用 YAML 文件

      $ oc apply -f vlan100-additional-network-configuration.yaml
  5. 使用前面指定的网络创建 Pod 定义

    1. 使用以下 YAML 示例,创建一个名为pod-a.yaml的文件

      下面的清单包含 2 个资源

      • 具有安全标签的命名空间

      • 具有适当网络注释的 Pod 定义

      apiVersion: v1
      kind: Namespace
      metadata:
        name: test-namespace
        labels:
          pod-security.kubernetes.io/enforce: privileged
          pod-security.kubernetes.io/audit: privileged
          pod-security.kubernetes.io/warn: privileged
          security.openshift.io/scc.podSecurityLabelSync: "false"
      ---
      apiVersion: v1
      kind: Pod
      metadata:
        name: nginx-pod
        namespace: test-namespace
        annotations:
          k8s.v1.cni.cncf.io/networks: '[
            {
              "name": "sriov-network",
              "namespace": "test-namespace",
              "interface": "ext0" (1)
            },
            {
              "name": "vlan-100",
              "namespace": "test-namespace",
              "interface": "ext0.100"
            }
          ]'
      spec:
        securityContext:
          runAsNonRoot: true
        containers:
          - name: nginx-container
            image: nginxinc/nginx-unprivileged:latest
            securityContext:
              allowPrivilegeEscalation: false
              capabilities:
                drop: ["ALL"]
            ports:
              - containerPort: 80
            seccompProfile:
              type: "RuntimeDefault"
      1 用作 VLAN 接口master的名称。
    2. 运行以下命令应用 YAML 文件

      $ oc apply -f pod-a.yaml
  6. 运行以下命令,获取test-namespace命名空间内nginx-pod的详细信息

    $ oc describe pods nginx-pod -n test-namespace
    示例输出
    Name:         nginx-pod
    Namespace:    test-namespace
    Priority:     0
    Node:         worker-1/10.46.186.105
    Start Time:   Mon, 14 Aug 2023 16:23:13 -0400
    Labels:       <none>
    Annotations:  k8s.ovn.org/pod-networks:
                    {"default":{"ip_addresses":["10.131.0.26/23"],"mac_address":"0a:58:0a:83:00:1a","gateway_ips":["10.131.0.1"],"routes":[{"dest":"10.128.0.0...
                  k8s.v1.cni.cncf.io/network-status:
                    [{
                        "name": "ovn-kubernetes",
                        "interface": "eth0",
                        "ips": [
                            "10.131.0.26"
                        ],
                        "mac": "0a:58:0a:83:00:1a",
                        "default": true,
                        "dns": {}
                    },{
                        "name": "test-namespace/sriov-network",
                        "interface": "ext0",
                        "mac": "6e:a7:5e:3f:49:1b",
                        "dns": {},
                        "device-info": {
                            "type": "pci",
                            "version": "1.0.0",
                            "pci": {
                                "pci-address": "0000:d8:00.2"
                            }
                        }
                    },{
                        "name": "test-namespace/vlan-100",
                        "interface": "ext0.100",
                        "ips": [
                            "1.1.1.1"
                        ],
                        "mac": "6e:a7:5e:3f:49:1b",
                        "dns": {}
                    }]
                  k8s.v1.cni.cncf.io/networks:
                    [ { "name": "sriov-network", "namespace": "test-namespace", "interface": "ext0" }, { "name": "vlan-100", "namespace": "test-namespace", "i...
                  openshift.io/scc: privileged
    Status:       Running
    IP:           10.131.0.26
    IPs:
      IP:  10.131.0.26

在容器命名空间中基于桥接主接口创建子接口

您可以基于存在于容器命名空间中的桥接master接口创建子接口。创建子接口可以应用于其他类型的接口。

先决条件
  • 您已安装 OpenShift CLI(oc)。

  • 您已以具有cluster-admin权限的用户身份登录到 OpenShift Container Platform 集群。

步骤
  1. 输入以下命令,创建一个您要部署 Pod 的专用容器命名空间

    $ oc new-project test-namespace
  2. 使用以下 YAML 示例,创建一个名为bridge-nad.yaml的桥接NetworkAttachmentDefinition自定义资源定义 (CRD) 文件

    apiVersion: "k8s.cni.cncf.io/v1"
    kind: NetworkAttachmentDefinition
    metadata:
      name: bridge-network
    spec:
      config: '{
        "cniVersion": "0.4.0",
        "name": "bridge-network",
        "type": "bridge",
        "bridge": "br-001",
        "isGateway": true,
        "ipMasq": true,
        "hairpinMode": true,
        "ipam": {
          "type": "host-local",
          "subnet": "10.0.0.0/24",
          "routes": [{"dst": "0.0.0.0/0"}]
        }
      }'
  3. 运行以下命令,将NetworkAttachmentDefinition CRD 应用到您的 OpenShift Container Platform 集群

    $ oc apply -f bridge-nad.yaml
  4. 输入以下命令,验证您是否已成功创建NetworkAttachmentDefinition CRD

    $ oc get network-attachment-definitions
    示例输出
    NAME             AGE
    bridge-network   15s
  5. 使用以下 YAML 示例,创建一个名为ipvlan-additional-network-configuration.yaml的文件,用于 IPVLAN 附加网络配置

    apiVersion: k8s.cni.cncf.io/v1
    kind: NetworkAttachmentDefinition
    metadata:
      name: ipvlan-net
      namespace: test-namespace
    spec:
      config: '{
        "cniVersion": "0.3.1",
        "name": "ipvlan-net",
        "type": "ipvlan",
        "master": "ext0", (1)
        "mode": "l3",
        "linkInContainer": true, (2)
        "ipam": {"type": "whereabouts", "ipRanges": [{"range": "10.0.0.0/24"}]}
      }'
    1 指定要与网络附件关联的以太网接口。这随后会在 Pod 网络注释中进行配置。
    2 指定master接口位于容器网络命名空间中。
  6. 运行以下命令应用 YAML 文件

    $ oc apply -f ipvlan-additional-network-configuration.yaml
  7. 运行以下命令,验证NetworkAttachmentDefinition CRD 是否已成功创建

    $ oc get network-attachment-definitions
    示例输出
    NAME             AGE
    bridge-network   87s
    ipvlan-net       9s
  8. 使用以下 YAML 示例,创建一个名为pod-a.yaml的文件,用于 Pod 定义

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-a
      namespace: test-namespace
      annotations:
        k8s.v1.cni.cncf.io/networks: '[
          {
            "name": "bridge-network",
            "interface": "ext0" (1)
          },
          {
            "name": "ipvlan-net",
            "interface": "ext1"
          }
        ]'
    spec:
      securityContext:
        runAsNonRoot: true
        seccompProfile:
          type: RuntimeDefault
      containers:
      - name: test-pod
        image: quay.io/openshifttest/hello-sdn@sha256:c89445416459e7adea9a5a416b3365ed3d74f2491beb904d61dc8d1eb89a72a4
        securityContext:
          allowPrivilegeEscalation: false
          capabilities:
            drop: [ALL]
    1 指定用作 IPVLAN 接口master的名称。
  9. 运行以下命令应用 YAML 文件

    $ oc apply -f pod-a.yaml
  10. 使用以下命令验证 Pod 是否正在运行

    $ oc get pod -n test-namespace
    示例输出
    NAME    READY   STATUS    RESTARTS   AGE
    pod-a   1/1     Running   0          2m36s
  11. 运行以下命令,显示test-namespace命名空间内pod-a资源的网络接口信息

    $ oc exec -n test-namespace pod-a -- ip a
    示例输出
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host
           valid_lft forever preferred_lft forever
    3: eth0@if105: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1400 qdisc noqueue state UP group default
        link/ether 0a:58:0a:d9:00:5d brd ff:ff:ff:ff:ff:ff link-netnsid 0
        inet 10.217.0.93/23 brd 10.217.1.255 scope global eth0
           valid_lft forever preferred_lft forever
        inet6 fe80::488b:91ff:fe84:a94b/64 scope link
           valid_lft forever preferred_lft forever
    4: ext0@if107: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
        link/ether be:da:bd:7e:f4:37 brd ff:ff:ff:ff:ff:ff link-netnsid 0
        inet 10.0.0.2/24 brd 10.0.0.255 scope global ext0
           valid_lft forever preferred_lft forever
        inet6 fe80::bcda:bdff:fe7e:f437/64 scope link
           valid_lft forever preferred_lft forever
    5: ext1@ext0: <BROADCAST,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default
        link/ether be:da:bd:7e:f4:37 brd ff:ff:ff:ff:ff:ff
        inet 10.0.0.1/24 brd 10.0.0.255 scope global ext1
           valid_lft forever preferred_lft forever
        inet6 fe80::beda:bd00:17e:f437/64 scope link
           valid_lft forever preferred_lft forever

    此输出显示网络接口ext1与物理接口ext0关联。