Configura la separazione dei carichi di lavoro in GKE


Questa pagina mostra come comunicare a Google Kubernetes Engine (GKE) di pianificare i pod insieme, separatamente o in località specifiche.

La separazione dei carichi di lavoro consente di utilizzare incompatibilità e tolleranze per indicare a GKE di separare i pod in nodi diversi, posizionare i pod su nodi che soddisfano criteri specifici o di pianificare carichi di lavoro specifici insieme. Ciò che devi fare per configurare la separazione dei carichi di lavoro dipende dalla configurazione del cluster GKE. La seguente tabella descrive le differenze:

Configurazione della separazione dei carichi di lavoro

Aggiungi una tolleranza per una specifica coppia chiave-valore alla specifica del pod e seleziona quella coppia chiave-valore utilizzando un nodeSelector. GKE crea nodi, applica l'incompatibilità dei nodi corrispondente e pianifica il pod sul nodo.

Per le istruzioni, consulta Separare i carichi di lavoro nei cluster Autopilot in questa pagina.

Standard senza provisioning automatico dei nodi
  1. Crea un pool di nodi con un'incompatibilità dei nodi e un'etichetta del nodo
  2. Aggiungi una tolleranza per quell'incompatibilità alla specifica del pod

Per le istruzioni, consulta Isolare i carichi di lavoro in pool di nodi dedicati.

Questa guida utilizza uno scenario di esempio in cui hai due carichi di lavoro, un job batch e un server web, che vuoi separare l'uno dall'altro.

Quando utilizzare la separazione dei carichi di lavoro in GKE

La separazione dei carichi di lavoro è utile quando hai carichi di lavoro che eseguono ruoli diversi e non devono essere eseguiti sulle stesse macchine sottostanti. Ecco alcuni scenari di esempio:

  • Hai un carico di lavoro del coordinatore batch che crea job che vuoi mantenere separati.
  • Esegui un server di gioco con un carico di lavoro di selezione che vuoi separare dai pod di sessione.
  • Vuoi separare le parti dello stack l'una dall'altra, ad esempio separando un server da un database.
  • Vuoi separare alcuni carichi di lavoro per motivi di conformità o relativi ai criteri.

Prezzi

Nei cluster Autopilot, ti vengono addebitate le risorse richieste dai tuoi pod durante l'esecuzione. Per maggiori dettagli, consulta la sezione Prezzi di Autopilot. I pod che utilizzano la separazione dei carichi di lavoro hanno richieste di risorse minime più elevate rispetto ai pod normali.

Nei cluster standard, il costo ti viene addebitato in base alla configurazione hardware e alle dimensioni di ciascun nodo, a prescindere dal fatto che i pod siano in esecuzione sui nodi. Per i dettagli, consulta la sezione Prezzi standard.

Prima di iniziare

Prima di iniziare, assicurati di aver eseguito le seguenti attività:

  • Abilita l'API Google Kubernetes Engine.
  • Abilita l'API Google Kubernetes Engine
  • Se vuoi utilizzare Google Cloud CLI per questa attività, installa e initialize gcloud CLI. Se hai già installato gcloud CLI, scarica la versione più recente eseguendo gcloud components update.

Separa i carichi di lavoro nei cluster Autopilot

Per separare i carichi di lavoro l'uno dall'altro, aggiungi una tolleranza e un selettore di nodi a ogni specifica del carico di lavoro che definisce il nodo su cui deve eseguire il carico di lavoro. Questo metodo funziona anche su cluster Standard in cui è abilitato il provisioning automatico dei nodi.

  1. Salva il seguente manifest con il nome web-server.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: web-server
    spec:
      replicas: 6
      selector:
        matchLabels:
          pod: nginx-pod
      template:
        metadata:
          labels:
            pod: nginx-pod
        spec:
          tolerations:
          - key: group
            operator: Equal
            value: "servers"
            effect: NoSchedule
          nodeSelector:
            group: "servers"
          containers:
          - name: web-server
            image: nginx
    

    Questo file manifest include i seguenti campi:

    • spec.tolerations: GKE può posizionare i pod su nodi che presentano l'incompatibilità group=servers:NoSchedule. GKE non può pianificare pod che non hanno questa tolleranza su questi nodi.
    • spec.nodeSelector: GKE deve posizionare i pod su nodi che hanno l'etichetta nodo group: servers.

    GKE aggiunge le etichette e le incompatibilità corrispondenti ai nodi di cui GKE esegue automaticamente il provisioning per l'esecuzione di questi pod.

  2. Salva il seguente manifest con il nome batch-job.yaml:

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: batch-job
    spec:
      completions: 5
      backoffLimit: 3
      ttlSecondsAfterFinished: 120
      template:
        metadata:
          labels:
            pod: pi-pod
        spec:
          restartPolicy: Never
          tolerations:
          - key: group
            operator: Equal
            value: "jobs"
            effect: NoSchedule
          nodeSelector:
            group: "jobs"
          containers:
          - name: pi
            image: perl
            command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
    

    Questo file manifest include i seguenti campi:

    • spec.tolerations: GKE può posizionare i pod su nodi che presentano l'incompatibilità group=jobs:NoSchedule. GKE non può pianificare pod che non hanno questa tolleranza su questi nodi.
    • spec.nodeSelector: GKE deve posizionare i pod su nodi che hanno l'etichetta nodo group: jobs.

    GKE aggiunge le etichette e le incompatibilità corrispondenti ai nodi di cui GKE esegue automaticamente il provisioning per l'esecuzione di questi pod.

  3. Esegui il deployment dei carichi di lavoro:

    kubectl apply -f batch-job.yaml web-server.yaml
    

