调度使用 VM Runtime on GDC 的虚拟机

本文档适用于运行 Google Distributed Cloud 的应用所有者和平台管理员。本文档介绍如何为使用 VM Runtime on GDC 的虚拟机使用调度配置,例如亲和性和反亲和性。

准备工作

要完成本文档,您需要拥有以下资源的访问权限:

调度配置概览

调度配置是 VM Runtime on GDC 中的可选值。如果未指定调度配置,则虚拟机默认采用 Kubernetes 默认调度行为。

通过默认调度行为,虚拟机将分布在整个集群中。调度器会查看当前节点资源的可用性(例如 CPU 和内存),并在节点上安排虚拟机以分布计算需求。如果没有具体要求,则无需定义任何调度配置。

以下三个字段可用于调度虚拟机:

  • nodeSelector:指定虚拟机的主机节点必须具有的节点标签。VM Runtime on GDC 仅在具有指定标签的节点上调度虚拟机。
  • 亲和性:指定虚拟机的亲和性规则。它包括节点亲和性和虚拟机间亲和性或反亲和性。您可以为调度器定义软性要求或硬性要求:
    • preferredDuringSchedulingIgnoredDuringExecution 为软性要求。调度器会尝试满足您的请求。如果调度器无法满足请求,则虚拟机可能会被安排到非首选节点上。
    • requiredDuringSchedulingIgnoredDuringExecution 为硬性要求。调度器会尝试满足您的请求。如果没有可用节点匹配您的要求,则不会安排虚拟机。
  • Tolerations:允许将虚拟机安排到具有匹配污点的节点上。

您可以定义其中的任何调度配置,以支持您的计算工作负载和调度需求。除了调度配置之外,虚拟机调度还取决于可用资源。

VM Runtime on GDC 使用与 Kubernetes 相同的虚拟机调度逻辑和清单结构来为节点分配 Pod。如需详细了解这些调度配置,请参阅以下链接:

将虚拟机放置在特定节点上

如果节点具有特定的硬件配置,您可以将虚拟机安排为仅在这些节点上运行。例如,虚拟机可能需要特定的 CPU 芯片组,或者需要 GPU 支持。您可以使用基本的 nodeSelector 或更灵活的亲和性规则来安排虚拟机在这些节点上运行。

nodeSelector

以下 VirtualMachine 清单使用 nodeSelector 来实现硬性调度要求。如果没有满足调度配置的可用节点,则无法调度虚拟机。

  1. 在您选择的编辑器中创建一个 VirtualMachine 清单,例如 my-scheduled-vm.yaml

    nano my-scheduled-vm.yaml
    
  2. 复制并粘贴以下 YAML 清单:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachine
    metadata:
      name: VM_NAME
    spec:
      interfaces:
        - name: eth0
          networkName: pod-network
          default: true
      disks:
        - virtualMachineDiskName: VM_NAME-boot-dv
          boot: true
      scheduling:
        nodeSelector:
          kubernetes.io/hostname: NODE_NAME
    

    替换以下值:

    • VM_NAME:您的虚拟机的名称。
    • NODE_NAME:要将虚拟机安排在其中的一个或多个节点。

    名为 VM_NAME-boot-dv 的启动磁盘必须已存在。如需了解详情,请参阅创建虚拟机启动磁盘

  3. 在编辑器中保存并关闭虚拟机清单。

  4. 使用 kubectl 创建虚拟机和调度配置:

    kubectl apply -f my-scheduled-vm.yaml
    

亲和性

以下 VirtualMachine 清单使用亲和性来实现软性调度要求。调度器会尝试满足您的请求。如果调度器无法满足请求,则虚拟机会被安排到非首选节点上。

  1. 在您选择的编辑器中创建一个 VirtualMachine 清单,例如 my-scheduled-vm.yaml

    nano my-scheduled-vm.yaml
    
  2. 复制并粘贴以下 YAML 清单:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachine
    metadata:
      name: VM_NAME
    spec:
      interfaces:
        - name: eth0
          networkName: pod-network
          default: true
      disks:
        - virtualMachineDiskName: VM_NAME-boot-dv
          boot: true
      scheduling:
          affinity:
            nodeAffinity:
              preferredDuringSchedulingIgnoredDuringExecution:
              - weight: 100
                preference:
                  matchExpressions:
                  - key: kubernetes.io/hostname
                    operator: In
                    values:
                    - NODE_NAME
    

    替换以下值:

    • VM_NAME:您的虚拟机的名称。
    • NODE_NAME:要将虚拟机安排在其中的一个或多个节点。

    名为 VM_NAME-boot-dv 的启动磁盘必须已存在。如需了解详情,请参阅创建虚拟机启动磁盘

  3. 在编辑器中保存并关闭虚拟机清单。

  4. 使用 kubectl 创建虚拟机和调度配置:

    kubectl apply -f my-scheduled-vm.yaml
    

不将虚拟机放置在特定节点上

某些虚拟机可能具有不能在特定节点上运行的工作负载。您可以使用反亲和性规则来避免在这些节点上安排虚拟机。

