kube-ovn

Kube-OVN网络VM无法访问外网问题

现象 Kubernetes集群新添加了一批物理机,成功添加集群后发现新建的虚拟机在新节点上无法访问Internet和集群主机节点,能够Ping通相同子网的虚拟机,能够Ping通Underlay逻辑网关。 排查 a. 新建一个Pod,现象一样 b. 将Underlay子网IP直接配置在主机节点上,网络一切正常 c. 排除了虚拟机网络环境问题和主机节点外网络问题,问题锁定在Kube-OVN网络内部。 比对虚拟机IP和MAC地址都正确 // 路由器列表 sukai@r1-m34:~$ kubectl ko nbctl lr-list 77b2eff6-ce75-4ab4-8476-df34d347a531 (ovn-cluster) // 交换机列表 sukai@r1-m34:~$ kubectl ko nbctl ls-list 4585d35c-3a3d-4dc1-bdb2-9544bf15bbd7 (join) 63abfd74-3513-4edb-83a3-bde609fe3585 (ovn-default) 88910c8a-08b3-49f0-98a0-b21eb21620f2 (vmnet) // 查看我的虚拟机交换机端口 sukai@r1-m34:~$ kubectl ko nbctl lsp-list vmnet f731988d-7cff-44f6-9835-eb8ccdb32216 (localnet.vmnet) 4ff718cb-c3bf-40f4-9fce-a3c141f4639f (sukai-db01.nanjing) 0a02f7b7-caa3-421c-b700-0ea41fd12990 (vmnet-ovn-cluster) sukai@r1-m34:~$ // 查看我的虚拟机交换机端口信息 sukai@r1-m34:~$ kubectl ko nbctl show vmnet switch 88910c8a-08b3-49f0-98a0-b21eb21620f2 (vmnet) port vmnet-ovn-cluster type: router router-port: ovn-cluster-vmnet port sukai-db01.nanjing addresses: ["d2:b9:8d:e6:61:4b 192.168.10.133"] port localnet.

继续阅读

Kube-OVN网络MTU值不一致导致数据包丢失问题

问题现象 排查原因 解决方法 问题现象 KubeVirt虚拟机Linux工作正常,Windows系统远程桌面内网可以正常连接,公网映射以后无法连接,报事件20499错误。Windows系统应用无法正常使用网络,报连接超时。 远程桌面服务花赛了太长时间为用户 Administrator 加载服务器 \WIN-DNRLMIUJ4AH 中的用户配置 排查原因 当刚遇到远程桌面无法连接时,怀疑是Windows系统配置问题,但经过各种配置修改,无法解决。当发现系统应用无法正常使用网络时,认为这不是一个系统配置问题,应该排查虚拟机和物理主机网络。 查看物理主机内核日志信息,发现MTU过大导致丢包 [3726832.278168] net_ratelimit: 7 callbacks suppressed [3726832.278191] 200ca1e3bdc6_h: dropped over-mtu packet: 1500 > 1400 [3726839.766777] 200ca1e3bdc6_h: dropped over-mtu packet: 1500 > 1400 [3726989.204844] 200ca1e3bdc6_h: dropped over-mtu packet: 1472 > 1400 [3726989.467581] 200ca1e3bdc6_h: dropped over-mtu packet: 1472 > 1400 [3726997.614904] net_ratelimit: 11 callbacks suppressed [3726997.614928] 200ca1e3bdc6_h: dropped over-mtu packet: 1472 > 1400 查看物理主机和虚拟机网卡MTU,物理主机网卡MTU值为1500,br-vmnet网桥MTU值为1400。虚拟机网卡MTU为1400。 root@rack2-worker89:~$ ip a|grep -i mtu 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 4: ens4f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master ovs-system state UP group default qlen 1000 11: br-int: <BROADCAST,MULTICAST> mtu 1400 qdisc noop state DOWN group default qlen 1000 18: br-vmnet: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1400 qdisc noqueue state UNKNOWN group default qlen 1000 22: 843c5eba6dc2_h@if21: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1400 qdisc noqueue master ovs-system state UP group default qlen 查看Kube-OVN文档资料,使用Underlay网络时,Pod应该会使用与主机网卡MTU一致数值,也就是应该是1500才对。

继续阅读

Kube-OVN为KubeVirt虚拟机分配固定IP

