Pianifica le VM che utilizzano il runtime delle VM su GDC

Le configurazioni di pianificazione ti consentono di controllare quali nodi del cluster eseguono le tue macchine virtuali (VM) nel runtime VM su GDC. Ad esempio, puoi utilizzare selettori di nodi o regole di affinità per eseguire le VM su nodi con hardware specifico oppure regole di anti-affinità per distribuire le VM tra i nodi per l'alta affidabilità.

Prima di iniziare

Per completare questo documento, devi avere accesso alle seguenti risorse:

Panoramica delle configurazioni di pianificazione

Le configurazioni di pianificazione sono valori facoltativi in VM Runtime on GDC. Se non viene specificata alcuna configurazione di pianificazione, la VM adotta il comportamento di pianificazione predefinito di Kubernetes.

Con il comportamento di pianificazione predefinito, le VM vengono distribuite nel cluster. Lo scheduler esamina l'attuale disponibilità di risorse dei nodi, come CPU e memoria, e pianifica le VM sui nodi per distribuire le richieste di computing. Se non hai requisiti specifici, non è necessario definire alcuna configurazione di pianificazione.

Per pianificare le VM sono disponibili i seguenti tre campi:

  • nodeSelector: specifica le etichette dei nodi che il nodo host di una VM deve avere. VM Runtime on 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. Puoi definire un requisito flessibile o rigido per lo scheduler:
    • preferredDuringSchedulingIgnoredDuringExecution: è un requisito facoltativo. Lo scheduler 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 imprescindibile. Lo scheduler tenta di soddisfare la tua richiesta. Se non sono disponibili nodi che corrispondono ai tuoi requisiti, la VM non viene pianificata.
  • Tolerations: consente di pianificare la VM su nodi con taint corrispondenti.

Puoi definire una qualsiasi di queste configurazioni di pianificazione per supportare i tuoi workload di computing 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 saperne di più 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 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 rigido. Se non è disponibile alcun nodo che soddisfi la configurazione di pianificazione, la VM non può essere pianificata.

  1. Crea un manifest VirtualMachine, ad esempio my-scheduled-vm.yaml, nell'editor che preferisci:

    nano my-scheduled-vm.yaml
    
  2. 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 saperne di più, consulta Crea un disco di avvio della VM.

  3. Salva e chiudi il manifest della VM nell'editor.

  4. Crea la VM e la configurazione della pianificazione utilizzando kubectl:

    kubectl apply -f my-scheduled-vm.yaml
    

Affinità

Il seguente manifest VirtualMachine utilizza l'affinità per un requisito di pianificazione flessibile. Lo scheduler tenta di soddisfare la tua richiesta. Se lo scheduler non può soddisfare la richiesta, la VM viene pianificata su un nodo non preferito.

  1. Crea un manifest VirtualMachine, ad esempio my-scheduled-vm.yaml, nell'editor che preferisci:

    nano my-scheduled-vm.yaml
    
  2. 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 saperne di più, consulta Crea un disco di avvio della VM.

  3. Salva e chiudi il manifest della VM nell'editor.

  4. Crea la VM e la configurazione della pianificazione utilizzando kubectl:

    kubectl apply -f my-scheduled-vm.yaml
    

Non posizionare 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 flessibile. Lo scheduler tenta di soddisfare la tua richiesta. Se lo scheduler non può soddisfare la richiesta, la VM potrebbe essere pianificata su un nodo inappropriato.

  1. Crea un manifest VirtualMachine, ad esempio my-scheduled-vm.yaml, nell'editor che preferisci:

    nano my-scheduled-vm.yaml
    
  2. 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 saperne di più, consulta Crea un disco di avvio della VM.

  3. Salva e chiudi il manifest della VM nell'editor.

  4. Crea la VM e la configurazione della pianificazione utilizzando kubectl:

    kubectl apply -f my-scheduled-vm.yaml
    

Tieni separate le VM

I workload di computing 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 flessibile. Lo scheduler tenta di soddisfare la tua richiesta. Se lo scheduler non può soddisfare la richiesta, la VM potrebbe essere pianificata su un nodo inappropriato.

  1. Crea un manifest VirtualMachine, ad esempio my-scheduled-vm.yaml, nell'editor che preferisci:

    nano my-scheduled-vm.yaml
    
  2. 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'etichetta key:value da applicare alle VM che vuoi pianificare su nodi diversi. Per saperne di più, consulta Etichette e selettori.

    Il disco di avvio denominato VM_NAME-boot-dv deve esistere già. Per saperne di più, consulta Crea un disco di avvio della VM.

  3. Salva e chiudi il manifest della VM nell'editor.

  4. Crea la VM e la configurazione della pianificazione utilizzando kubectl:

    kubectl apply -f my-scheduled-vm.yaml
    

Mantieni le VM insieme

I workload di computing 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 flessibile. Lo scheduler tenta di soddisfare la tua richiesta. Se lo scheduler non può soddisfare la richiesta, la VM potrebbe essere pianificata su un nodo inappropriato.

  1. Crea un manifest VirtualMachine, ad esempio my-scheduled-vm.yaml, nell'editor che preferisci:

    nano my-scheduled-vm.yaml
    
  2. 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 etichette key:value da applicare alle VM che vuoi pianificare su nodi diversi. Per saperne di più, consulta Etichette e selettori.

    Il disco di avvio denominato VM_NAME-boot-dv deve esistere già. Per saperne di più, consulta Crea un disco di avvio della VM.

  3. Salva e chiudi il manifest della VM nell'editor.

  4. Crea la VM e la configurazione della pianificazione utilizzando kubectl:

    kubectl apply -f my-scheduled-vm.yaml
    

Pianifica le VM su nodi con incompatibilità

Le incompatibilità sono una proprietà di pianificazione che consente ai nodi di consentire solo alle VM con tolleranze specificate di essere pianificate per l'esecuzione su di essi. Puoi applicare un taint a un nodo, quindi definire una tolleranza nel manifest VirtualMachine per consentire alla VM di essere eseguita sul nodo. Per saperne di più, consulta Taint e tolleranze.

  1. Crea un manifest VirtualMachine, ad esempio my-scheduled-vm.yaml, nell'editor che preferisci:

    nano my-scheduled-vm.yaml
    
  2. 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 alla contaminazione sul nodo.
    • KEY_VALUE: il valore della chiave per la tolleranza che corrisponde alla contaminazione sul nodo.

    Il disco di avvio denominato VM_NAME-boot-dv deve esistere già. Per saperne di più, consulta Crea un disco di avvio della VM.

  3. Salva e chiudi il manifest della VM nell'editor.

  4. Crea la VM e la configurazione della pianificazione utilizzando kubectl:

    kubectl apply -f my-scheduled-vm.yaml
    

Passaggi successivi