配置多网卡虚拟机

结合 Kube-OVN 和 Multus,为虚拟机提供多网卡支持

前提条件

  • Alauda Container Platform 版本必须为 v4.1.0 或更高。
  • 使用 Kube-OVN 作为 CNI。
  • 已安装 Alauda Container Platform Networking for Multus。

操作步骤

创建二级网络

  1. 创建 NetworkAttachmentDefinition

    在集群控制节点执行以下命令:

    Command
    Example
    cat << EOF | kubectl create -f -
    apiVersion: 'k8s.cni.cncf.io/v1'
    kind: NetworkAttachmentDefinition
    metadata:
      name: <name>
      namespace: <namespace>
    spec:
      config: '{
        "cniVersion": "0.3.0",
        "type": "kube-ovn",
        "server_socket": "/run/openvswitch/kube-ovn-daemon.sock",
        "provider": "<provider>"
        }'
    EOF

    参数说明:

    • name:NetworkAttachmentDefinition 的名称。
    • namespace:NetworkAttachmentDefinition 所在的命名空间,必须与虚拟机使用相同的命名空间。
    • provider:当前 NetworkAttachmentDefinition 的 <name>.<namespace>.ovn,Kube-OVN 会根据此信息查找对应的 Subnet 资源。注意后缀必须设置为 ovn。
  2. 创建 Kube-OVN 子网

    如果将 Kube-OVN 用作二级网卡,provider 应设置为对应 NetworkAttachmentDefinition 的 <name>.<namespace>.ovn,且必须以 ovn 结尾。

    在集群控制节点执行以下命令:

    Command
    Example
    cat << EOF | kubectl create -f -
    apiVersion: kubeovn.io/v1
    kind: Subnet
    metadata:
      name: <name>
    spec:
      protocol: IPv4
      enableDHCP: true
      provider: <provider>
      cidrBlock: <cidrBlock>
      gateway: <gateway>
      excludeIps:
      - <excludeIps>
    EOF

    参数说明:

    • name:子网名称。
    • provider:NetworkAttachmentDefinition 的 provider。
    • cidrBlock:子网 CIDR。
    • gateway:网关地址。
    • excludeIps:保留的 IP 集合,不会被自动分配。例如,可用作计算组件的固定 IP 地址。

创建多网卡虚拟机

  1. 通过 UI 创建虚拟机

  2. 切换到 YAML 视图,为虚拟机添加另一张网卡

    spec.template.spec.domain.devices.interfaces 下添加新接口

    spec.template.spec.networks 下添加新网络

    spec:
      template:
        spec:
          domain:
            devices:
              interfaces:
              - bridge: {}
                name: default
              # 新接口
              - bridge: {}
                name: dyniface1
          networks:
          - name: default
            pod: {}
          # 新网络
          - multus:
              networkName: <networkName>
            name: dyniface1

    其中 networkName 是 NetworkAttachmentDefinition 的名称。

配置新网卡的网络

虚拟机启动后,需要进入虚拟机手动配置新添加的网卡网络。

热插拔网络接口

支持在运行中的虚拟机中热插拔网络接口。

热插拔支持使用 virtio 模型且通过桥接绑定或 SR-IOV 绑定连接的接口。

热拔插仅支持通过桥接绑定连接的接口。

  1. 向运行中的虚拟机添加接口

    使用 kubectl edit 修改虚拟机的 YAML 配置

     spec:
       template:
         spec:
           domain:
             devices:
               interfaces:
               - bridge: {}
                 name: default
               # 新接口
               - bridge: {}
                 name: dyniface1
           networks:
           - name: default
             pod: {}
           # 新网络
           - multus:
               networkName: <networkName>
             name: dyniface1   
  2. 从运行中的虚拟机移除接口

    使用 kubectl edit 修改虚拟机的 YAML 配置

    spec:
      template:
        spec:
          domain:
            devices:
              interfaces:
              - bridge: {}
                name: default
              # 将接口状态设置为 absent
              - bridge: {}
                name: dyniface1
                state: absent
          networks:
          - name: default
            pod: {}
          # 新网络
          - multus:
              networkName: <networkName>
            name: dyniface1