跳转至

在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

  1. 部署multus multus版本选择multus-cni-3.9.3,在使用multus-cni-4.0.2时,和kube-ovn-v1.11.5有兼容性问题。

multus默认部署在kube-system名称空间

## 部署 multus
# kubectl apply -f 0-multus-daemonset-thick-plugin.yml
2. 部署macvtap macvtap版本是v0.11.0,默认部署在default名称空间,可以在应用manifests/macvtap.yaml前,修改名称空间为kube-system 应用manifests/macvtap.yaml前,还需先应用examples/macvtap-deviceplugin-config-default.yaml configMap文件。 设备插件通过环境变量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设备容量,默认为100

## 部署 macvtap
# kubectl apply -f 1-macvtap-deviceplugin-config-default.yaml
# kubectl apply -f 2-macvtap.yaml
3. 查看部署是否生效 通过 kubectl describe命令,查看Capacity字段有对应的macvtap.network.kubevirt.io/xx: 100即表示部署生效。
# 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

...
4. 创建NAD(NetworkAttachmentDefinition),官方建议macvtap CNI最好通过定义NetworkAttachmentDefinition与Multus一起使用:
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
     }
- k8s.v1.cni.cncf.io/resourceName:可从 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

# kubectl apply -f 3-nad.yaml
  1. 使用macvtap设备创建vm进行测试 - 上传镜像文件,执行 upload.sh脚本,执行脚本前,需要修改uploadproxy的IP,这个ip可通过命令 kubectl get svc -n cdi 查看 - macvtap默认不能为创建的vm自动分配ip,需要手工指定

  2. 使用kube-ovn为vm分配ip - 创建子网

    apiVersion: 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.255
    
    - 修改nad
    kind: 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"
          }
         }