跳转至

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,那么任何可实时迁移的工作负载都将保证被实时迁移。只有不可实时迁移的工作负载才会被驱逐。

apiVersion: kubevirt.io/v1
kind: KubeVirt
metadata:
  name: kubevirt
  namespace: kubevirt
spec:
  imagePullPolicy: IfNotPresent
  workloadUpdateStrategy:
    workloadUpdateMethods:
      - LiveMigrate
      - Evict
    batchEvictionSize: 10
    batchEvictionInterval: "1m"

删除 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因为一个错误需要手动删除。

$ kubectl -n kubevirt patch kv kubevirt --type=json -p '[{ "op": "remove", "path": "/metadata/finalizers" }]'