KubeVirt

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才对。

继续阅读

KubeVirt虚拟机快照和恢复Ceph RBD实现

安装Ceph RBD snapshot-controller和csi-driver 安装RBD Snapshot存储类 创建KubeVirt虚拟机快照 从快照恢复虚拟机 安装Ceph RBD snapshot-controller和csi-driver root123@rack1-master34:~$ scp 10.10.102.26:/home/root123/v8.1.0.tar.gz . v8.1.0.tar.gz 100% 7774KB 137.8MB/s 00:00 root123@rack1-master34:~$ scp 10.10.102.26:/home/root123/kustomize . kustomize 100% 14MB 143.7MB/s 00:00 root123@rack1-master34:~$ sudo cp kustomize /usr/local/bin/ root123@rack1-master34:~$ ls /usr/local/bin/ containerd containerd-shim-runc-v1 containerd-stress ctr etcdctl etcd-scripts helm kubeadm kubectl-ko kubernetes-scripts nerdctl runc containerd-shim containerd-shim-runc-v2 crictl etcd etcdctl.sh etcdutl k8s-certs-renew.sh kubectl kubelet kustomize netaddr virtctl root123@rack1-master34:~/external-snapshotter-8.1.0$ kubectl kustomize client/config/crd | kubectl create -f - customresourcedefinition.apiextensions.k8s.io/volumegroupsnapshotclasses.groupsnapshot.storage.k8s.io created customresourcedefinition.

继续阅读

KubeVirt虚拟机导出磁盘镜像

开启KubeVirt特性门控 创建磁盘镜像导出服务 下载磁盘镜像 开启KubeVirt特性门控VMExport root@rack1-master34:~$ kubectl -n kubevirt edit kubevirt # Please edit the object below. Lines beginning with a '#' will be ignored, # and an empty file will abort the edit. If an error occurs while saving this file will be # reopened with the relevant failures. # apiVersion: kubevirt.io/v1 kind: KubeVirt metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"kubevirt.io/v1","kind":"KubeVirt","metadata":{"annotations":{},"name":"kubevirt","namespace":"kubevirt"},"spec":{"certificateRotateStrategy":{},"configuration":{"developerConfiguration":{"featureGates":[]}},"customizeComponents":{},"imagePullPolicy":"IfNotPresent","workloadUpdateStrategy":{}}} kubevirt.io/latest-observed-api-version: v1 kubevirt.io/storage-observed-api-version: v1 creationTimestamp: "2024-09-19T07:11:27Z" finalizers: - foregroundDeleteKubeVirt generation: 3 name: kubevirt namespace: kubevirt resourceVersion: "31602825" uid: 86857887-d8c3-4c17-81de-c43a45457d5a spec: certificateRotateStrategy: {} configuration: developerConfiguration: featureGates: - DataVolumes - LiveMigration - VMExport customizeComponents: {} imagePullPolicy: IfNotPresent workloadUpdateStrategy: {} 创建磁盘镜像导出服务,挂载rbd块设备到virt-export-bj-test01-os-export Pod。

继续阅读

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虚拟机资源超卖

使用过虚拟化平台的同学都知道,虚拟化平台可以通过KVM内存ballooning技术动态调整虚拟机的内存配置,实现运行所有VM总内存可以大于物理主机实际内存。当我们在Kubernetes平台通过KubeVirt管理虚拟机时,如何实现资源超卖呢? 基本概念 KubeVirt资源管理 Kubernetes通过Pod的Resource requests来申请占用资源,根据资源请求量Kubernetes计算主机节点资源进行Pod的调度。默认情况下KubeVirt根据虚拟机VM的资源请求从主机申请资源创建虚拟机virt-launcher Pod,Pod调度后调用libvirt创建对应虚拟机,通过这种方式达到了Kubernetes对虚拟机资源的管理和调度。 通过上面介绍,我们知道KubeVirt可以分开配置Pod的资源request与libvirt虚拟机资源,比如通过设置一个比例来达到虚拟机资源超卖。举例说明,如果我们设置内存超卖比例为150%,创建一个虚拟机内存为3072M,那么Pod请求内存资源则为2048M。假设主机内存为100G,不考虑其他组件资源开销,根据Pod请求则可以创建出内存总量为150G的虚拟机。 但由于KubeVirt目前还不支持Memory Ballooning技术,KubeVirt并没有像KVM调用libvirt获取当前内存使用量,动态调整libvirt中虚拟机分配内存。所以KubeVirt中的虚拟机内存占用了的内存无法减少来释放资源。 CPU时间 Kubernetes将CPU一个核切分为1000时间片,使用m作为单位,1m表示千分之一核milliCPU。 操作实践 KubeVirt配置资源分配比例 cpuAllocationRatio指定CPU分配比例2000%,比如虚拟机CPU核数为12核,Pod virt-launcher的CPU资源请求则为600m。memoryOvercommit指定内存分配比例为150%。 kubectl -n kubevirt edit kubevirt ... spec: configuration: developerConfiguration: cpuAllocationRatio: 20 featureGates: - HardDisk - DataVolumes memoryOvercommit: 150 ... 创建KubeVirt虚拟机 可以看到spec.template.domain下的spec.template.domain.cpu和spec.template.domain.memory指定了创建虚拟机资源。 spec.template.domain.resources.overcommitGuestOverhead配置不请求额外资源开销,管理虚拟机的基础设施组件需要的内存资源。默认为false,当创建一个虚拟机内存为1Gi时,virt-launcher Pod请求的内存资源为1Gi + 200Mi。 spec.template.domain.resources.requests这里仍然指定了requests,virt-launcher Pod将使用这个requests来请求k8s资源,这样就会不使用上面配置的比例。一般情况不需要再这里指定requests,KubeVirt使用比例计算出requests的资源量。 --- apiVersion: kubevirt.io/v1alpha3 kind: VirtualMachine metadata: labels: kubevirt.io/vm: mailserver 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: 12 model: host-passthrough memory: guest: 96Gi 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 requests: memory: 16Gi 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 查看KubeVirt的ubuntu-c虚拟机VMI资源定义

继续阅读