鲲鹏社区首页
中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

部署SRIOV-CNI网络直通插件

在部署之前需要确保宿主机上的网卡设备已经打开VF功能,且已经创建足够数量的VF。SRIOV-CNI网络直通插件的部署依赖于Multus和SR-IOV设备直通插件,因而在此之前须部署和配置Multus与SR-IOV设备直通插件。

部署Multus

Multus插件是K8s网络插件的管理器,根据Pod的配置,调用不同的网络插件(如SRIOV-CNI网络直通插件、Flannel等)来配置网络接口。它包括Thin plugin和Thick plugin两类实现,此处使用传统的Thin plugin方式进行配置,可参考配置文件multus-daemonset.yml

  1. 在集群主节点部署Multus插件。
    kubectl apply -f multus-daemonset.yml
  2. 执行以下命令查看部署情况。
    1
    kubectl -n kube-system get pod
    

    multus-ds应当处于Running状态,示例如下。

    NAME                             READY   STATUS    RESTARTS      AGE
    kube-multus-ds-ds26q             1/1     Running   0             20d
    kube-multus-ds-pp6mh             1/1     Running   0             20d

部署SR-IOV设备直通插件

在部署SR-IOV设备直通插件之前需要先修改SR-IOV设备直通插件配置文件。

“configMap.yaml”配置文件描述了SR-IOV插件要管理的设备,即用户期望直通的设备。
apiVersion: v1
kind: ConfigMap
metadata:
  name: sriovdp-config
  namespace: kube-system
