Controllo della pianificazione con le incompatibilità dei nodi

Mantieni tutto organizzato con le raccolte Salva e classifica i contenuti in base alle tue preferenze.

Questa pagina fornisce una panoramica delle incompatibilità dei nodi in Google Kubernetes Engine (GKE). Quando pianifichi il deployment dei carichi di lavoro sul cluster, le incompatibilità dei nodi ti aiutano a controllare su quali nodi è consentita l'esecuzione.

Panoramica

Quando invii un carico di lavoro da eseguire in un cluster, lo scheduler determina dove posizionare i pod associati al carico di lavoro. Lo scheduler può posizionare un pod su qualsiasi nodo che soddisfi i requisiti di CPU, memoria e risorse personalizzate del pod.

Se il tuo cluster esegue diversi carichi di lavoro, potresti voler esercitare un controllo su quali carichi di lavoro possono essere eseguiti su un particolare pool di nodi.

Un'incompatibilità dei nodi ti consente di contrassegnare un nodo in modo che lo scheduler eviti o impedisci l'utilizzo per alcuni pod. Una funzionalità complementare, le tolleranze, consente di designare pod che possono essere utilizzati su nodi "incompatibili".

Incompatibilità e tolleranze funzionano insieme per garantire che i pod non siano pianificati su nodi inappropriati.

le incompatibilità sono coppie chiave-valore associate a un effect. Nella tabella seguente sono elencati gli effetti disponibili:

Effetto Descrizione
NoSchedule I pod che non tollerano questa incompatibilità non vengono pianificati sul nodo; i pod esistenti non vengono rimossi dal nodo.
PreferNoSchedule Kubernetes evita di pianificare pod che non tollerano questa incompatibilità sul nodo.
NoExecute Il pod viene rimosso dal nodo se è già in esecuzione sul nodo, mentre non viene pianificato sul nodo se non è ancora in esecuzione sul nodo stesso.

Vantaggi dell'impostazione di incompatibilità dei nodi in GKE

Puoi aggiungere le incompatibilità dei nodi a cluster e nodi in GKE o utilizzando il comando kubectl taint. Specificare le incompatibilità dei nodi in GKE offre numerosi vantaggi rispetto a kubectl:

  • le incompatibilità vengono conservate quando un nodo viene riavviato o sostituito.
  • le incompatibilità vengono create automaticamente quando viene aggiunto un nodo a un pool di nodi o a un cluster.
  • le incompatibilità vengono create automaticamente durante la scalabilità automatica del cluster.

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 poi inizializza l'interfaccia a riga di comando gcloud.

Crea un cluster con incompatibilità dei nodi

Quando crei un cluster in GKE, puoi assegnare incompatibilità ai nodi al cluster. Le incompatibilità vengono assegnate a tutti i nodi creati con il cluster.

Se crei un cluster standard con incompatibilità dei nodi che hanno l'effetto NoSchedule o NoExecute, GKE non può pianificare alcuni componenti gestiti da GKE, come kube-dns o metrics-server nel pool di nodi predefinito che GKE crea quando crei il cluster. GKE non può pianificare questi componenti perché non hanno le tolleranze corrispondenti per le incompatibilità dei nodi. Devi aggiungere un nuovo pool di nodi che soddisfi una delle seguenti condizioni:

  • Nessuna incompatibilità
  • Un'incompatibilità che ha l'effetto PreferNoSchedule
  • L'incompatibilità di components.gke.io/gke-managed-components=:NoSchedule

Ognuna di queste condizioni consente a GKE di pianificare i componenti gestiti da GKE nel nuovo pool di nodi.

Per istruzioni, consulta Isolare i carichi di lavoro su nodi dedicati.

gcloud

Per creare un cluster con incompatibilità dei nodi, esegui il comando seguente:

gcloud container clusters create CLUSTER_NAME \
    --node-taints KEY=VALUE:EFFECT

Sostituisci quanto segue:

  • CLUSTER_NAME: il nome del nuovo cluster.
  • EFFECT: uno dei seguenti valori effettivi: PreferNoSchedule, NoSchedule o NoExecute.
  • KEY=VALUE: una coppia chiave-valore associata a EFFECT.

Ad esempio, il comando seguente applica un'incompatibilità con una coppia chiave-valore di dedicated=experimental con un effetto di PreferNoSchedule:

gcloud container clusters create example-cluster \
    --node-taints dedicated=experimental:PreferNoSchedule

console

Per creare un cluster con incompatibilità dei nodi:

  1. Vai alla pagina Google Kubernetes Engine in Google Cloud Console.

    Vai a Google Kubernetes Engine

  2. Fai clic su Crea.

  3. Configura il cluster come preferisci.

  4. Nel riquadro di navigazione, in Pool di nodi, espandi il pool di nodi che vuoi modificare, quindi fai clic su Metadati.

  5. Nella sezione Incompatibilità dei nodi, fai clic su Aggiungi incompatibilità.

  6. Nell'elenco a discesa Effetto, seleziona l'effetto che vuoi.

  7. Inserisci la coppia chiave-valore desiderata nei campi Chiave e Valore.

  8. Fai clic su Crea.

Server

Quando utilizzi l'API per creare un cluster, includi il campo nodeTaints in nodeConfig. Ecco un esempio:

POST https://container.googleapis.com/v1/projects/PROJECT_ID/zones/COMPUTE_ZONE/clusters

{
  'cluster': {
    'name': 'example-cluster',
    'nodeConfig': {
      'nodeTaints': [
        {
          'key': 'special',
          'Value': 'gpu',
          'effect': 'PreferNoSchedule'
        }
      ]
      ...
    }
    ...
  }
}

Crea un pool di nodi con incompatibilità dei nodi