以下 VirtualMachine 清单使用亲和性来实现软性调度要求。调度器会尝试满足您的请求。如果调度器无法满足请求,则虚拟机可能会被安排到不合适的节点上。

  1. 在您选择的编辑器中创建一个 VirtualMachine 清单,例如 my-scheduled-vm.yaml

    nano my-scheduled-vm.yaml
    
  2. 复制并粘贴以下 YAML 清单:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachine
    metadata:
      name: VVM_NAME
    spec:
      interfaces:
        - name: eth0
          networkName: pod-network
          default: true
      disks:
        - virtualMachineDiskName: VM_NAME-boot-dv
          boot: true
      scheduling:
        affinity:
          nodeAffinity:
            preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 100
              preference:
                matchExpressions:
                - key: kubernetes.io/hostname
                  operator: NotIn
                  values:
                  - NODE_NAME
    

    替换以下值:

    • VM_NAME:您的虚拟机的名称。
    • NODE_NAME:要将虚拟机安排在其中的节点。

    名为 VM_NAME-boot-dv 的启动磁盘必须已存在。如需了解详情,请参阅创建虚拟机启动磁盘

  3. 在编辑器中保存并关闭虚拟机清单。

  4. 使用 kubectl 创建虚拟机和调度配置:

    kubectl apply -f my-scheduled-vm.yaml
    

使虚拟机分散

为实现高可用性,您的计算工作负载可能具有应分布到不同节点的虚拟机,例如前端虚拟机池。您可以使用虚拟机之间的反亲和性规则避免将虚拟机一起安排到节点上。

以下 VirtualMachine 清单使用亲和性来实现软性调度要求。调度器会尝试满足您的请求。如果调度器无法满足请求,则虚拟机可能会被安排到不合适的节点上。

  1. 在您选择的编辑器中创建一个 VirtualMachine 清单,例如 my-scheduled-vm.yaml

    nano my-scheduled-vm.yaml
    
  2. 复制并粘贴以下 YAML 清单:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachine
    metadata:
      name: VM_NAME
      labels:
        KEY:VALUE
    spec:
      interfaces:
        - name: eth0
          networkName: pod-network
          default: true
      disks:
        - virtualMachineDiskName: VM_NAME-boot-dv
          boot: true
      scheduling:
        affinity:
          podAntiAffinity:
            preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 100
              podAffinityTerm:
                topologyKey: kubernetes.io/hostname
                labelSelector:
                  matchLabels:
                    KEY:VALUE
    

    替换以下值:

    • VM_NAME:您的虚拟机的名称。
    • KEY:VALUE:应用于要安排到不同节点上的虚拟机的 key:value 标签。如需了解详情,请参阅标签和选择器

    名为 VM_NAME-boot-dv 的启动磁盘必须已存在。如需了解详情,请参阅创建虚拟机启动磁盘

  3. 在编辑器中保存并关闭虚拟机清单。

  4. 使用 kubectl 创建虚拟机和调度配置:

    kubectl apply -f my-scheduled-vm.yaml
    

使虚拟机集中

为减少延迟,您的计算工作负载可能具有应集中在某些节点上的虚拟机,例如中间件和数据库层。您可以使用虚拟机间的亲和性规则将虚拟机一起安排到节点上。

以下 VirtualMachine 清单使用亲和性来实现软性调度要求。调度器会尝试满足您的请求。如果调度器无法满足请求,则虚拟机可能会被安排到不合适的节点上。

  1. 在您选择的编辑器中创建一个 VirtualMachine 清单,例如 my-scheduled-vm.yaml

    nano my-scheduled-vm.yaml
    
  2. 复制并粘贴以下 YAML 清单:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachine
    metadata:
      name: VM_NAME
      labels:
        KEY:VALUE
    spec:
      interfaces:
        - name: eth0
          networkName: pod-network
          default: true
      disks:
        - virtualMachineDiskName: VM_NAME-boot-dv
          boot: true
      scheduling:
        affinity:
          podAffinity:
            preferredDuringSchedulingIgnoredDuringExecution
            - podAffinityTerm:
                topologyKey: kubernetes.io/hostname
                labelSelector:
                  matchLabels:
                    KEY:VALUE
              weight: 100
    

    替换以下值:

    • VM_NAME:您的虚拟机的名称。
    • KEY:VALUE:应用于要安排到不同节点上的虚拟机的 key:value 标签对。如需了解详情,请参阅标签和选择器

    名为 VM_NAME-boot-dv 的启动磁盘必须已存在。如需了解详情,请参阅创建虚拟机启动磁盘

  3. 在编辑器中保存并关闭虚拟机清单。

  4. 使用 kubectl 创建虚拟机和调度配置:

    kubectl apply -f my-scheduled-vm.yaml
    

将虚拟机安排到具有污点的节点上

污点是一种调度属性,具有污点的节点可以仅允许具有指定容忍的虚拟机被安排到其上。您可以将污点应用于某个节点,然后在 VirtualMachine 清单中定义容忍,以允许虚拟机在该节点上运行。如需了解详情,请参阅污点和容忍

  1. 在您选择的编辑器中创建一个 VirtualMachine 清单,例如 my-scheduled-vm.yaml

    nano my-scheduled-vm.yaml
    
  2. 复制并粘贴以下 YAML 清单:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachine
    metadata:
      name: VM_NAME
    spec:
      interfaces:
        - name: eth0
          networkName: pod-network
          default: true
      disks:
        - virtualMachineDiskName: VM_NAME-boot-dv
          boot: true
      scheduling:
        tolerations:
        - key: KEY_NAME
          operator: "Equal"
          value: KEY_VALUE
          effect: "NoSchedule"
    

    替换以下值:

    • VM_NAME:您的虚拟机的名称。
    • KEY_NAME:与节点上的污点匹配的容忍键的名称。
    • KEY_VALUE:与节点上的污点匹配的容忍键的值。

    名为 VM_NAME-boot-dv 的启动磁盘必须已存在。如需了解详情,请参阅创建虚拟机启动磁盘

  3. 在编辑器中保存并关闭虚拟机清单。

  4. 使用 kubectl 创建虚拟机和调度配置:

    kubectl apply -f my-scheduled-vm.yaml
    

后续步骤