KubeVirt使用Kube-OVN

一、kube-ovn简介及安装

Kube-OVN是一款由灵雀云自主研发的开源企业级云原生Kubernetes容器网络编排系统,它通过将OpenStack领域成熟的网络功能平移到Kubernetes,极大增强了Kubernetes容器网络的安全性、可运维性、管理性和性能,为Kubernetes生态的落地带来了独特的价值。

官方文档:https://kubeovn.github.io/docs/v1.10.x/

本文主要讲解Underlay网络的配置,具体Kube-OVN安装可参见上面的官方文档,使用一键部署脚本安装即可

二、KubeVirt虚拟机使用物理机网段

我们期望创建的虚拟机可以向物理机一样在任意可以访问到物理机网络的地方也可以连接到虚拟机。

如您不进行任何网络设置,则默认创建的虚拟机IP是个POD相同网段的,我们知道POD的IP只能在集群内进行访问,其他网络环境则无法连通。

那么创建的虚拟机要想被外部访问最简单的方案就是:

在集群内做虚拟机的端口映射,KubeVirt创建的虚拟机会运行一个pod,pod网络可以连通虚拟机,我们仅需做该pod的svc映射为nodeport即可通过外部网络惊醒连接,但此方案有的局限性可想而知,所有虚拟机共用集群svc资源。如映射为nodeport端口数量有限

创建kube-ovn的Underlay网络模式

在 Underlay 模式下, OVS 将会桥接一个节点网卡到 OVS 网桥,并将数据包直接通过该节点网卡对外发送,L2/L3 层面的转发能力需要依赖底层网络设备。 需要预先在底层网络设备配置对应的网关、Vlan 和安全策略等配置。

  • 对于 OpenStack 的 VM 环境,需要将对应网络端口的 PortSecurity 关闭。
  • 对于 VMware 的 vSwitch 网络,需要将 MAC Address Changes, Forged Transmits 和 Promiscuous Mode Operation 设置为 allow。
  • 公有云,例如 AWS、GCE、阿里云等由于不支持用户自定义 Mac 无法支持 Underlay 模式网络。
  • 桥接网卡不能为 Linux Bridge

kube-ovn的强大之处就在于可以创建虚拟网络以及使用Underlay网络等。那上述需求使用vlan即让pod或虚拟机使用物理机的网络

参考文章:https://kubeovn.github.io/docs/v1.10.x/start/underlay/#providernetwork

创建ProviderNetwork

# 创建一个名为office的vlan
apiVersion: kubeovn.io/v1
kind: ProviderNetwork
metadata:
  name: office
spec:
  defaultInterface: eth0  # 这里填写物理机IP对应网卡
  customInterfaces:       # 可选项,可针对特定节点指定需要使用的网卡
    - interface: eth2
      nodes:
        - node1
  excludeNodes:           # 可选项,用于指定不桥接网卡的节点。该列表中的节点会被添加 net1.provider-network.ovn.kubernetes.io/exclude=true 标签
    - node2

创建VLAN

apiVersion: kubeovn.io/v1
kind: Vlan
metadata:
  name: defaultvlan  # vlan名称
spec:
  id: 0    # 设置为宿主机上承担容器流量的网卡,例如 eth1
  provider: office # 与上面的ProviderNetwork名称对应

创建Subnet子网

apiVersion: kubeovn.io/v1
kind: Subnet
metadata:
  name: mail263
spec:
  protocol: IPv4 
  cidrBlock: 192.168.10.1/24  # cidrBlock: 子网 CIDR 范围,这里填写物理机网段的CIDR即可 
  gateway: 192.168.10.2  # 底层物理网关地址
  vlan: defaultvlan   # 上面创建的vlan名称
  excludeIps:         # 分配的IP不包含的IP地址
  - 192.168.10.1..192.168.10.179
  namespaces:    # 绑定该子网的 Namespace 列表,绑定后 Namespace 下的 Pod 将会从当前子网分配地址。
  - vlan
  • vlan: 如果使用 Underlay 网络,该字段用来控制该 Subnet 和哪个 Vlan CR 进行绑定。该选项默认为空字符串,即不使用 Underlay 网络。
  • logicalGateway: 一些 Underlay 环境为纯二层网络,不存在物理的三层网关。在这种情况下可以借助 OVN 本身的能力设置一个虚拟网关,将 Underlay 和 Overlay 网络打通。默认值为:false。

