本文適用於執行 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 執行階段中,排程設定是選用值。如果未指定排程設定,虛擬機會預設為 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 的排程。
在您選擇的編輯器中建立資訊清單 (例如 my-scheduled-vm.yaml):
VirtualMachine
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 的時間。詳情請參閱「標籤和選取器」。
名為
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
在具有 taint 的節點上排定 VM
Taint 是一種排程屬性,可讓節點只允許具有指定容許條件的 VM 排程到節點上執行。您可以對節點套用 taint,然後在 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
:容許項目的鍵名,與節點上的汙點相符。KEY_VALUE
:容許項的鍵值,與節點上的汙染相符。
名為
VM_NAME-boot-dv
的開機磁碟必須已存在。詳情請參閱建立 VM 開機磁碟。在編輯器中儲存並關閉 VM 資訊清單。
使用
kubectl
建立 VM 並排定設定:kubectl apply -f my-scheduled-vm.yaml