本文適用於執行 Google Distributed Cloud 的應用程式擁有者和平台管理員。本文說明如何為使用 GDC 上的 VM Runtime 的 VM,設定親和性和反親和性等排程設定。
事前準備
如要完成這份文件,您必須存取下列資源:
- 存取 Google Distributed Cloud 1.12.0 以上版本的叢集 (
anthosBareMetalVersion: 1.12.0)。您可以使用任何可執行工作負載的叢集類型。 如有需要,請試用 Compute Engine 上的 Google Distributed Cloud,或參閱叢集建立總覽。 virtctl用戶端工具,以kubectl外掛程式的形式安裝。視需要安裝 virtctl 用戶端工具。
排程設定總覽
排程設定是 GDC 上 VM Runtime 的選用值。如未指定任何排程設定,VM 會預設採用 Kubernetes 預設排程行為。
根據預設的排程行為,VM 會分散在叢集各處。排程器會查看目前的節點資源可用性 (例如 CPU 和記憶體),並在節點上排定 VM,以分配運算需求。如果沒有特定需求,則不必定義任何時間表設定。
您可以使用下列三個欄位排定 VM 的時間:
nodeSelector:指定 VM 主機節點必須具備的節點標籤。GDC 上的 VM 執行階段只會在具有指定標籤的節點上排定 VM。- 親和性:指定 VM 的親和性規則。包括節點親和性,以及 VM 間的親和性或反親和性。您可以為排程器定義軟性或硬性需求:
preferredDuringSchedulingIgnoredDuringExecution:是軟性規定。 排程器會盡量滿足你的要求,如果排程器無法滿足要求,VM 可能會排程在非偏好的節點上。requiredDuringSchedulingIgnoredDuringExecution:是必要條件。排程器會盡量滿足您的要求。如果沒有符合您需求的節點,系統就不會排定 VM。
Tolerations:允許將 VM 排定至具有相符汙點的節點。
您可以定義任何排程設定,以支援運算工作負載和排程需求。除了排程設定外,VM 排程也取決於可用資源。
GDC 中的 VM 執行階段會使用與 Kubernetes 相同的 VM 排程邏輯和資訊清單結構,將 Pod 指派給節點。如要進一步瞭解這些排程設定,請參閱下列連結:
將 VM 放在特定節點上
如果節點具有特定硬體設定,您可以排定 VM 的執行時間,只在這些節點上執行。舉例來說,VM 可能需要特定 CPU 晶片組,或需要 GPU 支援。您可以使用基本 nodeSelector 或更彈性的親和性規則,排定在這些節點上執行的 VM。
nodeSelector
下列 VirtualMachine 資訊清單會針對嚴格的排程需求使用 nodeSelector。如果沒有符合排程設定的節點,就無法排程 VM。
在您慣用的編輯器中建立
VirtualMachine資訊清單,例如 my-scheduled-vm.yaml:nano my-scheduled-vm.yaml複製並貼上下列 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 開機磁碟」。在編輯器中儲存並關閉 VM 資訊清單。
使用
kubectl建立 VM 並排定設定:kubectl apply -f my-scheduled-vm.yaml
興趣相似目標對象
下列 VirtualMachine 資訊清單會使用親和性,滿足軟性排程需求。排程器會盡量滿足你的要求,如果排程器無法滿足要求,系統就會在非偏好的節點上排程 VM。
在所選編輯器中建立
VirtualMachine資訊清單,例如 my-scheduled-vm.yaml:nano my-scheduled-vm.yaml複製並貼上下列 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 開機磁碟」。在編輯器中儲存並關閉 VM 資訊清單。
使用
kubectl建立 VM 並排定設定:kubectl apply -f my-scheduled-vm.yaml
不要將 VM 放在特定節點上
某些 VM 可能有無法在特定節點上執行的工作負載。您可以使用反親和性規則,避免在這些節點上排定 VM。
下列 VirtualMachine 資訊清單會使用親和性,滿足軟性排程需求。排程器會盡量滿足你的要求,如果排程器無法滿足要求,VM 可能會排程在不適當的節點上。
在所選編輯器中建立
VirtualMachine資訊清單,例如 my-scheduled-vm.yaml:nano my-scheduled-vm.yaml複製並貼上下列 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 開機磁碟」。在編輯器中儲存並關閉 VM 資訊清單。
使用
kubectl建立 VM 並排定設定:kubectl apply -f my-scheduled-vm.yaml
讓 VM 保持分開
您的運算工作負載可能含有應分散到各節點的 VM,以確保高可用性,例如前端 VM 集區。您可以使用 VM 間反親和性規則,避免在節點上一起排定 VM。
下列 VirtualMachine 資訊清單會使用親和性,滿足軟性排程需求。排程器會盡量滿足你的要求,如果排程器無法滿足要求,VM 可能會排程在不適當的節點上。
在所選編輯器中建立
VirtualMachine資訊清單,例如 my-scheduled-vm.yaml:nano my-scheduled-vm.yaml複製並貼上下列 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_NAME-boot-dv」的開機磁碟必須已存在。詳情請參閱「建立 VM 開機磁碟」。在編輯器中儲存並關閉 VM 資訊清單。
使用
kubectl建立 VM 並排定設定:kubectl apply -f my-scheduled-vm.yaml
將 VM 放在一起
您的運算工作負載可能含有應保留在節點上的 VM,以減少延遲,例如中介軟體和資料庫層。您可以使用 VM 間親和性規則,在節點上一起排定 VM。
下列 VirtualMachine 資訊清單會使用親和性,滿足軟性排程需求。排程器會盡量滿足你的要求,如果排程器無法滿足要求,VM 可能會排程在不適當的節點上。
在所選編輯器中建立
VirtualMachine資訊清單,例如 my-scheduled-vm.yaml:nano my-scheduled-vm.yaml複製並貼上下列 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 開機磁碟」。在編輯器中儲存並關閉 VM 資訊清單。
使用
kubectl建立 VM 並排定設定:kubectl apply -f my-scheduled-vm.yaml
在具有汙染的節點上排定 VM
Taint 是一種排程屬性,可讓節點只允許具有指定容許條件的 VM 排程在節點上執行。您可以將汙點套用至節點,然後在 VirtualMachine 資訊清單中定義容許條件,讓 VM 在節點上執行。詳情請參閱「Taint 和容許條件」。
在所選編輯器中建立
VirtualMachine資訊清單,例如 my-scheduled-vm.yaml:nano my-scheduled-vm.yaml複製並貼上下列 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:容許條件的鍵名,與節點上的 taint 相符。KEY_VALUE:容許條件的鍵值,與節點上的 taint 相符。
名為「
VM_NAME-boot-dv」的開機磁碟必須已存在。詳情請參閱「建立 VM 開機磁碟」。在編輯器中儲存並關閉 VM 資訊清單。
使用
kubectl建立 VM 並排定設定:kubectl apply -f my-scheduled-vm.yaml