Impedir o autorregistro de nós em clusters do GKE

Por padrão, os nós do Google Kubernetes Engine (GKE) usam o processo kubelet em cada nó para registrar objetos de nó com o servidor da API Kubernetes. Este documento mostra como impedir esse autorregistro para nós protegidos do GKE e, em vez disso, exigir que um componente confiável do plano de controle do GKE execute operações de registro. Os engenheiros de segurança e os administradores da plataforma podem usar a criação de nós do plano de controle para limitar os privilégios dos nós.

Você já precisa estar familiarizado com os seguintes conceitos:

Modos de criação de nós no GKE

Os nós protegidos do GKE, que estão ativados em todos os clusters do GKE, aplicam a verificação criptográfica das identidades de nós durante o processo de registro. Essa verificação ajuda a garantir que apenas nós legítimos possam se registrar no servidor da API Kubernetes e executar cargas de trabalho.

O fluxo de trabalho de registro padrão para clusters do GKE, em que o kubelet em cada nó cria e modifica o objeto Node no servidor da API, cria um risco se um nó for comprometido. Por exemplo, em CVE-2025-5187, uma vulnerabilidade permitia que os usuários de nós excluíssem os objetos Node correspondentes e registrassem nós comprometidos.

Criação de nós do plano de controle

No GKE versão 1.35.3-gke.1189000 e mais recentes, é possível exigir um componente confiável do plano de controle do GKE chamado gcp-controller-manager para criar objetos Node em vez de permitir que o kubelet autorregistre os nós. Depois que o kubelet configura uma conexão TLS com o servidor da API usando a identidade do nó verificada criptograficamente, o componente gcp-controller-manager cria o objeto Node. Um controlador de admissão rejeita todas as solicitações do kubelet para criar o objeto Node. Ao usar o componente do plano de controle para criar objetos Node, é possível reduzir o risco de um nó potencialmente comprometido criar objetos Node arbitrários ou manipular a especificação Node.

Para mudar o comportamento padrão de criação e registro de nós, faça uma das seguintes ações ao criar um cluster padrão ou do Autopilot:

  • Google Cloud CLI: especifique um valor de CONTROL_PLANE na flag --node-creation-mode.
  • API Kubernetes Engine: especifique um valor de VIA_CONTROL_PLANE no campo node-creation-mode no método NodeCreationConfig.

Limitações

Há um breve atraso entre o momento em que o gcp-controller-manager cria um objeto Node na API Kubernetes e quando o kubelet atualiza esse objeto Node com o conjunto completo de rótulos e anotações de nós. Todas as cargas de trabalho ou controladores que dependem de um conjunto completo de rótulos ou anotações imediatamente após a criação do nó podem mostrar um comportamento inesperado. Alguns rótulos e anotações podem ser reconciliados em um momento diferente do registro do kubelet. Verifique se as cargas de trabalho e os DaemonSets usam verificações de presença de rótulos e anotações antes de agir.

  • Evite implantar DaemonSets e cargas de trabalho que tenham tolerâncias para todas as falhas de nós, o que pode fazer com que os pods sejam executados em nós que não estão prontos.
  • Use um initContainer para verificar os rótulos de nós antes de permitir que os contêineres principais sejam executados.

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ê já instalou a CLI gcloud, faça o download da versão mais recente executando o comando gcloud components update. Talvez as versões anteriores da CLI gcloud não sejam compatíveis com a execução dos comandos neste documento.

Ativar a criação de nós do plano de controle

É possível ativar a criação de nós usando o componente gcp-controller-manager ao criar um cluster ou atualizar um cluster atual. Para clusters atuais, a atualização afeta apenas os novos nós do cluster. Os nós atuais não são afetados pela mudança.

O comando a seguir ativa o modo de criação de nós do plano de controle para um cluster atual:

gcloud container clusters update CLUSTER_NAME \
    --node-creation-mode=CONTROL_PLANE \
    --location=CONTROL_PLANE_LOCATION \

Substitua:

  • CLUSTER_NAME: o nome do cluster.
  • CONTROL_PLANE_LOCATION: a região ou zona do plano de controle do cluster.

Também é possível especificar a --node-creation-mode flag no clusters create command e no clusters create-auto command.

Desativar a criação de nós do plano de controle

É possível reverter para o comportamento padrão do GKE em que o kubelet cria nós a qualquer momento, especificando um valor de KUBELET na --node-creation-mode flag da Google Cloud CLI ou VIA_KUBELET no NodeCreationConfig método da API GKE. Para clusters atuais, essa mudança afeta apenas os novos nós desse cluster.

O comando a seguir atualiza um cluster para desativar a criação de nós do plano de controle:

gcloud container clusters update CLUSTER_NAME \
    --node-creation-mode=KUBELET \
    --location=CONTROL_PLANE_LOCATION \

Substitua:

  • CLUSTER_NAME: o nome do cluster.
  • CONTROL_PLANE_LOCATION: a região ou zona do plano de controle do cluster.

A seguir