Questo documento è rivolto ai proprietari di applicazioni e agli amministratori della piattaforma che eseguono Google Distributed Cloud. Questo documento spiega 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 disporre dell'accesso alle seguenti risorse:
- Accesso al cluster Google Distributed Cloud versione 1.12.0 (
anthosBareMetalVersion: 1.12.0
) o successiva. Puoi utilizzare qualsiasi tipo di cluster in grado di eseguire carichi di lavoro. Se necessario, prova Google Distributed Cloud su Compute Engine o consulta la panoramica della creazione dei cluster. - Lo strumento client
virtctl
installato come plug-in perkubectl
. Se necessario, installa lo strumento client virtctl.
Panoramica delle configurazioni della pianificazione
Le configurazioni della pianificazione sono valori facoltativi nel runtime della VM su GDC. Se non viene specificata alcuna configurazione di pianificazione, la VM assume per impostazione predefinita il comportamento di pianificazione predefinito di Kubernetes.
Con il comportamento di pianificazione predefinito, le VM vengono distribuite nel cluster. Lo schedulatore esamina la disponibilità attuale delle risorse del nodo, 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 della pianificazione.
Per pianificare le VM sono disponibili i seguenti tre campi:
nodeSelector
: specifica le etichette dei nodi che deve avere il nodo host di una VM. Il runtime VM su GDC pianifica la VM solo sui nodi con un'etichetta specificata.- Affinità: specifica le regole di affinità della VM. Sono incluse l'affinità dei nodi e l'affinità o l'anti-affinità tra VM. Definisci un requisito soft o hard per il programmatore:
preferredDuringSchedulingIgnoredDuringExecution
: è un requisito facoltativo. Il programmatore tenta di soddisfare la tua richiesta. Se lo scheduler non può soddisfare la richiesta, la VM potrebbe essere pianificata su un nodo non preferito.requiredDuringSchedulingIgnoredDuringExecution
: è un requisito obbligatorio. Il programmatore tenta di soddisfare la tua richiesta. Se non sono disponibili nodi chesoddisfano il tuo requisito, la VM non viene pianificata.
Tolerations
: consente di pianificare la VM su nodi con impurità corrispondenti.
Puoi definire una di queste configurazioni di pianificazione per supportare i tuoi carichi di lavoro 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 del manifest di Kubernetes per assegnare i pod ai nodi. Per ulteriori informazioni su queste configurazioni di pianificazione, consulta i seguenti link:
Posiziona 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 tua VM potrebbe richiedere un determinato chipset della CPU o il supporto della 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 obbligatorio. Se non è disponibile alcun nodo che soddisfi la configurazione della 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.yaml
Copia 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_NAME
Sostituisci 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-dv
deve già esistere. Per ulteriori informazioni, consulta Creare un disco di avvio della VM.Salva e chiudi il file manifest della VM nell'editor.
Crea la VM e pianifica la configurazione utilizzando
kubectl
:kubectl apply -f my-scheduled-vm.yaml
Affinità
Il seguente manifest VirtualMachine
utilizza l'affinità per un requisito di pianificazione flessibile. Il programmatore tenta di soddisfare la tua richiesta. Se lo scheduler non può soddisfare la richiesta, la VM viene pianificata su un nodo non preferito.
Crea un file manifest
VirtualMachine
, ad esempio my-scheduled-vm.yaml,nell'editor che preferisci:nano my-scheduled-vm.yaml
Copia 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_NAME
Sostituisci 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-dv
deve già esistere. Per ulteriori informazioni, consulta Creare un disco di avvio della VM.Salva e chiudi il file manifest della VM nell'editor.
Crea la VM e pianifica la configurazione utilizzando
kubectl
:kubectl apply -f my-scheduled-vm.yaml
Non posizionare le VM su un nodo specifico
Alcune VM potrebbero avere carichi di lavoro che non vengono eseguiti su un determinato nodo. 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 flessibile. Il programmatore tenta di soddisfare la tua richiesta. Se lo scheduler non può soddisfare la richiesta, la VM potrebbe essere pianificata su un nodo inappropriato.
Crea un file manifest
VirtualMachine
, ad esempio my-scheduled-vm.yaml,nell'editor che preferisci:nano my-scheduled-vm.yaml
Copia 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_NAME
Sostituisci 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-dv
deve esistere già. Per ulteriori informazioni, consulta Creare un disco di avvio della VM.Salva e chiudi il file manifest della VM nell'editor.
Crea la VM e pianifica la configurazione utilizzando
kubectl
:kubectl apply -f my-scheduled-vm.yaml
Mantieni separate le VM
I tuoi carichi di lavoro di calcolo potrebbero avere VM che devono essere distribuite tra i nodi per la disponibilità elevata, ad esempio un pool di VM frontend. Puoi utilizzare le regole 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 flessibile. Il programmatore tenta di soddisfare la tua richiesta. Se lo scheduler non può soddisfare la richiesta, la VM potrebbe essere pianificata su un nodo inappropriato.
Crea un file manifest
VirtualMachine
, ad esempio my-scheduled-vm.yaml,nell'editor che preferisci:nano my-scheduled-vm.yaml
Copia 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:VALUE
Sostituisci i seguenti valori:
VM_NAME
: il nome della VM.KEY:VALUE
: l'etichettakey:value
da applicare alle VM che vuoi pianificare su diversi nodi. Per ulteriori informazioni, consulta Etichette e selettori.
Il disco di avvio denominato
VM_NAME-boot-dv
deve esistere già. Per ulteriori informazioni, consulta Creare un disco di avvio della VM.Salva e chiudi il file manifest della VM nell'editor.
Crea la VM e pianifica la configurazione utilizzando
kubectl
:kubectl apply -f my-scheduled-vm.yaml
Mantenere insieme le VM
I carichi di lavoro di calcolo potrebbero avere VM che devono essere tenute 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 flessibile. Il programmatore tenta di soddisfare la tua richiesta. Se lo scheduler non può soddisfare la richiesta, la VM potrebbe essere pianificata su un nodo inappropriato.
Crea un file manifest
VirtualMachine
, ad esempio my-scheduled-vm.yaml,nell'editor che preferisci:nano my-scheduled-vm.yaml
Copia 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: 100
Sostituisci i seguenti valori:
VM_NAME
: il nome della VM.KEY:VALUE
: la coppia di etichettekey:value
da applicare alle VM che vuoi pianificare su diversi nodi. Per ulteriori informazioni, consulta Etichette e selettori.
Il disco di avvio denominato
VM_NAME-boot-dv
deve esistere già. Per ulteriori informazioni, consulta Creare un disco di avvio della VM.Salva e chiudi il file manifest della VM nell'editor.
Crea la VM e pianifica la configurazione 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 l'esecuzione solo delle VM con tolleranze specificate. Puoi applicare un'incompatibilità a un nodo,
quindi nel file manifest VirtualMachine
definire una tolleranza per consentire l'esecuzione della VM sul
nodo. Per ulteriori informazioni, consulta
Incompatibilità e tolleranze.
Crea un file manifest
VirtualMachine
, ad esempio my-scheduled-vm.yaml,nell'editor che preferisci:nano my-scheduled-vm.yaml
Copia 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 al taint sul nodo.KEY_VALUE
: il valore della chiave per la tolleranza corrispondente al taint sul nodo.
Il disco di avvio denominato
VM_NAME-boot-dv
deve esistere già. Per ulteriori informazioni, consulta Creare un disco di avvio della VM.Salva e chiudi il file manifest della VM nell'editor.
Crea la VM e pianifica la configurazione utilizzando
kubectl
:kubectl apply -f my-scheduled-vm.yaml