Pianificare le VM che utilizzano il runtime VM su GDC

Questo documento è rivolto ai proprietari di applicazioni e agli amministratori di piattaforma che eseguono Google Distributed Cloud. Questo documento mostra come utilizzare la pianificazione come affinità e anti-affinità per le VM che utilizzano Runtime VM su GDC.

Prima di iniziare

Per completare questo documento, devi disporre dell'accesso alle seguenti risorse:

Panoramica delle configurazioni della pianificazione

Le configurazioni di pianificazione sono valori facoltativi nel runtime VM su GDC. Se non è specificata alcuna configurazione di pianificazione, la VM viene impostata sul valore predefinito di Kubernetes comportamento di pianificazione.

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 il nodo host di una VM deve avere. Il runtime VM su GDC pianifica la VM solo sui nodi con dell'etichetta specificata.
  • Affinità: specifica le regole di affinità della VM. Include i nodi e affinità o anti-affinità tra VM. Definisci una risposta soft o hard requisito per lo scheduler:
    • preferredDuringSchedulingIgnoredDuringExecution: è un requisito non flessibile. Lo scheduler cerca 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 fondamentale. Il programmatore tenta di soddisfare la tua richiesta. Se non sono disponibili nodi, in base alle tue esigenze, 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 il calcolo carichi di lavoro e 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 lo stesso manifest una struttura di Kubernetes assegnare pod ai nodi. Per ulteriori informazioni su queste configurazioni di pianificazione, consulta quanto segue. Link:

Posiziona le VM su un nodo specifico

Se hai nodi con configurazioni hardware specifiche, puoi pianificare le VM in modo che sia eseguito solo su questi nodi. Ad esempio, la tua VM potrebbe volere una un chipset o necessitano del supporto GPU. Puoi utilizzare nodeSelector di base o altro regole di affinità flessibile, 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.

  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 esistere già. Per ulteriori informazioni, vedi Crea un disco di avvio per una 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 una pianificazione flessibile requisito. Lo scheduler cerca di soddisfare la tua richiesta. Se lo scheduler non riesce la VM è pianificata su un nodo non preferito.

  1. Crea un file 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 esistere già. Per ulteriori informazioni, consulta Creare un disco di avvio della 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 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 una pianificazione flessibile requisito. 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.

  1. Crea un file 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 esistono già. Per ulteriori informazioni, vedi Crea un disco di avvio per una 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

I 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.

  1. Crea un file 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 ulteriori informazioni, consulta Etichette e selettori.

    Il disco di avvio denominato VM_NAME-boot-dv deve esistono già. Per ulteriori informazioni, vedi Crea un disco di avvio per una 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
    

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 una pianificazione flessibile requisito. 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.

  1. Crea un file 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 diversi nodi. Per maggiori informazioni le informazioni, vedi Etichette e selettori.

    Il disco di avvio denominato VM_NAME-boot-dv deve esistono già. Per ulteriori informazioni, consulta Creare un disco di avvio della 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
    

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, nel manifest VirtualMachine definisci una tolleranza per consentire l'esecuzione della VM nel nodo. Per ulteriori informazioni, vedi Incompatibilità e tolleranze.

  1. Crea un manifest VirtualMachine, ad esempio my-scheduled-vm.yaml,,nella un editor di tua scelta:

    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 all'incompatibilità 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 esistono già. Per ulteriori informazioni, consulta Creare un disco di avvio della 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