部署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。
- 在集群主节点部署Multus插件。
kubectl apply -f multus-daemonset.yml
- 执行以下命令查看部署情况。
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设备直通插件配置文件。
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"] } }, ...
参数 |
说明 |
约束条件 |
---|---|---|
resourceName |
资源的名字,可自定义。 |
不能重复并且不能包含特殊字符。 |
resourcePrefix |
资源名称的前缀,可自定义。 |
不能包含特殊字符,可以写成xx.com,例如huawei.com。 |
deviceType |
设备的类型。 |
目前支持的值有:accelerator、netDevice、auxNetDevice,默认值是netDevice。 |
selectors |
资源筛选器。 |
只有与selectors里面填写的筛选条件相同的设备才会被管理。 |
vendors |
设备的厂商号,比如华为的vendors是19e5,具体的查看方法参见2。 |
- |
devices |
设备的设备号,具体的查看方法参见2。 |
- |
drivers |
设备使用的驱动名字,具体的查看方法参见3。 |
- |
pfNames |
网卡上的pf名称 |
机器上存在多个网口时,需全部添加,防止来自不同网口的vf混用。 |
- 在节点查看需要使用的网卡设备的VF的PCI地址。
1
lspci | grep Ethernet
实际使用时创建的网卡设备的VF可能不只一个,选择其中一个VF的PCI地址查找即可,因为所有VF的“vendors”、“devices”、“drivers”都是一样。
- 根据上一步回显信息确认需要使用VF设备的PCI地址是“85:00.1”,然后执行以下命令进一步确认设备的“vendors”和“devices”。其中“vendors”是“19e5”,“devices”是“375e”。
lspci -n | grep 85
- 确认设备对应的驱动“drivers”。在输出中找到PCI地址为“85:00.1”的设备对应的驱动名称。
lspci -k
- 得到“vendors”、“devices”、“drivers”的信息后,填写到configMap.yaml文件中,每一个SR-IOV设备对应resourceList中的一项。
- 通过sriovdp-daemonset.yaml部署文件,在集群中以Daemonset形式部署SR-IOV设备直通插件。
1 2
kubectl apply -f deployments/configMap.yaml kubectl apply -f deployments/sriovdp-daemonset.yaml
- 查看部署情况。
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网络直通插件
- 在集群中以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
- 在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
- 部署后,查询是否所有的网络插件都成功运行。运行如下命令:
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插件来满足需求。
- 参考部署环境要求下载whereabouts插件后,进入目录当中。
1
git clone https://github.com/k8snetworkplumbingwg/whereabouts && cd whereabouts
- 运行下列部署命令。
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
- 请将先前部署的“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" } }'