Quando applichi un'incompatibilità a un nodo, è possibile eseguire sul pod solo i pod che tollerano l'incompatibilità. In un cluster GKE, puoi applicare un'incompatibilità a un pool di nodi, che applica l'incompatibilità a tutti i nodi nel pool.

Per creare un pool di nodi con incompatibilità dei nodi, puoi utilizzare l'interfaccia a riga di comando di Google Cloud, Google Cloud Console o l'API GKE.

gcloud

Per creare un pool di nodi con incompatibilità dei nodi, esegui il comando seguente:

gcloud container node-pools create POOL_NAME \
    --cluster CLUSTER_NAME \
    --node-taints KEY=VALUE:EFFECT

Sostituisci quanto segue:

  • POOL_NAME: il nome del pool di nodi da creare.
  • CLUSTER_NAME: il nome del cluster in cui viene creato il pool di nodi.
  • EFFECT: uno dei seguenti valori effettivi: PreferNoSchedule, NoSchedule o NoExecute.
  • KEY=VALUE: una coppia chiave-valore associata a EFFECT.

Ad esempio, il comando seguente crea un pool di nodi su un cluster esistente e applica un'incompatibilità con una coppia chiave-valore dedicated=experimental con un effetto NoSchedule:

gcloud container node-pools create example-pool --cluster example-cluster \
    --node-taints dedicated=experimental:NoSchedule

Questo comando crea un pool di nodi e applica un'incompatibilità con una coppia chiave-valore di special=gpu con un effetto NoExecute:

gcloud container node-pools create example-pool-2 --cluster example-cluster \
    --node-taints special=gpu:NoExecute

console

Per creare un pool di nodi con incompatibilità dei nodi, segui questi passaggi:

  1. Vai alla pagina Google Kubernetes Engine in Google Cloud Console.

    Vai a Google Kubernetes Engine

  2. Nell'elenco dei cluster, fai clic sul nome del cluster da modificare.

  3. Nella pagina Dettagli cluster, fai clic su Aggiungi pool di nodi.

  4. Nel riquadro di navigazione, fai clic su Metadati.

  5. In Incompatibilità dei nodi, fai clic su Aggiungi incompatibilità.

  6. Seleziona l'effetto che vuoi nell'elenco a discesa Effetto.

  7. Inserisci la coppia chiave-valore desiderata nei campi Chiave e Valore.

  8. Fai clic su Crea.

Server

Quando utilizzi l'API per creare un pool di nodi, includi il campo nodeTaints in nodeConfig. Ecco un esempio:

POST https://container.googleapis.com/v1/projects/PROJECT_ID/zones/COMPUTE_ZONE/clusters/CLUSTER_ID/nodePools

{
  'nodePool': {
    'name': 'example-pool',
    'nodeConfig': {
      'nodeTaints': [
        {
          'key': 'dedicated',
          'Value': 'experimental',
          'effect': 'NoSchedule'
        }
      ]
      ...
    }
    ...
  }
}

Configurare i pod per tollerare un'incompatibilità

Puoi configurare i pod per tollerare un'incompatibilità includendo il campo tolerations nella specifica dei pod. Ecco una parte di una specifica del pod.

Puoi pianificare questo pod su un nodo che ha l'incompatibilità dedicated=experimental:NoSchedule:

tolerations:
- key: dedicated
  operator: Equal
  value: experimental
  effect: NoSchedule

Aggiungere un'incompatibilità a un nodo esistente

Puoi aggiungere le incompatibilità a un nodo esistente utilizzando il comando kubectl taint:

kubectl taint nodes NODE_NAME KEY=VALUE:EFFECT

Ad esempio, il comando seguente applica un'incompatibilità con una coppia chiave-valore di dedicated=experimental con un effetto NoSchedule al nodo mynode:

kubectl taint nodes mynode dedicated=experimental:NoSchedule

Puoi anche aggiungere incompatibilità ai nodi con un'etichetta specifica utilizzando il selettore -l insieme all'etichetta e al valore specificati:

kubectl taint nodes -l LABEL=LABEL_VALUE KEY=VALUE:EFFECT

Ad esempio, il comando seguente aggiunge un'incompatibilità con la chiave dedicated-pool ai nodi GKE nel pool di nodi my_pool:

kubectl taint nodes -l cloud.google.com/gke-nodepool=my_pool dedicated-pool=my_pool:NoSchedule

Controlla le incompatibilità per un nodo

Per visualizzare le incompatibilità per un nodo, utilizza lo strumento a riga di comando kubectl.

  1. Ottieni un elenco di tutti i nodi nel cluster eseguendo questo comando:

    kubectl get nodes
    
  2. Ispeziona un nodo eseguendo questo comando:

    kubectl describe node NODE_NAME
    
  3. Nell'output restituito, cerca il campo Taints. L'output è simile al seguente:

    Taints:  dedicated-pool=mypool:NoSchedule
    

Rimuovere un'incompatibilità da un nodo

Puoi usare kubectl taint per rimuovere le incompatibilità. Puoi rimuovere le incompatibilità in base a chiave, coppia chiave-valore o effetto chiave.

Ad esempio, il seguente comando rimuove tutte le incompatibilità con la chiave dedicated dal nodo mynode:

kubectl taint nodes mynode dedicated-

Rimuovi tutte le incompatibilità da un pool di nodi

Per rimuovere tutte le incompatibilità da un pool di nodi, esegui il comando seguente:

gcloud beta container node-pools update POOL_NAME \
--node-taints="" \
--cluster=CLUSTER_NAME

Sostituisci quanto segue:

  • POOL_NAME: il nome del pool di nodi da modificare.
  • CLUSTER_NAME: il nome del cluster in cui è stato creato il pool di nodi.

Passaggi successivi