Quando esegui il deployment dei carichi di lavoro, GKE esegue le seguenti operazioni per ogni carico di lavoro:

  1. GKE cerca i nodi esistenti con l'incompatibilità dei nodi e l'etichetta dei nodi corrispondenti specificati nel manifest. Se i nodi esistono e dispongono di risorse, GKE pianifica il carico di lavoro sul nodo.
  2. Se GKE non trova un nodo esistente idoneo per pianificare il carico di lavoro, GKE crea un nuovo nodo e applica l'incompatibilità dei nodi e l'etichetta del nodo corrispondenti in base al manifest. GKE posiziona il pod sul nuovo nodo.

La presenza dell'effetto NoSchedule nell'incompatibilità dei nodi assicura che i carichi di lavoro senza una tolleranza non vengano posizionati sul nodo.

Verifica la separazione dei carichi di lavoro

Elenca i tuoi pod per trovare i nomi dei nodi:

kubectl get pods --output=wide

L'output è simile al seguente:

NAME                          READY   ...   NODE
batch-job-28j9h               0/1     ...   gk3-sandbox-autopilot-nap-1hzelof0-ed737889-2m59
batch-job-78rcn               0/1     ...   gk3-sandbox-autopilot-nap-1hzelof0-ed737889-2m59
batch-job-gg4x2               0/1     ...   gk3-sandbox-autopilot-nap-1hzelof0-ed737889-2m59
batch-job-qgsxh               0/1     ...   gk3-sandbox-autopilot-nap-1hzelof0-ed737889-2m59
batch-job-v4ksf               0/1     ...   gk3-sandbox-autopilot-nap-1hzelof0-ed737889-2m59
web-server-6bb8cd79b5-dw4ds   1/1     ...   gk3-sandbox-autopilot-nap-1eurxgsq-f2f3c272-n6xm
web-server-6bb8cd79b5-g5ld6   1/1     ...   gk3-sandbox-autopilot-nap-1eurxgsq-9f447e18-275z
web-server-6bb8cd79b5-jcdx5   1/1     ...   gk3-sandbox-autopilot-nap-1eurxgsq-9f447e18-275z
web-server-6bb8cd79b5-pxdzw   1/1     ...   gk3-sandbox-autopilot-nap-1eurxgsq-ccd22fd9-qtfq
web-server-6bb8cd79b5-s66rw   1/1     ...   gk3-sandbox-autopilot-nap-1eurxgsq-ccd22fd9-qtfq
web-server-6bb8cd79b5-zq8hh   1/1     ...   gk3-sandbox-autopilot-nap-1eurxgsq-f2f3c272-n6xm

Questo output mostra che i pod batch-job e i pod web-server vengono sempre eseguiti su nodi diversi.

Limitazioni della separazione dei carichi di lavoro con incompatibilità e tolleranze

Non puoi utilizzare i seguenti prefissi delle chiavi per la separazione dei carichi di lavoro:

  • Chiavi specifiche per GKE e Kubernetes
  • *cloud.google.com/
  • *kubelet.kubernetes.io/
  • *node.kubernetes.io/

Ti consigliamo di utilizzare chiavi personalizzate e univoche per separare i carichi di lavoro.

Separa i carichi di lavoro nei cluster Standard senza provisioning automatico dei nodi

La separazione dei carichi di lavoro nei cluster Standard senza provisioning automatico dei nodi richiede la creazione manuale di pool di nodi con le incompatibilità dei nodi e le etichette dei nodi appropriate per supportare i carichi di lavoro. Per le istruzioni, consulta Isolare i carichi di lavoro in pool di nodi dedicati. Utilizza questo approccio solo se hai requisiti specifici che richiedono la gestione manuale dei pool di nodi.

Passaggi successivi