在kubevirt中使用macvtap cni
在kubevirt中使用macvtap-cni¶
macvtap原理 参考链接
macvtap CNI允许用户在现有主机网口之上定义Kubernetes网络。 通过使用macvtap插件,用户可以直接将pod连接到主机接口,并通过tap设备使用它。 主要使用场景:在Kubevirt环境,为vm分配macvtap类型网卡。macvtap CNI包括一个设备插件,以适当的方式将macvtap接口暴露给pod。 在kubevirt环境中,macvtap需要和Multus结合使用,并且Multus运行在thick模式。 Multus获取设备插件分配的接口名称,并负责使用该名称作为deviceID调用cni插件。
所在在kubevirt环境中要使用macvtap,需要先部署multus
- 部署multus multus版本选择
multus-cni-3.9.3,在使用multus-cni-4.0.2时,和kube-ovn-v1.11.5有兼容性问题。multus默认部署在
2. 部署macvtap macvtap版本是kube-system名称空间v0.11.0,默认部署在default名称空间,可以在应用manifests/macvtap.yaml前,修改名称空间为kube-system应用manifests/macvtap.yaml前,还需先应用examples/macvtap-deviceplugin-config-default.yamlconfigMap文件。 设备插件通过环境变量DP_MACVTAP_CONF配置。该值是一个json数组,数组中的每个元素都是一个单独的可用资源(可用的网卡设备),默认为空[],表示使用当前主机所有网卡设备。--- ## 示例1,使用所有网卡设备 kind: ConfigMap apiVersion: v1 metadata: name: macvtap-deviceplugin-config data: DP_MACVTAP_CONF: "[]" --- ## 示例2,使用指定的eth0网卡设备 kind: ConfigMap apiVersion: v1 metadata: name: macvtap-deviceplugin-config data: DP_MACVTAP_CONF: >- [ { "name" : "eth0", "lowerDevice" : "eth0", "mode": "bridge", "capacity" : 50 } ]DP_MACVTAP_CONF变量涉及到以下字段: - name (string, required) 资源名称 - lowerDevice (string, required) macvtap lower link名称 - mode (string, optional, default=bridge) macvtap运行模式,默认为bridge- capacity (uint, optional, default=100) macvtap设备容量,默认为1003. 查看部署是否生效 通过## 部署 macvtap # kubectl apply -f 1-macvtap-deviceplugin-config-default.yaml # kubectl apply -f 2-macvtap.yamlkubectl describe命令,查看Capacity字段有对应的macvtap.network.kubevirt.io/xx: 100即表示部署生效。4. 创建NAD(NetworkAttachmentDefinition),官方建议macvtap CNI最好通过定义NetworkAttachmentDefinition与Multus一起使用:# kubectl describe node k8s-01 ... Capacity: macvtap.network.kubevirt.io/eno1: 100 macvtap.network.kubevirt.io/eno2: 100 macvtap.network.kubevirt.io/eno3: 100 macvtap.network.kubevirt.io/eno4: 100 macvtap.network.kubevirt.io/p4p1: 100 macvtap.network.kubevirt.io/p4p2: 100 ...- k8s.v1.cni.cncf.io/resourceName:可从kind: NetworkAttachmentDefinition apiVersion: k8s.cni.cncf.io/v1 metadata: name: p4p1 namespace: default annotations: k8s.v1.cni.cncf.io/resourceName: macvtap.network.kubevirt.io/p4p1 spec: config: | { "cniVersion": "0.3.1", "name": "p4p1", "type": "macvtap", "mtu": 1500, "promiscMode": true }kubectl describe node nodeName中查找到 - name (string,required): 网络的名称,在NetworkAttachmentDefinition中使用时是可选的,因为在这种情况下Multus提供了名称。 - type (string,required): macvtap - mac (string,optional): 分配给macvtap接口的MAC地址,可选。 - mtu (整数,optional): 要在macvtap接口中设置的mtu。 - deviceID (string, required): 现有macvtap主机接口的名称,它将被移动到正确的net命名空间并进行配置。当在NetworkAttachmentDefinition中使用时是可选的,因为Multus在这种情况下提供了deviceID。 - promiscMode (bool,optional): 启用,在虚拟机的pod veth端启用混杂模式,默认为false。
-
使用macvtap设备创建vm进行测试 - 上传镜像文件,执行
upload.sh脚本,执行脚本前,需要修改uploadproxy的IP,这个ip可通过命令kubectl get svc -n cdi查看 - macvtap默认不能为创建的vm自动分配ip,需要手工指定 -
使用kube-ovn为vm分配ip - 创建子网
- 修改nadapiVersion: kubeovn.io/v1 kind: Subnet metadata: name: eth0 spec: protocol: IPv4 provider: eth0.default cidrBlock: 192.168.59.0/24 excludeIps: - 192.168.59.1..192.168.59.30 - 192.168.59.230..192.168.59.255kind: NetworkAttachmentDefinition apiVersion: k8s.cni.cncf.io/v1 metadata: name: eth0 annotations: k8s.v1.cni.cncf.io/resourceName: macvtap.network.kubevirt.io/eth0 spec: config: | { "cniVersion": "0.3.1", "name": "eth0", "type": "macvtap", "mtu": 1500, "mode": "bridge", "promiscMode": true, "ipam": { "type": "kube-ovn", "server_socket": "/run/openvswitch/kube-ovn-daemon.sock", "provider": "eth0.default" } }