Pianificare le VM che utilizzano Anthos VM Runtime

Questo documento è destinato a proprietari di applicazioni e 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 questo documento, devi accedere alle seguenti risorse:

Panoramica della configurazione delle pianificazioni

Le configurazioni di pianificazione sono valori facoltativi nel runtime VM di Anthos. Se non viene specificata alcuna configurazione della pianificazione, per impostazione predefinita la VM utilizza il comportamento di pianificazione predefinito di Kubernetes.

Con il comportamento di pianificazione predefinito, le VM sono distribuite in tutto il cluster. Lo scheduler controlla la disponibilità attuale delle risorse 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 della pianificazione.

Per pianificare le VM sono disponibili i seguenti tre campi:

  • nodeSelector: specifica le etichette dei nodi del nodo host di una VM. Anthos VM Runtime pianifica la VM solo sui nodi con 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 cerca di soddisfare la tua richiesta. Se lo scheduler non può soddisfare la richiesta, è possibile che la VM venga pianificata su un nodo non preferito.
    • requiredDuringSchedulingIgnoredDuringExecution: un requisito rigido. Lo scheduler cerca di soddisfare la tua richiesta. Se non sono disponibili nodi corrispondenti al tuo requisito, la VM non viene pianificata.
  • Tolerations: consente di pianificare la VM su nodi con incompatibilità corrispondenti.

Puoi definire una qualsiasi di queste configurazioni di pianificazione per supportare i tuoi carichi di lavoro e le tue esigenze di pianificazione. Oltre alla pianificazione delle configurazioni, la pianificazione delle VM dipende dalle risorse disponibili.

Anthos VM Runtime utilizza la stessa logica di pianificazione delle VM e la stessa struttura dei manifest di Kubernetes per assegnare pod ai nodi. Per ulteriori informazioni su queste configurazioni di pianificazione, consulta i seguenti link:

Inserisci 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 volere un particolare chip CPU o il supporto della GPU. Puoi utilizzare una regola di base nodeSelector o regole di affinità più flessibili per pianificare l'esecuzione delle VM su questi nodi.

Selettore node

Il seguente file manifest VirtualMachine utilizza un valore nodeSelector per un requisito di pianificazione rigida. Se non è disponibile alcun nodo che soddisfi la configurazione della pianificazione, non è possibile pianificare la VM.

  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 tua 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 VM.

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

  4. 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 cerca di soddisfare la tua richiesta. Se lo scheduler non può rispettare 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 tua 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 VM.

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

  4. Crea la VM e pianifica la configurazione utilizzando kubectl:

    kubectl apply -f my-scheduled-vm.yaml
    

Non inserire 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 cerca di soddisfare la tua richiesta. Se lo scheduler non può rispettare 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 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 Creare un disco di avvio VM.

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

  4. Crea la VM e pianifica la configurazione utilizzando kubectl:

    kubectl apply -f my-scheduled-vm.yaml
    

Mantieni separate le VM

Le tue VM di calcolo potrebbero avere VM che dovrebbero essere distribuite tra i nodi per una disponibilità elevata, ad esempio un pool di VM frontend. Puoi utilizzare le regole di anti-affinità tra VM per evitare di pianificare insieme le VM sui nodi.

Il seguente manifest VirtualMachine utilizza l'affinità per un requisito di pianificazione soft. Lo scheduler cerca di soddisfare la tua richiesta. Se lo scheduler non può rispettare 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 tua VM.
    • KEY:VALUE: l'etichetta key:value da applicare alle VM che vuoi pianificare su nodi diversi. Per ulteriori informazioni, consulta Etichette e selettori.

    Il disco di avvio denominato VM_NAME-boot-dv deve già esistere. Per ulteriori informazioni, consulta Creare un disco di avvio VM.

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

  4. Crea la VM e pianifica la configurazione utilizzando kubectl:

    kubectl apply -f my-scheduled-vm.yaml
    

Mantieni le VM unite

I carichi di lavoro di computing potrebbero avere VM che devono essere mantenute insieme sui nodi per ridurre la latenza, ad esempio un livello middleware e di un 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 cerca di soddisfare la tua richiesta. Se lo scheduler non può rispettare 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 tua VM.
    • KEY:VALUE: la coppia di etichette key: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 già esistere. Per ulteriori informazioni, consulta Creare un disco di avvio VM.

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

  4. 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 le 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.

  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 tua VM.
    • KEY_NAME: il nome della chiave della tolleranza che corrisponde all'incompatibilità del nodo.
    • KEY_VALUE: il valore della chiave per la tua tolleranza che corrisponde all'incompatibilità del nodo.

    Il disco di avvio denominato VM_NAME-boot-dv deve già esistere. Per ulteriori informazioni, consulta Creare un disco di avvio VM.

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

  4. Crea la VM e pianifica la configurazione utilizzando kubectl:

    kubectl apply -f my-scheduled-vm.yaml
    

Passaggi successivi