跳转至

节点维护

节点维护(Node maintenance)

在从k8s集群中移除node节点之前,用户需要确保在该node节点上的所有vm均已经被迁移到其他node节点或者已被优雅终止。 由于所有vm实例(vmi)都是由Pod支持,因此建议采用kubectl drain驱逐命令来腾空要维护的节点,使用kubectl drain命令后,节点上会打上不可调度unschedulable的标签。 以下命令将优雅地终止指定节点上的所有vm。将' '替换为需要维护的节点的名称。

kubectl drain node02 --delete-local-data --ignore-daemonsets=true --force --pod-selector=kubevirt.io=virt-launcher
- kubectl drain node02 表示选择node02作为目标驱逐对象; - --delete-local-data 表示即使某些Pod使用了emptyDir类型的本地存储,也允许删除这些Pod,因为它们的数据在节点重启或删除时将会丢失。这意味着kubelet在驱逐Pod时不会考虑其是否包含无法迁移的本地数据。 - --ignore-daemonsets=true 表示在执行驱逐操作时忽略由DaemonSet控制器创建的Pod。通常DaemonSet保证在每个节点上恰好运行一个pod,因此在计划维护时并不需要移动这些Pod。 - --force 表示强制执行驱逐,即使有些Pod由于各种原因不能被正常驱逐,比如vm因某种原因一直无法终止。 - --pod-selector=kubevirt.io=virt-launcher 表示仅选中包含标签kubevirt.io=virt-launcher的Pod来进行驱逐。 当然也可以使用以下命令,驱逐节点上所有pod
kubectl drain node02 --delete-local-data --ignore-daemonsets=true --force
- 通过实时迁移来完成vmi驱逐 如果启用了热迁移特性(LiveMigration),那么可以在vm上添加一个驱逐策略,它将对节点上特定污点的实时迁移做出反应,即当执行驱逐时,被驱逐的vm并不会关闭,而是迁移到其他节点上。
apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
  name: vm01
  namespace: default
spec:
  runStrategy: Always
  template:
    metadata:
      annotations:
        ovn.kubernetes.io/ip_address: 192.168.59.11
        ovn.kubernetes.io/logical_switch: provider
      labels:
        kubevirt.io/domain: vm01
        kubevirt.io/size: small
    spec:
      # 添加驱逐策略
      evictionStrategy: LiveMigrate
      ...
那kubevirt是如何做到的呢,在后台,kubevirt为每个定义了驱逐策略的VMI创建了一个PodDisruptionBudget 这可确保在这些 VMI 上阻止驱逐,并且可以保证迁移 VMI 而不是关闭实例。 - 重新启用节点 kubectl drain 会将目标节点标记为不可调度。这意味着该节点将没有资格运行新的VM或Pod。如果要让目标节点再次变为可调度节点,则必须运行以下命令。
kubectl uncordon node02
- 关闭节点 从 KubeVirt 的角度来看,一旦所有 VirtualMachineInstances 都从节点中逐出,节点就可以安全地关闭。 在多用途集群中,VirtualMachineInstances 与其他容器化工作负载一起被调度,集群管理员需要确保在关闭节点电源之前已安全逐出所有其他 Pod。

  • VM驱逐 当VirtualMachine设置 spec.running: true时,在节点遭到驱逐时,系统会自动将该VMI重新调度到集群中的另一个可用节点上。 目前情况下,在节点被驱逐时,这会导致 VirtualMachineInstance 强制关机并在新的节点上重启。这意味着服务可能会有短暂的中断,因为虚拟机无法在迁移过程中保持运行状态。 未来将支持热迁移。
  • VirtualMachineInstanceReplicaSet 驱逐行为 当一个由VirtualMachineInstanceReplicaSet管理的VirtualMachineInstance由于节点被驱逐而需要离开当前节点时,会发生以下情况: 被驱逐的VirtualMachineInstance会从当前节点移除。VirtualMachineInstanceReplicaSet会自动检测到其管理下的VirtualMachineInstance数量的变化,并基于设定的副本数量(replicas)进行调整。 为了满足设定的副本数量要求,VirtualMachineInstanceReplicaSet会在集群中的其他可用节点上调度创建新的VirtualMachineInstances作为被驱逐实例的替代。 简而言之,当VirtualMachineInstance因节点驱逐而被移除时,VirtualMachineInstanceReplicaSet会确保通过在其他节点上创建新的实例来维持所设定的副本总数,从而保证服务的整体可用性和扩展性。
  • VirtualMachineInstance 驱逐行为 当一个不隶属于任何VirtualMachineInstanceReplicaSet或VirtualMachine对象的独立VirtualMachineInstance由于节点被驱逐而被移除时:

这个VirtualMachineInstance在节点被驱逐后将不会自动重新调度到集群中的其他可用节点上继续运行。 一旦该VMI从节点上被驱逐并停止运行,除非手动干预进行迁移或者重新创建,否则它将保持停止状态,不会自动恢复服务。 简而言之,对于没有被复制控制器(如VirtualMachineInstanceReplicaSet)或父资源(如VirtualMachine)管理的独立VirtualMachineInstances,在遇到节点驱逐情况时,其服务不会自动得到恢复和迁移。