data:
  config.json: |
    {
        "resourceList": [
            {
               "resourceName": "huawei_1822_netdevice",
               "resourcePrefix": "huawei.com",
               "selectors": {
                    "vendors": ["19e5"],
                    "devices": ["375e"],
                    "drivers": ["hinic"],
                    "pfNames" : [ensp133s0]
                },
            },
            {
               "resourceName": "huawei_1823_netdevice",
               "resourcePrefix": "huawei.com",
               "selectors": {
                    "vendors": ["19e5"],
                    "devices": ["375f"],
                    "drivers": ["hisdk3"]
                }
            },
...
表1 configMap.yaml文件参数说明

参数

说明

约束条件

resourceName

资源的名字,可自定义。

不能重复并且不能包含特殊字符。

resourcePrefix

资源名称的前缀,可自定义。

不能包含特殊字符,可以写成xx.com,例如huawei.com。

deviceType

设备的类型。

目前支持的值有:accelerator、netDevice、auxNetDevice,默认值是netDevice。

selectors

资源筛选器。

只有与selectors里面填写的筛选条件相同的设备才会被管理。

vendors

设备的厂商号,比如华为的vendors是19e5,具体的查看方法参见2

-

devices

设备的设备号,具体的查看方法参见2

-

drivers

设备使用的驱动名字,具体的查看方法参见3

-

pfNames

网卡上的pf名称

机器上存在多个网口时,需全部添加,防止来自不同网口的vf混用。

  1. 在节点查看需要使用的网卡设备的VF的PCI地址。
    1
    lspci | grep Ethernet
    

    实际使用时创建的网卡设备的VF可能不只一个,选择其中一个VF的PCI地址查找即可,因为所有VF的“vendors”“devices”“drivers”都是一样。

  2. 根据上一步回显信息确认需要使用VF设备的PCI地址是“85:00.1”,然后执行以下命令进一步确认设备的“vendors”“devices”
    其中“vendors”“19e5”“devices”“375e”
    lspci -n | grep 85

  3. 确认设备对应的驱动“drivers”
    在输出中找到PCI地址为“85:00.1”的设备对应的驱动名称。
    lspci -k

  4. 得到“vendors”“devices”“drivers”的信息后,填写到configMap.yaml文件中,每一个SR-IOV设备对应resourceList中的一项。
  5. 通过sriovdp-daemonset.yaml部署文件,在集群中以Daemonset形式部署SR-IOV设备直通插件。
    1
    2
    kubectl apply -f deployments/configMap.yaml
    kubectl apply -f deployments/sriovdp-daemonset.yaml
    
  6. 查看部署情况。
    1
    kubectl -n kube-system get pod
    

    如果部署成功,回显示例如下。kube-sriov-device-plugin的数量与集群节点的数量保持一致。

    1
    2
    3
    4
    NAME                             READY   STATUS              RESTARTS          AGE
    kube-sriov-device-plugin-wkmrd   1/1     Running             0                 14d
    kube-sriov-device-plugin-xvcs3   1/1     Running             0                 14d
    kube-sriov-device-plugin-fgsa2   1/1     Running             0                 14d
    

部署SRIOV-CNI网络直通插件

  1. 在集群中以Daemonset的形式部署,新建部署文件“sriov-cni-daemonset.yaml”,示例如下。
    ---
    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: kube-sriov-cni-ds
      namespace: kube-system
      labels:
        tier: node
        app: sriov-cni
    spec:
      selector:
        matchLabels:
          name: sriov-cni
      template:
        metadata:
          labels:
            name: sriov-cni
            tier: node
            app: sriov-cni
        spec:
          tolerations:
          - key: node-role.kubernetes.io/master
            operator: Exists
            effect: NoSchedule
          - key: node-role.kubernetes.io/control-plane
            operator: Exists
            effect: NoSchedule
          containers:
          - name: kube-sriov-cni
            image: ghcr.io/k8snetworkplumbingwg/sriov-cni:latest
            imagePullPolicy: IfNotPresent
            securityContext:
              allowPrivilegeEscalation: true
              privileged: true
              readOnlyRootFilesystem: true
              capabilities:
                drop:
                  - ALL
            resources:
              requests:
                cpu: "100m"
                memory: "50Mi"
              limits:
                cpu: "100m"
                memory: "50Mi"
            volumeMounts:
            - name: cnibin
              mountPath: /host/opt/cni/bin
          volumes:
            - name: cnibin
              hostPath:
                path: /opt/cni/bin

    在集群中运行如下命令部署。

    kubectl apply -f deployments/sriov-cni-daemonset.yaml
  2. 在Multus中新建SR-IOV直通网络,新建如下“sriov-crd.yaml”配置文件指定SR-IOV网络信息。
    apiVersion: "k8s.cni.cncf.io/v1"
    kind: NetworkAttachmentDefinition
    metadata:
      name: sriov-net1
      annotations:
        k8s.v1.cni.cncf.io/resourceName: huawei.com/huawei_1822_netdevice # 根据configMap.yaml中的resourceName修改
    spec:
      config: '{
      "type": "sriov",
      "cniVersion": "0.3.1",
      "name": "sriov-network",
      "ipam": {
        "type": "host-local",
        "subnet": "10.56.217.0/24",
        "routes": [{
          "dst": "0.0.0.0/0"
        }],
        "gateway": "10.56.217.1"
      }
    }'

    在集群中运行如下命令部署。

    kubectl apply -f deployments/sriov-crd.yaml
  3. 部署后,查询是否所有的网络插件都成功运行。运行如下命令:
    kubectl get pods -owide -n kube-system

    显示示例应当如下,部署的容器都处于Running状态,否则请重新查看错误。

    kube-multus-ds-qhqp4             1/1     Running   0             22h    10.175.119.147   compute01   <none>           <none>
    kube-sriov-cni-ds-4kks2          1/1     Running   0             168m   10.244.1.20      compute01   <none>           <none>
    kube-sriov-device-plugin-bnvg9   1/1     Running   0             20h    10.175.119.147   compute01   <none>           <none>

    查看网络配置是否成功,输入如下命令查看集群中的自定义资源:

    kubectl get crds

    输出中应该包括“network-attachment-definitions.k8s.cni.cncf.io”,如下所示:

    network-attachment-definitions.k8s.cni.cncf.io    2025-03-05T08:21:27Z

(可选)部署whereabouts插件

上述SRIOV-CNI网络直通插件的示例在配置IP地址管理时,使用主机本地(host-local)CNI插件但是主机本地插件只能为同一节点上的Pod分配IP地址,多个节点可能存在地址重复冲突的问题,如果希望SRIOV-CNI网络直通插件动态地在整个集群范围中分配IP地址,可以配置whereabouts插件来满足需求。

  1. 参考部署环境要求下载whereabouts插件后,进入目录当中。
    1
    git clone https://github.com/k8snetworkplumbingwg/whereabouts && cd whereabouts
    
  2. 运行下列部署命令。
    1
    2
    3
    kubectl apply -f doc/crds/daemonset-install.yaml \
          -f doc/crds/whereabouts.cni.cncf.io_ippools.yaml \
          -f doc/crds/whereabouts.cni.cncf.io_overlappingrangeipreservations.yaml
    
  3. 请将先前部署的“sriov-crd.yaml”文件进行卸载,“ipam.type”参数配置为“whereabouts”,且将“subnet”修改为“range”,其余参数按需修改。文件修改完毕后重新部署即可,示例内容如下:
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    apiVersion: "k8s.cni.cncf.io/v1"
    kind: NetworkAttachmentDefinition
    metadata:
      name: sriov-net1
      annotations:
        k8s.v1.cni.cncf.io/resourceName: huawei.com/huawei_1822_netdevice # 根据configMap.yaml中的resourceName修改
    spec:
      config: '{
      "type": "sriov",
      "cniVersion": "0.3.1",
      "name": "sriov-network",
      "ipam": {
        "type": "whereabouts",
        "range": "10.56.217.0/24",
        "exclude": [],
        "routes": [{
           "dst": "0.0.0.0/0"
        }],
        "range_start": "172.21.217.2",
        "range_end": "172.21.217.255",
        "gateway": "10.56.217.1"
      }
    }'