一、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:
可以连通