三、验证Underlay网络

检查物理机网络

[root@192 home]# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         gateway         0.0.0.0         UG    100    0        0 br-office
10.20.0.0       100.64.0.1      255.255.0.0     UG    0      0        0 ovn0
100.64.0.0      0.0.0.0         255.255.0.0     U     0      0        0 ovn0
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
192.168.10.0    0.0.0.0         255.255.255.0   U     100    0        0 br-office

可以看到路由的网卡从eth0变成的br-office

[root@192 home]# ifconfig
...
br-office: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.10.101  netmask 255.255.255.0  broadcast 192.168.10.255
        inet6 fe80::527b:9dff:fee0:8261  prefixlen 64  scopeid 0x20<link>
        inet6 2408:8207:7899:7f03:7662:4550:b50b:74dc  prefixlen 64  scopeid 0x0<global>
        ether 50:7b:9d:e0:82:61  txqueuelen 1000  (Ethernet)
        RX packets 1742961  bytes 574463863 (547.8 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 347959  bytes 45816822 (43.6 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::a361:2341:ce40:85d6  prefixlen 64  scopeid 0x20<link>
        ether 50:7b:9d:e0:82:61  txqueuelen 1000  (Ethernet)
        RX packets 10215831  bytes 6373837330 (5.9 GiB)
        RX errors 2  dropped 8  overruns 0  frame 1
        TX packets 1649725  bytes 202336035 (192.9 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 20  memory 0xf2200000-f2220000
...

真实物理机IP有eth0网卡绑定到br-office

创建虚拟机

### vm.yml
apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
  labels:
  name: centos
  namespace: vlan
spec:
  running: true
  template:
    spec:
      domain:
        devices:
          disks:
          - disk:
              bus: virtio
            name: cdromiso
          - disk:
              bus: virtio
            name: data
          - disk:
              bus: virtio
            name: cloudinitdisk
          interfaces:
          - bridge: {}
            name: default
        machine:
          type: q35
        resources:
          limits:
            cpu: "1"
            memory: 2Gi
          requests:
            cpu: "1"
            memory: 2Gi
      networks:
      - name: default
        pod: {}
      volumes:
      - name: cdromiso
        containerDisk:
          image: home.mrlch.cn:8888/kubevirt/centos:1805-1
      - name: data
        hostDisk:
          capacity: 50Gi
          path: /home/disk-container-test2.img
          type: DiskOrCreate
      - cloudInitNoCloud:
          networkData: |-
            network:
              version: 1
              config:
                - type: physical
                  name: eth0
                  subnets:
                    - type: dhcp
          userData: |-
            #cloud-config
            disable_root: false
            ssh_pwauth: true
            users:
              - default
              - name: root
                lock_passwd: false
                hashed_passwd: $1$4t.w.u.X$BkdPjEOi30r85GpIaTZ8C1
        name: cloudinitdisk
[root@192 vlan]# kubectl apply -f vm.yml
[root@192 vlan]# kubectl get po -n vlan -o wide
NAME                          READY   STATUS    RESTARTS   AGE     IP               NODE             NOMINATED NODE   READINESS GATES
virt-launcher-centos-ppw7h    2/2     Running   0          3h24m   192.168.10.181   192.168.10.101   <none>           1/1

可以看到POD的IP与物理机IP处于同一网段

其他网络连接虚拟机

liuchen@liuchen ~ % ping 192.168.10.181 -c 1
PING 192.168.10.181 (192.168.10.181): 56 data bytes
64 bytes from 192.168.10.181: icmp_seq=0 ttl=63 time=57.562 ms

--- 192.168.10.181 ping statistics ---
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 57.562/57.562/57.562/0.000 ms
liuchen@liuchen ~ % ssh root@192.168.10.181
root@192.168.10.181's password:

可以连通

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注

Captcha Code