Como 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). Quando você programa a implantação de cargas de trabalho no cluster, os taints de nó o ajudam a controlar quais nós elas podem executar.

Visão geral

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 de node são pares de chave-valor associados a um efeito. Veja abaixo os efeitos disponíveis:

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

Alguns pods do sistema (por exemplo, kube-proxy e fluentd) toleram todos os taints NoExecute e NoSchedule e não serão removidos.

Antes de começar

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

Defina as configurações padrão da gcloud usando um dos métodos a seguir:

  • Use gcloud init se quiser orientações para definir os padrões.
  • Use gcloud config para definir individualmente a região, a zona e o ID do projeto.

Como usar o gcloud init

Se você receber o erro One of [--zone, --region] must be supplied: Please specify location, conclua esta seção.

  1. Execute gcloud init e siga as instruções:

    gcloud init

    Se você estiver usando SSH em um servidor remoto, utilize a sinalização --console-only para impedir que o comando inicie um navegador:

    gcloud init --console-only
  2. Siga as instruções para autorizar a gcloud a usar sua conta do Google Cloud.
  3. Crie uma nova configuração ou selecione uma atual.
  4. Escolha um projeto do Google Cloud.
  5. Escolha uma zona padrão do Compute Engine.

Como usar o gcloud config

  • Defina o ID do projeto padrão:
    gcloud config set project project-id
  • Se você estiver trabalhando com clusters zonais, defina a zona do Compute padrão:
    gcloud config set compute/zone compute-zone
  • Se você estiver trabalhando com clusters regionais, defina a região do Compute padrão:
    gcloud config set compute/region compute-region
  • Atualize gcloud para a versão mais recente:
    gcloud components update

Como criar um cluster com taints de nó

Quando você cria um cluster, pode atribuir manchas de node a ele. Isso atribui os taints a todos os nós criados com o cluster.

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 cluster a ser criado;
  • effect é PreferNoSchedule, NoSchedule ou NoExecute;
  • key e value formam um par de chave-valor associado a effect.

Por exemplo, o comando a seguir aplica um taint com chave dedicated, valor experimental e efeito PreferNoSchedule:

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

Console

Para criar um cluster com taints de nó:

  1. Acesse o menu do Google Kubernetes Engine no Console do Cloud.

    Acessar o menu do Google Kubernetes Engine

  2. Clique no botão Criar cluster.

  3. Configure o cluster como quiser.

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

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

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

  7. Preencha Chave e Valor com o par de chave-valor pretendido.

  8. Adicione mais taints de nó, se quiser.

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

Como criar um pool de nós com manchas de node

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 ferramenta de linha de comando gcloud, o Console do 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 é PreferNoSchedule, NoSchedule ou NoExecute;
  • key e value formam um par de chave-valor associado a effect.

Por exemplo, o comando a seguir aplica um taint com chave dedicated, valor experimental e efeito NoSchedule:

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

Este comando aplicar um taint com chave special, valor gpu e 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 o menu do Google Kubernetes Engine no Console do Cloud.

    Acessar o menu do Google Kubernetes Engine

  2. Clique no botão de edição do cluster, que tem a forma de um lápis.

  3. Em Pools de nós, clique em Adicionar pool de nós.

  4. Na seção Nós, clique em Adicionar taint.

  5. Em Efeito, selecione o efeito pretendido.

  6. Preencha Chave e Valor com o par de chave-valor pretendido.

  7. Adicione mais taints de nó, se quiser.

  8. Clique em Salvar para sair da sobreposição de modificação do pool de nós.

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

Como configurar pods para que tolerem 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:

kubectl taint nodes node1 key=value:NoSchedule

Também é possível fazer isso com um rótulo específico:

kubectl taint node -l myLabel=X dedicated=foo:PreferNoSchedule

Para saber mais, consulte Taints e tolerâncias na documentação do Kubernetes.

Como inspecionar os taints de 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 descrição do nó retornado, procure o campo Taints:

    Taints: key=value:effect
    

Como 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 do nó foo todos os taints com a chave dedicated:

kubectl taint nodes foo dedicated-

Vantagens de usar taints de nó

Usar taints de nó em vez de configurar taints manualmente usando kubectl tem várias vantagens:

  • 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 ou cluster.
  • Os taints são criados automaticamente durante o escalonamento automático do cluster.

A seguir