Controlar a programação com taints de nó


Nesta página, você terá uma visão geral dos taints de nós no Google Kubernetes Engine (GKE). Os taints de nó ajudam a especificar os nós em que as cargas de trabalho precisam ser executadas.

Os clusters do Autopilot são compatíveis com o uso de taints de nó somente para separação de cargas de trabalho. Para instruções, consulte Configurar a separação de cargas de trabalho no GKE.

Informações gerais

Quando você envia uma carga de trabalho para executar em um cluster, o programador determina onde colocar os pods associados à carga de trabalho. O programador é livre para colocar um pod em qualquer node que satisfaça os requisitos de recursos personalizados, de CPU e de memória do pod.

Se o cluster executa várias cargas de trabalho, convém exercer um controle sobre quais cargas de trabalho podem ser executadas em um pool de nós em particular.

Com um taint de node, você marca um node para que o programador evite ou impeça o uso dele em determinados pods. Com o recurso adicional tolerâncias, você designa pods que podem ser usados em nós com taint.

Os taints e as tolerâncias trabalham juntos para garantir que os pods não sejam programados em nós inadequados.

Os taints de node são pares de chave-valor associados a um efeito. A tabela a seguir lista os efeitos disponíveis:

Efeito Descrição
NoSchedule Pods que não toleram esse taint não são programados no nó. Os pods atuais não são removidos do nó.
PreferNoSchedule O Kubernetes evita a programação de pods que não toleram esse taint no nó.
NoExecute O pod é removido do nó caso já esteja em execução nele e não é programado no nó caso ainda não esteja em execução nele.

Vantagens de definir taints de nó no GKE

É possível adicionar taints de nó a clusters e nós no GKE ou usando o comando kubectl taint. A especificação de taints de nó no GKE oferece muitas vantagens em comparação a kubectl:

  • Os taints são preservados quando um nó é reiniciado ou substituído.
  • Os taints são criados automaticamente quando um nó é adicionado a um pool de nós ou cluster.
  • Os taints são criados automaticamente durante o escalonamento automático do cluster.

Antes de começar

Antes de começar, verifique se você realizou as tarefas a seguir:

  • Ativar a API Google Kubernetes Engine.
  • Ativar a API Google Kubernetes Engine
  • Se você quiser usar a Google Cloud CLI para essa tarefa, instale e, em seguida, inicialize a CLI gcloud. Se você instalou a CLI gcloud anteriormente, instale a versão mais recente executando gcloud components update.

Criar um cluster com taints de nó

Quando você cria um cluster no GKE, é possível atribuir taints de nó a ele. Isso atribui os taints a todos os nós criados com o cluster.

Se você criar um cluster Padrão com taints de nós que têm o efeito NoSchedule ou NoExecute, o GKE não poderá programar alguns componentes gerenciados pelo GKE, como kube-dns ou metrics-server, no pool de nós padrão que o GKE cria quando você cria o cluster. O GKE não pode programar esses componentes porque eles não têm as tolerâncias correspondentes para os taints de nós. Você precisa adicionar um novo pool de nós que atende a uma destas condições:

  • Sem taints
  • Um taint com o efeito PreferNoSchedule
  • O taint components.gke.io/gke-managed-components=true:NoSchedule

Qualquer uma dessas condições permite que o GKE programe componentes gerenciados pelo GKE no novo pool de nós.

Para instruções, consulte Isolar cargas de trabalho em nós dedicados.

gcloud

Para criar um cluster com taints de nó, execute o comando a seguir:

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

Substitua:

  • CLUSTER_NAME: o nome do novo cluster;
  • EFFECT: um dos seguintes valores de efeito: PreferNoSchedule, NoSchedule ou NoExecute;
  • KEY=VALUE: um par de chave-valor associado ao EFFECT.

Por exemplo, o comando a seguir aplica um taint que tem valor-chave dedicated=experimental com efeito de PreferNoSchedule:

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

Console

Para criar um cluster com taints de nó:

  1. Acesse a página Google Kubernetes Engine no Console do Google Cloud.

    Acessar o Google Kubernetes Engine

  2. Clique em Criar.

  3. Configure o cluster como quiser.

  4. No painel de navegação, em Pools de nós, expanda o pool de nós que você quer modificar e clique em Metadados.

  5. Na seção Taints de nó, clique em Adicionar taint.

  6. Na lista suspensa Efeito, selecione o efeito pretendido.

  7. Insira o par de chave-valor pretendido nos campos Chave e Valor.

  8. Clique em Criar.

