Questo documento è rivolto ai proprietari di applicazioni e agli amministratori di piattaforme che eseguono cluster Anthos su Bare Metal. Questo documento mostra come utilizzare le configurazioni di pianificazione come affinità e anti-affinità per le VM che utilizzano Anthos VM Runtime.
Prima di iniziare
Per completare il documento, devi accedere alle seguenti risorse:
- Accesso ai cluster Anthos su Bare Metal versione 1.12.0 (
anthosBareMetalVersion: 1.12.0
) o superiore. Puoi utilizzare qualsiasi tipo di cluster in grado di eseguire carichi di lavoro. Se necessario, prova i cluster Anthos su Bare Metal su Compute Engine o consulta la panoramica per la creazione dei cluster. - Lo strumento client di
virtctl
è stato installato come plug-in perkubectl
. Se necessario, installa lo strumento client virtctl.
Panoramica della configurazione delle pianificazioni
Le configurazioni di pianificazione sono valori facoltativi nel runtime VM Anthos. Se non è specificata alcuna configurazione di pianificazione, il valore predefinito della VM è il comportamento predefinito di pianificazione di Kubernetes.
Con il comportamento di pianificazione predefinito, le VM sono distribuite in tutto il cluster. Lo scheduler considera la disponibilità attuale delle risorse del nodo, ad esempio CPU e memoria, e pianifica le VM sui nodi per distribuire le esigenze di calcolo. Se non hai requisiti specifici, non devi definire alcuna configurazione di pianificazione.
Sono disponibili i tre campi seguenti per pianificare le VM:
nodeSelector
: specifica le etichette dei nodi che devono avere il nodo host di una VM. Anthos VM Runtime pianifica la VM solo sui nodi che hanno un'etichetta specificata.- Affinità: specifica le regole di affinità della VM. Include l'affinità nodo e l'affinità o anti-affinità tra VM. Puoi definire un requisito soft
o rigido per lo scheduler:
preferredDuringSchedulingIgnoredDuringExecution
: è un requisito soft. Lo scheduler prova a soddisfare la tua richiesta. Se lo scheduler non può rispettare la richiesta, la VM può essere pianificata su un nodo non preferito.requiredDuringSchedulingIgnoredDuringExecution
: è un requisito rigido. Lo scheduler cerca di soddisfare la tua richiesta. Se non sono disponibili nodi che corrispondono al requisito, la VM non viene pianificata.
Tolerations
: consente di pianificare la VM su nodi con incompatibilità corrispondenti.
Puoi definire una di queste configurazioni di pianificazione per supportare i carichi di lavoro di calcolo e le esigenze di pianificazione. Oltre alla pianificazione delle configurazioni, la pianificazione delle VM si basa sulle risorse disponibili.
Il runtime VM VM di Anthos utilizza la stessa logica di pianificazione delle VM e la stessa struttura manifest di Kubernetes per assegnare i pod ai nodi. Per ulteriori informazioni su queste configurazioni di pianificazione, consulta i seguenti link:
Inserisci VM su un nodo specifico
Se hai nodi con configurazioni hardware specifiche, puoi pianificare le VM in modo che vengano eseguite solo su questi nodi. Ad esempio, la tua VM potrebbe richiedere un particolare chipset della CPU o richiedere il supporto della GPU. Puoi utilizzare una nodeSelector
di base o più regole di affinità flessibili per pianificare l'esecuzione delle VM su questi nodi.
nodeSelector
Il seguente manifest VirtualMachine
utilizza un nodeSelector
per un requisito di pianificazione rigida. 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 preferito: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 tua VM.NODE_NAME
: nodo in cui vuoi pianificare la VM.
Il disco di avvio denominato
VM_NAME-boot-dv
deve esistere già. Per ulteriori informazioni, consulta la pagina Creare un disco di avvio VM.Salva e chiudi il 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 soft. Lo scheduler prova a soddisfare la tua richiesta. Se lo scheduler non può rispettare la richiesta, la VM viene pianificata su un nodo non preferito.
Crea un manifest
VirtualMachine
, ad esempio my-scheduled-vm.yaml, nell'editor preferito: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 tua VM.NODE_NAME
: nodo in cui vuoi pianificare la VM.
Il disco di avvio denominato
VM_NAME-boot-dv
deve esistere già. Per ulteriori informazioni, consulta la pagina Creare un disco di avvio VM.Salva e chiudi il manifest della VM nell'editor.
Crea la VM e pianifica la configurazione utilizzando
kubectl
:kubectl apply -f my-scheduled-vm.yaml
Non collocare 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 soft. Lo scheduler prova a soddisfare la tua richiesta. Se lo scheduler non può rispettare la richiesta, la VM potrebbe essere pianificata su un nodo inappropriato.
Crea un manifest
VirtualMachine
, ad esempio my-scheduled-vm.yaml, nell'editor preferito: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 tua VM.NODE_NAME
: il nodo su cui vuoi pianificare la VM.
Il disco di avvio denominato
VM_NAME-boot-dv
deve già esistere. Per ulteriori informazioni, consulta la pagina Creare un disco di avvio VM.Salva e chiudi il 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 nodi per l'alta disponibilità, ad esempio un pool di VM frontend. Puoi usare le regole di anti-affinità tra le 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 prova a soddisfare la tua richiesta. Se lo scheduler non può rispettare la richiesta, la VM potrebbe essere pianificata su un nodo inappropriato.
Crea un manifest
VirtualMachine
, ad esempio my-scheduled-vm.yaml,nell'editor preferito: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 tua VM.KEY:VALUE
: l'etichettakey:value
da applicare alle VM che vuoi pianificare su diversi nodi. Per maggiori informazioni, consulta la pagina Etichette e selettori.
Il disco di avvio denominato
VM_NAME-boot-dv
deve già esistere. Per ulteriori informazioni, consulta la pagina Creare un disco di avvio VM.Salva e chiudi il manifest della VM nell'editor.
Crea la VM e pianifica la configurazione utilizzando
kubectl
:kubectl apply -f my-scheduled-vm.yaml
Mantieni unite le VM
I tuoi carichi di lavoro di calcolo potrebbero avere VM che devono essere mantenute insieme sui nodi per ridurre la latenza, ad esempio un livello middleware e database. Puoi utilizzare le regole di affinità tra le VM per pianificare insieme le VM sui nodi.
Il seguente manifest VirtualMachine
utilizza l'affinità per un requisito di pianificazione soft. Lo scheduler prova a soddisfare la tua richiesta. Se lo scheduler non può rispettare la richiesta, la VM potrebbe essere pianificata su un nodo inappropriato.
Crea un manifest
VirtualMachine
, ad esempio my-scheduled-vm.yaml, nell'editor preferito: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 tua VM.KEY:VALUE
: la coppia di etichettekey:value
da applicare alle VM che vuoi pianificare nei diversi nodi. Per ulteriori informazioni, consulta Etichette e selettori.
Il disco di avvio denominato
VM_NAME-boot-dv
deve già esistere. Per ulteriori informazioni, consulta la pagina Creare un disco di avvio VM.Salva e chiudi il manifest della VM nell'editor.
Crea la VM e pianifica la configurazione utilizzando
kubectl
:kubectl apply -f my-scheduled-vm.yaml
Pianifica VM su nodi con incompatibilità
Le incompatibilità sono una proprietà di pianificazione che consente ai nodi di pianificare solo l'esecuzione delle VM con tolleranze specificate. Puoi applicare un'incompatibilità a un nodo, quindi nel manifest VirtualMachine
definisci una tolleranza 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 preferito: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 tua VM.KEY_NAME
: il nome chiave della tolleranza che corrisponde all'incompatibilità del nodo.KEY_VALUE
: il valore della chiave per la tolleranza che corrisponde all'incompatibilità del nodo.
Il disco di avvio denominato
VM_NAME-boot-dv
deve già esistere. Per ulteriori informazioni, consulta la pagina Creare un disco di avvio VM.Salva e chiudi il manifest della VM nell'editor.
Crea la VM e pianifica la configurazione utilizzando
kubectl
:kubectl apply -f my-scheduled-vm.yaml