排定使用 GDC VM Runtime 的 VM

本文適用於執行 Google Distributed Cloud 的應用程式擁有者和平台管理員。本文說明如何為使用 GDC 上 VM Runtime 的 VM 設定親和性和反親和性等排程設定。

事前準備

如要完成這份文件,您必須存取下列資源:

排程設定總覽

在 GDC 的 VM 執行階段中,排程設定是選用值。如果未指定排程設定,虛擬機會預設為 Kubernetes 預設排程行為。

根據預設排程行為,VM 會分散在叢集中。排程器會查看目前的節點資源可用性 (例如 CPU 和記憶體),並在節點上排定 VM,以分配運算需求。如果沒有特定需求,則不必定義任何時間表設定。

您可以使用下列三個欄位排定 VM 的時間:

  • nodeSelector:指定 VM 主機節點必須具備的節點標籤。VM Runtime on GDC 只會在具有指定標籤的節點上排程 VM。
  • 親和性:指定 VM 的親和性規則。包括節點親和性,以及 VM 間的親和性或反親和性。您可以為排程器定義軟性或硬性需求:
    • preferredDuringSchedulingIgnoredDuringExecution:是軟性規定。 排程器會盡量配合你的要求。如果排程器無法滿足要求,VM 可能會排定在非偏好的節點上。
    • requiredDuringSchedulingIgnoredDuringExecution:是必要條件。排程器會盡量配合你的要求。如果沒有符合您需求的節點,系統就不會排定 VM。
  • Tolerations:允許將 VM 排程至具有相符 taint 的節點。

您可以定義任何排程設定,以支援運算工作負載和排程需求。除了排程設定外,VM 排程也取決於可用資源。

VM Runtime on GDC 會使用與 Kubernetes 相同的 VM 排程邏輯和資訊清單結構,將 Pod 指派給節點。如要進一步瞭解這些排程設定,請參閱下列連結:

將 VM 放在特定節點上

如果您有特定硬體設定的節點,可以安排 VM 只在這些節點上執行。舉例來說,虛擬機器可能需要特定 CPU 晶片組,或需要 GPU 支援。您可以使用基本 nodeSelector 或更彈性的親和性規則,排定在這些節點上執行的 VM。

nodeSelector

下列 VirtualMachine 資訊清單會針對嚴格的排程需求使用 nodeSelector。如果沒有符合排程設定的節點,就無法排定 VM 的排程。

  1. 在您選擇的編輯器中建立資訊清單 (例如 my-scheduled-vm.yaml):VirtualMachine

    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:VM 名稱。
    • NODE_NAME:您要在其上排定 VM 的節點。

    名為「VM_NAME-boot-dv」的開機磁碟必須已存在。詳情請參閱建立 VM 開機磁碟

  3. 在編輯器中儲存並關閉 VM 資訊清單。

  4. 使用 kubectl 建立 VM 並排定設定:

    kubectl apply -f my-scheduled-vm.yaml
    

興趣相似目標對象

下列 VirtualMachine 資訊清單會使用親和性,滿足軟性排程需求。排程器會盡量配合你的要求。如果排程器無法滿足要求,系統會將 VM 排程到非偏好的節點。

  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:VM 名稱。
    • NODE_NAME:您要在其上排定 VM 的節點。

    名為「VM_NAME-boot-dv」的開機磁碟必須已存在。詳情請參閱建立 VM 開機磁碟

  3. 在編輯器中儲存並關閉 VM 資訊清單。

  4. 使用 kubectl 建立 VM 並排定設定:

    kubectl apply -f my-scheduled-vm.yaml
    

不要將 VM 放在特定節點上

某些 VM 可能有無法在特定節點上執行的工作負載。您可以使用反相依性規則,避免在這些節點上排程 VM。

下列 VirtualMachine 資訊清單會使用親和性,滿足軟性排程需求。排程器會盡量配合你的要求。如果排程器無法滿足要求,VM 可能會排程到不適當的節點上。

  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:VM 名稱。
    • NODE_NAME:您要在其上排定 VM 的節點。

    名為 VM_NAME-boot-dv 的開機磁碟必須已存在。詳情請參閱建立 VM 開機磁碟

  3. 在編輯器中儲存並關閉 VM 資訊清單。

  4. 使用 kubectl 建立 VM 並排定設定:

    kubectl apply -f my-scheduled-vm.yaml
    

讓 VM 保持分開

您的運算工作負載可能會有應分散在節點上的 VM,以確保高可用性,例如前端 VM 集區。您可以使用 VM 間反相依性規則,避免在節點上同時排定 VM。

下列 VirtualMachine 資訊清單會使用親和性,滿足軟性排程需求。排程器會盡量配合你的要求。如果排程器無法滿足要求,VM 可能會排程到不適當的節點上。

  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:VM 名稱。
    • KEY:VALUE:要套用至 VM 的 key:value 標籤,以便在不同節點間排定 VM 的時間。詳情請參閱「標籤和選取器」。

    名為 VM_NAME-boot-dv 的開機磁碟必須已存在。詳情請參閱建立 VM 開機磁碟

  3. 在編輯器中儲存並關閉 VM 資訊清單。

  4. 使用 kubectl 建立 VM 並排定設定:

    kubectl apply -f my-scheduled-vm.yaml
    

將 VM 放在一起

您的運算工作負載可能會有應保留在節點上的 VM,以減少延遲,例如中介軟體和資料庫層。您可以使用 VM 間親和性規則,在節點上一起排程 VM。

下列 VirtualMachine 資訊清單會使用親和性,滿足軟性排程需求。排程器會盡量配合你的要求。如果排程器無法滿足要求,VM 可能會排程到不適當的節點上。

  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:VM 名稱。
    • KEY:VALUE:要套用至 VM 的 key:value 標籤配對,這些 VM 會排定在不同節點上執行。詳情請參閱「標籤和選取器」一文。

    名為 VM_NAME-boot-dv 的開機磁碟必須已存在。詳情請參閱建立 VM 開機磁碟

  3. 在編輯器中儲存並關閉 VM 資訊清單。

  4. 使用 kubectl 建立 VM 並排定設定:

    kubectl apply -f my-scheduled-vm.yaml
    

在具有 taint 的節點上排定 VM

Taint 是一種排程屬性,可讓節點只允許具有指定容許條件的 VM 排程到節點上執行。您可以對節點套用 taint,然後在 VirtualMachine 資訊清單中定義容許條件,讓 VM 在節點上執行。詳情請參閱「Taint 和容許條件」。

  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:VM 名稱。
    • KEY_NAME:容許項目的鍵名,與節點上的汙點相符。
    • KEY_VALUE:容許項的鍵值,與節點上的汙染相符。

    名為 VM_NAME-boot-dv 的開機磁碟必須已存在。詳情請參閱建立 VM 開機磁碟

  3. 在編輯器中儲存並關閉 VM 資訊清單。

  4. 使用 kubectl 建立 VM 並排定設定:

    kubectl apply -f my-scheduled-vm.yaml
    

後續步驟