API

Ao usar a API para criar um cluster, inclua o campo nodeTaints em nodeConfig. Veja um exemplo:

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'
        }
      ]
      ...
    }
    ...
  }
}

Criar um pool de nós com taints de nó

Quando você aplica um taint a um nó, somente pods que toleram o taint podem ser executados no nó. Em um cluster do GKE, é possível aplicar um taint a um pool de nós, o que aplica o taint a todos os nós no pool.

Para criar um pool de nós com taints de nó, use a Google Cloud CLI, o console do Google Cloud ou a API GKE.

gcloud

Para criar um pool de nós com taints de nó, execute o comando a seguir:

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

Substitua:

  • POOL_NAME: o nome do pool de nós a ser criado;
  • CLUSTER_NAME: o nome do cluster em que o pool de nós será criado.
  • EFFECT: um dos seguintes valores de efeito: PreferNoSchedule, NoSchedule ou NoExecute;
  • KEY=VALUE: um par de chave-valor associado ao EFFECT.

Por exemplo, o comando a seguir cria um pool de nós em um cluster atual e aplica um taint com um valor-chave dedicated=experimental com um efeito NoSchedule:

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

Este comando cria um pool de nós e aplica um taint com chave-valor de special=gpu com um efeito NoExecute:

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

Console

Para criar um pool de nós com taints de nó, execute as seguintes etapas:

  1. Acesse a página Google Kubernetes Engine no console do Google Cloud.

    Acessar o Google Kubernetes Engine

  2. Na lista de clusters, clique no nome do cluster que você quer modificar.

  3. Na página Detalhes do cluster, clique em Adicionar pool de nós.

  4. No painel de navegação, clique em Metadados.

  5. Em Taints de nó, clique em Adicionar taint.

  6. Selecione o efeito desejado na lista suspensa Efeito.

  7. Insira o par de chave-valor pretendido nos campos Chave e Valor.

  8. Clique em Criar.

API

Ao usar a API para criar um pool de nós, inclua o campo nodeTaints em nodeConfig. Veja um exemplo:

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'
        }
      ]
      ...
    }
    ...
  }
}

Configurar pods para tolerar um taint

É possível configurar pods para tolerar um taint incluindo o campo tolerations na especificação do pods. Veja a seguir uma parte de uma especificação de pod.

Este pod pode ser programado em um nó que tenha o taint dedicated=experimental:NoSchedule:

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

Como adicionar um taint a um nó atual

Adicione taints a um nó atual usando o comando kubectl taint:

kubectl taint nodes NODE_NAME KEY=VALUE:EFFECT

Por exemplo, o comando a seguir aplica um taint com valor-chave dedicated=experimental com um efeito NoSchedule ao nó mynode:

kubectl taint nodes mynode dedicated=experimental:NoSchedule

Também é possível adicionar taints a nós que tenham um rótulo específico usando o seletor -l com o rótulo e o valor especificados:

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

Por exemplo, o comando a seguir adiciona um taint com chave dedicated-pool aos nós do GKE no pool de nós my_pool:

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

Inspecionar taints para um nó

Para ver os taints de um nó, use a ferramenta de linha de comando kubectl.

  1. Para receber uma lista de todos os nós no cluster, execute o comando a seguir:

    kubectl get nodes
    
  2. Para inspecionar um nó, execute o comando a seguir:

    kubectl describe node NODE_NAME
    
  3. Na saída retornada, procure o campo Taints. A resposta será semelhante a:

    Taints:  dedicated-pool=mypool:NoSchedule
    

Remover um taint de um nó

Use kubectl taint para remover taints. É possível remover taints por chave, chave-valor ou chave-efeito.

Por exemplo, o comando a seguir remove todos os taints com a chave dedicated do nó mynode:

kubectl taint nodes mynode dedicated-

Remover todos os taints de um pool de nós

Para remover todos os taints de um pool de nós, execute o comando a seguir:

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

Substitua:

  • POOL_NAME: o nome do pool de nós que será alterado.
  • CLUSTER_NAME: o nome do cluster em que o pool de nós foi criado.

A seguir