Questo documento è rivolto ai proprietari delle applicazioni e agli amministratori della piattaforma che eseguono Google Distributed Cloud. Questo documento mostra come utilizzare le configurazioni di pianificazione, come l'affinità e l'anti-affinità, per le VM che utilizzano il runtime VM su GDC.
Prima di iniziare
Per completare questo documento, devi avere accesso alle seguenti risorse:
- Accesso a un cluster Google Distributed Cloud versione 1.12.0 (
anthosBareMetalVersion: 1.12.0) o successive. Puoi utilizzare qualsiasi tipo di cluster in grado di eseguire workload. Se necessario, prova Google Distributed Cloud su Compute Engine o consulta la panoramica della creazione del cluster. - Lo strumento client
virtctlinstallato come plug-in perkubectl. Se necessario, installa lo strumento client virtctl.
Panoramica delle configurazioni di pianificazione
Le configurazioni di pianificazione sono valori facoltativi nel runtime VM su GDC. Se non viene specificata alcuna configurazione di pianificazione, la VM utilizza il comportamento di pianificazione predefinito di Kubernetes.
Con il comportamento di pianificazione predefinito, le VM vengono distribuite nel cluster. Lo scheduler esamina la disponibilità delle risorse dei nodi correnti, come CPU e memoria, e pianifica le VM sui nodi per distribuire le richieste di calcolo. Se non hai requisiti specifici, non devi definire alcuna configurazione di pianificazione.
Sono disponibili i seguenti tre campi per pianificare le VM:
nodeSelector: specifica le etichette dei nodi che il nodo host di una VM deve avere. Il runtime VM su GDC pianifica la VM solo sui nodi che hanno un'etichetta specificata.- Affinità: specifica le regole di affinità della VM. Include l'affinità dei nodi e l'affinità o l'anti-affinità tra VM. Definisci un requisito soft o hard per lo scheduler:
preferredDuringSchedulingIgnoredDuringExecution: è un requisito soft. Lo scheduler tenta di soddisfare la tua richiesta. Se lo scheduler non riesce a soddisfare la richiesta, la VM potrebbe essere pianificata su un nodo non preferito.requiredDuringSchedulingIgnoredDuringExecution: è un requisito hard. Lo scheduler tenta di soddisfare la tua richiesta. Se non sono disponibili nodi che soddisfano il tuo requisito, la VM non viene pianificata.
Tolerations: consente di pianificare la VM sui nodi con incompatibilità corrispondenti.
Puoi definire una qualsiasi di queste configurazioni di pianificazione per supportare i tuoi workload di calcolo e le tue esigenze di pianificazione. Oltre alle configurazioni di pianificazione, la pianificazione delle VM dipende dalle risorse disponibili.
Il runtime VM su GDC utilizza la stessa logica di pianificazione delle VM e la stessa struttura dei manifest di Kubernetes per assegnare i pod ai nodi. Per ulteriori informazioni su queste configurazioni di pianificazione, consulta i seguenti link:
Inserire le VM su un nodo specifico
Se hai nodi con configurazioni hardware specifiche, puoi pianificare l'esecuzione delle VM solo su questi nodi. Ad esempio, la VM potrebbe richiedere un chipset CPU specifico o il supporto GPU. Puoi utilizzare un nodeSelector di base o regole di affinità più flessibili per pianificare l'esecuzione delle VM su questi nodi.
nodeSelector
Il seguente manifest VirtualMachine utilizza un nodeSelector per un requisito di pianificazione hard. Se non è disponibile alcun nodo che soddisfi la configurazione di pianificazione, la VM non può essere pianificata.
Crea un manifest
VirtualMachine, ad esempio my-scheduled-vm.yaml,nell'editor che preferisci:nano my-scheduled-vm.yamlCopia e incolla il seguente manifest 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_NAMESostituisci i seguenti valori:
VM_NAME: il nome della VM.NODE_NAME: i nodi su cui vuoi pianificare la VM.
Il disco di avvio denominato
VM_NAME-boot-dvdeve già esistere. Per ulteriori informazioni, consulta Creare un disco di avvio della VM.Salva e chiudi il manifest della VM nell'editor.
Crea la VM e la configurazione di pianificazione utilizzando
kubectl:kubectl apply -f my-scheduled-vm.yaml
Affinità
Il seguente manifest VirtualMachine utilizza l'affinità per un requisito di pianificazione soft. Lo scheduler tenta di soddisfare la tua richiesta. Se lo scheduler non riesce a soddisfare la richiesta, la VM viene pianificata su un nodo non preferito.
Crea un manifest
VirtualMachine, ad esempio my-scheduled-vm.yaml,nell'editor che preferisci:nano my-scheduled-vm.yamlCopia e incolla il seguente manifest 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_NAMESostituisci i seguenti valori:
VM_NAME: il nome della VM.NODE_NAME: i nodi su cui vuoi pianificare la VM.
Il disco di avvio denominato
VM_NAME-boot-dvdeve già esistere. Per ulteriori informazioni, consulta Creare un disco di avvio della VM.Salva e chiudi il manifest della VM nell'editor.
Crea la VM e la configurazione di pianificazione utilizzando
kubectl:kubectl apply -f my-scheduled-vm.yaml
Non inserire le VM su un nodo specifico
Alcune VM potrebbero avere workload che non vengono eseguiti su un nodo specifico. Puoi utilizzare le regole di anti-affinità per evitare di pianificare le VM su questi nodi.
Il seguente manifest VirtualMachine utilizza l'affinità per un requisito di pianificazione soft. Lo scheduler tenta di soddisfare la tua richiesta. Se lo scheduler non riesce a soddisfare la richiesta, la VM potrebbe essere pianificata su un nodo non appropriato.
Crea un manifest
VirtualMachine, ad esempio my-scheduled-vm.yaml,nell'editor che preferisci:nano my-scheduled-vm.yamlCopia e incolla il seguente manifest 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_NAMESostituisci i seguenti valori:
VM_NAME: il nome della VM.NODE_NAME: il nodo su cui vuoi pianificare la VM.
Il disco di avvio denominato
VM_NAME-boot-dvdeve già esistere. Per ulteriori informazioni, consulta Creare un disco di avvio della VM.Salva e chiudi il manifest della VM nell'editor.
Crea la VM e la configurazione di pianificazione utilizzando
kubectl:kubectl apply -f my-scheduled-vm.yaml
Mantenere separate le VM
I tuoi workload di calcolo potrebbero avere VM che devono essere distribuite tra i nodi per l'alta affidabilità, ad esempio un pool di VM frontend. Puoi utilizzare le regole di anti-affinità tra VM per evitare di pianificare le VM insieme sui nodi.
Il seguente manifest VirtualMachine utilizza l'affinità per un requisito di pianificazione soft. Lo scheduler tenta di soddisfare la tua richiesta. Se lo scheduler non riesce a soddisfare la richiesta, la VM potrebbe essere pianificata su un nodo non appropriato.
Crea un manifest
VirtualMachine, ad esempio my-scheduled-vm.yaml,nell'editor che preferisci:nano my-scheduled-vm.yamlCopia e incolla il seguente manifest 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:VALUESostituisci i seguenti valori:
VM_NAME: il nome della VM.KEY:VALUE: l'etichettakey:valueda applicare alle VM che vuoi pianificare su nodi diversi. Per ulteriori informazioni, consulta Etichette e selettori.
Il disco di avvio denominato
VM_NAME-boot-dvdeve già esistere. Per ulteriori informazioni, consulta Creare un disco di avvio della VM.Salva e chiudi il manifest della VM nell'editor.
Crea la VM e la configurazione di pianificazione utilizzando
kubectl:kubectl apply -f my-scheduled-vm.yaml
Mantenere insieme le VM
I tuoi workload di calcolo potrebbero avere VM che devono essere mantenute insieme sui nodi per ridurre la latenza, ad esempio un livello di middleware e database. Puoi utilizzare le regole di affinità tra VM per pianificare le VM insieme sui nodi.
Il seguente manifest VirtualMachine utilizza l'affinità per un requisito di pianificazione soft. Lo scheduler tenta di soddisfare la tua richiesta. Se lo scheduler non riesce a soddisfare la richiesta, la VM potrebbe essere pianificata su un nodo non appropriato.
Crea un manifest
VirtualMachine, ad esempio my-scheduled-vm.yaml,nell'editor che preferisci:nano my-scheduled-vm.yamlCopia e incolla il seguente manifest 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: 100Sostituisci i seguenti valori:
VM_NAME: il nome della VM.KEY:VALUE: la coppia di etichettekey:valueda applicare alle VM che vuoi pianificare su nodi diversi. Per ulteriori informazioni, consulta Etichette e selettori.
Il disco di avvio denominato
VM_NAME-boot-dvdeve già esistere. Per ulteriori informazioni, consulta Creare un disco di avvio della VM.Salva e chiudi il manifest della VM nell'editor.
Crea la VM e la configurazione di pianificazione utilizzando
kubectl:kubectl apply -f my-scheduled-vm.yaml
Pianificare le VM sui nodi con incompatibilità
Le incompatibilità sono una proprietà di pianificazione che consente ai nodi di consentire la pianificazione dell'esecuzione solo delle VM con tolleranze specificate. Puoi applicare un'incompatibilità a un nodo, quindi definire una tolleranza nel manifest VirtualMachine per consentire l'esecuzione della VM sul nodo. Per ulteriori informazioni, consulta
Incompatibilità e tolleranze.
Crea un manifest
VirtualMachine, ad esempio my-scheduled-vm.yaml,nell'editor che preferisci:nano my-scheduled-vm.yamlCopia e incolla il seguente manifest 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"Sostituisci i seguenti valori:
VM_NAME: il nome della VM.KEY_NAME: il nome della chiave della tolleranza che corrisponde all'incompatibilità sul nodo.KEY_VALUE: il valore della chiave per la tolleranza che corrisponde all'incompatibilità sul nodo.
Il disco di avvio denominato
VM_NAME-boot-dvdeve già esistere. Per ulteriori informazioni, consulta Creare un disco di avvio della VM.Salva e chiudi il manifest della VM nell'editor.
Crea la VM e la configurazione di pianificazione utilizzando
kubectl:kubectl apply -f my-scheduled-vm.yaml