KubeVirt虚拟机使用固定IP是生产中比较普遍的一个需求,今天我们一起看一下如何通过Kube-OVN为虚拟机提供固定IP。 配置kube-ovn-controller启动参数 Containers: kube-ovn-controller: Container ID: containerd://0f8d53403c9821c7b535c64d2c98e1ca130a15e1b2b878270cd9388c36d0e48a Image: kubeovn/kube-ovn:v1.11.0 Image ID: docker.io/kubeovn/kube-ovn@sha256:fea623e68a2a81ef78102c6cfe95b96c16c054c57f4c8b9d168bd3ff620b6779 Port: <none> Host Port: <none> Args: /kube-ovn/start-controller.sh --default-cidr=10.244.0.0/16 --default-gateway=10.244.0.1 --default-gateway-check=true --default-logical-gateway=false --default-exclude-ips= --node-switch-cidr=100.64.0.0/16 --service-cluster-ip-range=10.211.0.0/16 --network-type=geneve --default-interface-name= --default-vlan-id=100 --pod-nic-type=veth-pair --enable-lb=true --enable-np=true --enable-eip-snat=true --enable-external-vpc=true --keep-vm-ip=true 创建虚拟机 spec.template.spec.interfaces.macAddress指定虚拟机网卡MAC,每次删除重建这台虚拟机时使用同一个MAC地址,与系统的网卡配置文件/etc/netplan/50-cloud-init.yaml中MAC地址一致,不需要重新进行配置。 spec.template.metadata.annotations中添加两条记录,ovn.kubernetes.io/ip_address指定kube-ovn使用IP,ovn.kubernetes.io/mac_address告诉kube-ovn网卡的MAC地址。 --- apiVersion: kubevirt.io/v1alpha3 kind: VirtualMachine metadata: labels: kubevirt.io/vm: ubuntu-c name: ubuntu-c namespace: mail263 spec: running: true template: metadata: labels: kubevirt.io/vm: ubuntu-c annotations: ovn.kubernetes.io/ip_address: 172.16.3.203 ovn.kubernetes.io/mac_address: 00:00:00:1F:C5:8F spec: domain: cpu: cores: 4 model: host-passthrough memory: guest: 1Gi devices: disks: - name: bootdisk disk: bus: virtio - disk: bus: virtio name: cloudinitdisk interfaces: - name: default bridge: {} macAddress: 00:00:00:1f:c5:8f resources: overcommitGuestOverhead: true networks: - name: default pod: {} terminationGracePeriodSeconds: 0 volumes: - name: bootdisk dataVolume: name: ubuntuboot-c - name: cloudinitdisk cloudInitNoCloud: userData: |- #cloud-config ssh_pwauth: True chpasswd: list: | ubuntu:ubuntu expire: False 固定MAC

继续阅读

KubeVirt通过Kube-OVN使用Underlay网络

之前文章介绍了如何通过Kube-OVN实现Kubernetes网络租户隔离,今天我们一起看一下KubeVirt通过Kube-OVN使用Underlay网络,使虚拟机接入物理网络。 实践操作 检查Kubernetes使用的Pod网络地址段和Service网络地址段。 sukai@ubuntuserver:/etc/kubernetes/manifests$ sudo grep cidr kube-controller-manager.yaml - --allocate-node-cidrs=true - --cluster-cidr=10.244.0.0/16 sukai@ubuntuserver:/etc/kubernetes/manifests$ sudo grep range kube-controller-manager.yaml - --service-cluster-ip-range=10.211.0.0/16 检查kube-ovn-controller配置项是否正确 kube-ovn在版本v1.11.0开始支持keep-vm-ip参数,虚拟机使用固定IP地址。 Containers: kube-ovn-controller: Container ID: containerd://0f8d53403c9821c7b535c64d2c98e1ca130a15e1b2b878270cd9388c36d0e48a Image: kubeovn/kube-ovn:v1.11.0 Image ID: docker.io/kubeovn/kube-ovn@sha256:fea623e68a2a81ef78102c6cfe95b96c16c054c57f4c8b9d168bd3ff620b6779 Port: <none> Host Port: <none> Args: /kube-ovn/start-controller.sh --default-cidr=10.244.0.0/16 --default-gateway=10.244.0.1 --default-gateway-check=true --default-logical-gateway=false --default-exclude-ips= --node-switch-cidr=100.64.0.0/16 --service-cluster-ip-range=10.211.0.0/16 --network-type=geneve --default-interface-name= --default-vlan-id=100 --pod-nic-type=veth-pair --enable-lb=true --enable-np=true --enable-eip-snat=true --enable-external-vpc=true --keep-vm-ip=true 创建服务网络 指定物理服务器上访问物理网络的网卡。 apiVersion: kubeovn.io/v1 kind: ProviderNetwork metadata: name: office spec: defaultInterface: eno1 创建VLAN 创建在指定服务网络上创建一个VLAN,这里VLAN ID为0表示不属于任何VLAN。 apiVersion: kubeovn.

