99.kubevirt 升级 删除
更新 kubevirt Control Plane¶
从v0.17.0开始,kubevirt 开始支持零停机滚动更新 kubevirt 控制平面 更新仅支持从N-1到N个版本更新,即不能跨多个版本更新 更新操作仅需要下载N版本的kubevirt-operator.yaml并重新apply即可。
更新 kubevirt workloads¶
从v0.39.0开始支持 kubevirt工作负载更新 默认情况下,当KubeVirt更新时,这只涉及到控制平面组件,在更新发生之前运行的任何现有VirtualMachineInstance (VMI)工作负载都保持100%不受影响。 工作负载继续运行,不会作为默认更新过程的一部分而中断。一定要注意, 这些VMI工作负载确实涉及到libvirt、qemu和virt启动器等组件,这些组件也可以在KubeVirt更新过程中进行更新。然而,这需要选择让virt-operator在工作负载上执行自动化操作。 选择加入VMI更新涉及到配置KubeVirt CR上的
workloadUpdateStrategy字段,该字段控制了virt-operator在更新VMI工作负载pod时将使用的方法。workloadUpdateStrategy支持LiveMigrate和Evict LiveMigrate:通过将虚拟机客户端实时迁移到一个启用了所有更新组件的pod中,从而更新vmi。 Evict:将导致VMI的pod被关闭。如果VMI是由一个具有runStrategy: always的VirtualMachine对象控制的,那么一个新的VMI将在一个具有更新组件的pod中运行起来。 更新VMI工作负载破坏性最小的方法是使用LiveMigrate。任何不能实时迁移的VMI工作负载都将保持不变。 如果集群中没有启用热迁移,那么对于virt-operator管理的VMI更新,惟一可用的选项是Evict方法。 通过启用livemigation 来更新VMI工作负载apiVersion: kubevirt.io/v1 kind: Kubevirt metadata: name: kubevirt namespace: kubvirt spec: imagePullPolicy: IfNotPresent workloadUpdateStrategy: workloadUpdateMethods: - LiveMigrate通过Evict来更新VMI工作负载 批处理调优允许配置清除VMI的速度。在大型集群中,最好确保批量删除VMI,以便分配负载。
apiVersion: kubevirt.io/v1 kind: Kubevirt metadata: name: kubevirt namespace: kubevirt spec: imagePullPolicy: IfNotPresent workloadUpdateStrategy: workloadUpdateMethods: - Evict batchEvictionSize: 10 batchEvictionInterval: "1m"同时启用LiveMigrate和Evict的VMI工作负载更新 如果同时指定了LiveMigrate和Evict,那么任何可实时迁移的工作负载都将保证被实时迁移。只有不可实时迁移的工作负载才会被驱逐。
删除 kubevirt¶
要删除 KubeVirt,首先要删除KubeVirt自定义资源,然后删除 kubevirt-operator, 参考:https://kubevirt.io/user-guide/operations/updating_and_deletion/
$ export RELEASE=v0.56.0 $ kubectl delete -n kubevirt kubevirt kubevirt --wait=true # --wait=true should anyway be default $ kubectl delete apiservices v1alpha3.subresources.kubevirt.io # this needs to be deleted to avoid stuck terminating namespaces $ kubectl delete mutatingwebhookconfigurations virt-api-mutator # not blocking but would be left over $ kubectl delete validatingwebhookconfigurations virt-operator-validator # not blocking but would be left over $ kubectl delete validatingwebhookconfigurations virt-api-validator # not blocking but would be left over $ kubectl delete -f https://github.com/kubevirt/kubevirt/releases/download/${RELEASE}/kubevirt-operator.yaml --wait=false注意:如果不小心先删除了operator,KV自定义资源会卡在这个Terminating状态,要解决这个问题,手动从资源中删除finalizer。 注意:apiservice和webhookconfigurations因为一个错误需要手动删除。