Questo documento è destinato ai proprietari di applicazioni e agli amministratori di piattaforma che eseguono GKE su Bare Metal. Questo documento mostra come utilizzare le configurazioni della pianificazione, come affinità e 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 al cluster GKE su Bare Metal 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 GDCV per Bare Metal su Compute Engine o consulta la panoramica della creazione del cluster. - Lo strumento client
virtctl
installato come plug-in perkubectl
. Se necessario, installa lo strumento client virtctl.
Panoramica delle configurazioni della pianificazione
Le configurazioni di pianificazione sono valori facoltativi nel runtime VM su GDC. Se non viene specificata alcuna configurazione di pianificazione, la VM utilizza per impostazione predefinita il comportamento di pianificazione predefinito di Kubernetes.
Con il comportamento di pianificazione predefinito, le VM sono distribuite nel cluster. Lo scheduler controlla l'attuale disponibilità di risorse dei nodi, come CPU e memoria, e pianifica le VM sui nodi per distribuire le esigenze di calcolo. Se non hai requisiti specifici, non è necessario definire configurazioni della pianificazione.
Per pianificare le VM sono disponibili i tre campi seguenti:
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 affinità dei nodi e affinità o anti-affinità tra le VM. Puoi definire un requisito flessibile o
obbligatorio per lo scheduler:
preferredDuringSchedulingIgnoredDuringExecution
: è un requisito non obbligatorio. Lo scheduler cerca 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 obbligatorio. Il programma di pianificazione cerca di soddisfare la tua richiesta. Se non sono disponibili nodi che soddisfano i tuoi requisiti, la VM non è pianificata.
Tolerations
: consente di pianificare la VM su nodi con incompatibilità corrispondenti.
Puoi definire una qualsiasi 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 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 pod ai nodi. Per ulteriori informazioni su queste configurazioni di pianificazione, consulta i seguenti link:
Posiziona le VM su un nodo specifico
Se disponi di nodi con configurazioni hardware specifiche, puoi pianificare l'esecuzione delle VM solo su questi nodi. Ad esempio, la VM potrebbe richiedere un chip
set CPU particolare o avere bisogno del supporto per GPU. Puoi utilizzare un elemento 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 rigido. Se non sono disponibili nodi che soddisfano 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.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 maggiori informazioni, consulta Creare un disco di avvio di una 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 non flessibile. Lo scheduler cerca di soddisfare la tua richiesta. Se lo scheduler non può onorare 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.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 maggiori informazioni, consulta Creare un disco di avvio di una 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 posizionare le VM su un nodo specifico
Alcune VM potrebbero avere carichi di lavoro che non vengono eseguiti su un determinato nodo. Puoi utilizzare regole di anti-affinità per evitare di pianificare VM su questi nodi.
Il seguente manifest VirtualMachine
utilizza l'affinità per un requisito di pianificazione non flessibile. Lo scheduler cerca di soddisfare la tua richiesta. Se lo scheduler non riesce a soddisfare la richiesta, la VM potrebbe essere pianificata su un nodo inappropriato.
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: 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. Per maggiori informazioni, consulta Creare un disco di avvio di una 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
Tieni separate le VM
I carichi di lavoro di computing potrebbero avere VM che devono essere distribuite tra i nodi per garantire l'alta disponibilità, ad esempio un pool di VM frontend. Puoi utilizzare regole di anti-affinità tra le VM per evitare di pianificare VM insieme sui nodi.
Il seguente manifest VirtualMachine
utilizza l'affinità per un requisito di pianificazione non flessibile. Lo scheduler cerca di soddisfare la tua richiesta. Se lo scheduler non riesce a soddisfare la richiesta, la VM potrebbe essere pianificata su un nodo inappropriato.
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 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 nodi diversi. Per maggiori informazioni, consulta Etichette e selettori.
Il disco di avvio denominato
VM_NAME-boot-dv
deve esistere. Per maggiori informazioni, consulta Creare un disco di avvio di una 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 carichi di lavoro di computing potrebbero avere VM che devono essere conservate insieme sui nodi per ridurre la latenza, ad esempio un livello middleware e database. Puoi usare le regole di affinità tra le VM per pianificare le VM insieme.
Il seguente manifest VirtualMachine
utilizza l'affinità per un requisito di pianificazione non flessibile. Lo scheduler cerca di soddisfare la tua richiesta. Se lo scheduler non riesce a soddisfare la richiesta, la VM potrebbe essere pianificata su un nodo inappropriato.
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 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 nodi diversi. Per scoprire di più, consulta Etichette e selettori.
Il disco di avvio denominato
VM_NAME-boot-dv
deve esistere. Per maggiori informazioni, consulta Creare un disco di avvio di una 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 le VM sui nodi con incompatibilità
Le incompatibilità sono una proprietà di pianificazione che consente ai nodi di pianificare l'esecuzione su VM solo con tolleranze specificate. Puoi applicare un'incompatibilità a un nodo, dopodiché nel manifest VirtualMachine
definire una tolleranza per consentire l'esecuzione della VM sul nodo. Per maggiori informazioni, consulta
Invecchiamenti e tolleranze.
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: 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-dv
deve esistere. Per maggiori informazioni, consulta Creare un disco di avvio di una 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