继续阅读

kube-ovn实现Kubernetes多租户网络管理

Kubernetes容器平台正在成为越来越多的数据中心基础平台,我们希望Kubernetes能够满足虚拟化平台的一些基本要求,比如实现了多租户的灵活的软件定义网络SDN。工作中一个项目在使用Kubernetes平台,所以考虑通过KubeVirt来管理虚拟机,同时使用kube-ovn来实现多租户网络隔离。下面我们一起来看看如何使用kube-ovn来管理网络。 基本概念 Underlay/Overlay网络 Underlay网络是指传统IT基础设施网络,是由交换机、路由器、负载均衡等设备组成的底层物理网络。Overlay网络是通过网络虚拟化技术,在Underlay网络上构建出的虚拟的逻辑网络。 OVS/OVN Open vSwitch(OVS)是一个多层软件交换机,OVS只里一个单机软件,没有集群的信息。Open Virtual Nework(OVN)提供了一个集中式的OVS控制器,从集群的角度对整个网络设施进行编排。 使用Kubernetes后会发现,Kubernetes网络功能缺少软件定义网络SDN能力,缺少VPC, Subnet, Nat, Route, SecurityGroup等常用功能。Kube-OVN基于OVN为Kubernetes网络提供了网络编排能力。 CNI 容器网络接口(Container Network Interface),由CoreOS提出的一种容器网络规范,主要内容是容器创建时的网络分配,和容器被删除时释放网络资源。CNI让网络层变得可插拔,只要遵循CNI的协议规范,容器管理平台就可以调用CNI插件可执行文件提供网络功能。Kubernetes网络模型采用了CNI容器网络接口规范。 macvlan macvlan是一种Linux内核的网络虚拟化技术,从一个主机接口虚拟出多个虚拟网络接口。macvlan可以在物理网卡构成的父接口上添加子接口,每个子接口都拥有独立的MAC地址和IP地址。容器可以通过绑定子接口,拥有与物理网络通信的能力。这解决了容器接入物理网络需求,比如我们需要通过docker运行gitlab服务,gitlab服务需要用到80,443,22端口,这些常用端口经常会产生冲突,那么我们可以通过docker命令创建一个macvlan驱动类型的网络来拥有独立MAC和IP地址。Kubernetes内置CNI插件包含了macvlan,配置使用macvlan CNI,可以让Kubernetes的Pod使用Underlay网络 。 Kube-OVN Kube-OVN插件将Kubernetes容器网络接入ovs网络。提供了vpc, router, switch, subnet管理能力。 Multus Multus CNI插件提供了Kubernetes Pod添加多块网卡的能力。容器同时接入多个不同的网络,解决了类似Ceph这种区分多个网络应用场景。 IPAM IP地址管理(IP Address Management),分配和维护IP地址,DNS,网关,路由等信息。CNI插件在执行过程中调用相应的IPAM插件,IPAM插件将IP相关信息返回到主CNI插件。IPAM插件减少了CNI插件重复编写相同代码管理IP的工作,而且解决了多个CNI插件统一集中IP管理的需求。 场景需求 1,通过VPC实现网络租户隔离 2,通过NAT网关SNAT访问外网 3,通过NAT网关DNAT暴露端口给外网访问 安装部署 安装Kube-OVN curl -O https://raw.githubusercontent.com/kubeovn/kube-ovn/release-1.10/yamls/crd.yaml curl -O https://raw.githubusercontent.com/kubeovn/kube-ovn/release-1.10/yamls/ovn.yaml curl -O https://raw.githubusercontent.com/kubeovn/kube-ovn/release-1.10/yamls/kube-ovn.yaml curl -O https://raw.githubusercontent.com/kubeovn/kube-ovn/master/charts/templates/kubeovn-crd.yaml sed -i 's/\$addresses/<Node IP>/g' ovn.yaml kubectl label node ubuntuserver1 kube-ovn/role=master kubectl apply -f crd.yaml kubectl apply -f kubeovn-crd.

继续阅读