Criar e personalizar um pool de nós

Nesta página, mostramos como criar um pool de nós no GKE na AWS e como personalizar a configuração de nós usando um arquivo de configuração.

Para criar um pool de nós, é preciso fornecer os seguintes recursos:

  • O nome de um cluster atual da AWS em que o pool de nós será criado
  • Um perfil de instância do IAM para VMs de pool de nós
  • Uma sub-rede em que as VMs do pool de nós serão executadas

Se você quiser acesso SSH aos seus nós, poderá criar um par de chaves do EC2.

Esta página é destinada a administradores de TI e operadores que querem configurar, monitorar e gerenciar a infraestrutura em nuvem. Para saber mais sobre papéis comuns e tarefas de exemplo mencionados no conteúdo do Google Cloud , consulte Tarefas e funções de usuário comuns do GKE.

Criar um pool de nós padrão

Quando esses recursos estiverem disponíveis, será possível criar um pool de nós com este comando:

gcloud container aws node-pools create NODE_POOL_NAME \
    --cluster CLUSTER_NAME \
    --instance-type INSTANCE_TYPE \
    --root-volume-size ROOT_VOLUME_SIZE \
    --iam-instance-profile NODEPOOL_PROFILE \
    --node-version NODE_VERSION \
    --min-nodes MIN_NODES \
    --max-nodes MAX_NODES \
    --max-pods-per-node MAX_PODS_PER_NODE \
    --location GOOGLE_CLOUD_LOCATION \
    --subnet-id NODEPOOL_SUBNET \
    --ssh-ec2-key-pair SSH_KEY_PAIR_NAME \
    --config-encryption-kms-key-arn CONFIG_KMS_KEY_ARN \
    --tags "Name=CLUSTER_NAME-NODE_POOL_NAME"

Substitua:

  • NODE_POOL_NAME: o nome escolhido para o pool de nós.
  • CLUSTER_NAME: o nome do cluster ao qual o pool de nós será anexado
  • INSTANCE_TYPE: o tipo de instância de máquina da AWS pretendido para este pool de nós, por exemplo, m5.large;
  • ROOT_VOLUME_SIZE: o tamanho desejado para o volume raiz de cada nó, em Gb.
  • NODEPOOL_PROFILE: o perfil da instância do IAM para VMs de pool de nós. Para detalhes sobre como atualizar um perfil de instância do IAM, consulte Atualizar o perfil da instância do IAM da AWS.
  • NODE_VERSION: a versão do Kubernetes a ser instalada em cada nó no pool de nós (por exemplo, "1.32.4-gke.200")
  • MIN_NODES: o número mínimo de nós que o pool pode conter.
  • MAX_NODES: o número máximo de nós que o pool pode conter.
  • MAX_PODS_PER_NODE: o número máximo de pods que podem ser criados em qualquer nó no pool;
  • GOOGLE_CLOUD_LOCATION: o nome do local do Google Cloud em que esse pool de nós será gerenciado.
  • NODEPOOL_SUBNET: o ID da sub-rede em que o pool de nós será executado;
    • Não pode haver nenhuma sobreposição entre os intervalos de IP de pod/serviço do cluster e a rede de sub-rede do pool de nós. Para mais informações sobre como selecionar intervalos de IP do pod e do serviço para o cluster, consulte Selecionar intervalos CIDR para o cluster.
    • Se essa sub-rede estiver fora do bloco CIDR primário de VPC, algumas etapas adicionais serão necessárias. Para mais informações, consulte grupos de segurança.
  • SSH_KEY_PAIR_NAME: o nome do par de chaves SSH da AWS criado para acesso SSH (opcional)
  • CONFIG_KMS_KEY_ARN: o nome de recurso da Amazon (ARN) da chave de KMS da AWS que criptografa os dados do usuário;

Quando presente, o parâmetro --tags aplica a tag fornecida a todos os nós no pool. Esse exemplo marca todos os nós no pool com os nomes dos clusters e do pool de nós a que o nó pertence.

Personalizar a configuração do sistema de nós

É possível personalizar a configuração do nó usando vários métodos. Por exemplo, é possível especificar parâmetros como o limite de CPU do pod ao criar um pool de nós.

É possível usar uma configuração do sistema de nós para especificar configurações personalizadas para o agente de nós do Kubernetes ( kubelet) e configurações de kernel de baixo nível do Linux (sysctl) nos pools de nós.

Configurar o agente kubelet

Para personalizar a configuração do nó usando kubelet, use a Google Cloud CLI ou o Terraform.

gcloud

É possível especificar configurações personalizadas para o agente de nós do Kubernetes (kubelet) ao criar os pools de nós. Por exemplo, para configurar o kubelet para usar a política de gerenciamento de CPU estática, execute o seguinte comando:

  gcloud container aws node-pools create POOL_NAME \
       --cluster CLUSTER_NAME \
       --location=LOCATION \
       --kubelet_config_cpu_manager_policy=static

Substitua:

  • POOL_NAME: o nome do pool de nós.
  • CLUSTER_NAME: o nome do cluster ao qual você quer adicionar um pool de nós.
  • LOCATION: a zona ou região de computação do cluster.

Para uma lista completa dos campos que podem ser adicionados ao comando anterior, consulte Opções de configuração do Kubelet.

Terraform

Saiba mais sobre o Terraform em um ambiente da AWS na Referência de pool de nós do Terraform.

  1. Defina as variáveis do Terraform incluindo o seguinte bloco no arquivo variables.tf:

    variable "node_pool_kubelet_config_cpu_manager" {
      default     = "none"
    }
    
    variable "node_pool_kubelet_config_cpu_cfs_quota" {
      default     = "true"
    }
    
    variable "node_pool_kubelet_config_cpu_cfs_quota_period" {
      default     = "100ms"
    }
    
    variable "node_pool_kubelet_config_pod_pids_limit" {
      default     = -1
    }
    
  2. Adicione o seguinte bloco à configuração do Terraform:

    resource "google_container_aws_node_pool" "NODE_POOL_RESOURCE_NAME" {
     provider           = google
     cluster            = CLUSTER_NAME
     name               = POOL_NAME
     subnet_id          = SUBNET_ID
     version            = CLUSTER_VERSION
     location           = CLUSTER_LOCATION
    
     kubelet_config {
       cpu_manager_policy = var.node_pool_kubelet_config_cpu_manager
       cpu_cfs_quota = var.node_pool_kubelet_config_cpu_cfs_quota
       cpu_cfs_quota_period = var.node_pool_kubelet_config_cpu_cfs_quota_period
       pod_pids_limit = var.node_pool_kubelet_config_pod_pids_limit
     }
    }
    

    Substitua:

    • NODE_POOL_RESOURCE_NAME: o nome do recurso do pool de nós no modelo do Terraform.
    • CLUSTER_NAME: o nome do cluster existente.
    • POOL_NAME: o nome do pool de nós a ser personalizado.
    • SUBNET_ID: a sub-rede atribuída ao pool de nós.
    • CLUSTER_VERSION: a versão do plano e dos nós de controle do cluster do GKE na AWS.
    • CLUSTER_LOCATION: a região ou zona do Compute Engine do cluster.

Configurar o utilitário sysctl

Para personalizar a configuração do sistema de nós usando sysctl, faça uma solicitação POST para o método awsClusters.awsNodePools.create. Essa solicitação POST cria um pool de nós com as personalizações especificadas. No exemplo a seguir, os parâmetros busy_poll e busy_read estão configurados para 5.000 microssegundos cada:

POST https://ENDPOINT/v1/projects/PROJECT_ID/locations/GOOGLE_CLOUD_LOCATION/CLUSTER_NAME/awsNodePools

{
    "name": NODE_POOL_NAME,
    "version": CLUSTER_VERSION,
    "config": {
        "linuxNodeConfig": {
            "sysctls": {
                "net.core.busy_poll": "5000",
                "net.core.busy_read": "5000",
            }
        }
    }
}

Substitua:

  • ENDPOINT: seu Google Cloud endpoint de serviço.
  • PROJECT_ID: o ID do projeto Google Cloud .
  • GOOGLE_CLOUD_LOCATION: o localGoogle Cloud do cluster.
  • CLUSTER_NAME: o nome do cluster ao qual você quer adicionar um pool de nós.
  • NODE_POOL_NAME: o nome do pool de nós.
  • CLUSTER_VERSION: o número da versão do cluster, por exemplo, 1.31.0-gke.500.

Para uma lista completa dos pares de chave-valor que podem ser adicionados à solicitação JSON anterior, consulte Opções de configuração do Sysctl.

Opções de configuração para o agente kubelet

A tabela a seguir mostra as opções de kubelet que você pode modificar.

Configurações do Kubelet Restrições Configuração padrão Descrição
kubelet_config_cpu_manager_policy O valor precisa ser none ou static. "none" Essa configuração controla a política do Gerenciador de CPU do kubelet. O valor padrão é none, que é o esquema padrão de afinidade da CPU, que não fornece afinidade além do que o programador do SO faz automaticamente.

Definir esse valor como static permite que os pods na classe QoS garantida com solicitações de CPU de número inteiro recebam o uso exclusivo das CPUs.
kubelet_config_cpu_cfs_quota O valor precisa ser true ou false. true Essa configuração aplica o limite de CPU do pod. Definir esse valor como false significa que os limites de CPU para pods serão ignorados.

Ignorar os limites da CPU pode ser desejável em determinados cenários em que os pods são sensíveis aos limites da CPU. O risco de desativar cpuCFSQuota é que um pod não autorizado pode consumir mais recursos da CPU do que o pretendido.
kubelet_config_cpu_cfs_quota_period O valor precisa ser uma duração de tempo "100ms" Esta configuração define o valor do período da cota do CFS da CPU, cpu.cfs_period_us, que especifica a frequência com que o acesso de um cgroup aos recursos da CPU precisa ser realocado. Essa opção permite ajustar o comportamento de limitação da CPU.
kubelet_config_pod_pids_limit O valor precisa estar entre 1024 e 4194304 -1 Essa configuração define o número máximo de IDs de processos (PIDs, na sigla em inglês) que cada pod pode usar. Se definido com o valor padrão, o limite de PIDs será escalonado automaticamente com base no tamanho da máquina subjacente.

Opções de configuração para o utilitário sysctl

Para ajustar o desempenho do sistema, modifique os seguintes atributos:

Pools de nós de instâncias spot

O GKE na AWS é compatível com pools de nós de instâncias Spot da AWS como um recurso de pré-lançamento. Os pools de nós de instâncias spot são pools de instâncias spot do Amazon EC2 disponíveis na AWS a um custo menor.

As instâncias spot oferecem economia de custos para aplicativos sem estado, tolerantes a falhas e flexíveis. No entanto, eles não são adequados para cargas de trabalho inflexíveis, com estado, intolerantes a falhas ou fortemente acopladas entre nós de instância. As instâncias do Spot podem ser interrompidas pelo Amazon EC2 quando o EC2 precisa da capacidade de volta, portanto, elas estão sujeitas a flutuações no mercado do Spot. Se as cargas de trabalho exigirem capacidade garantida e não puderem tolerar períodos ocasionais de indisponibilidade, escolha um pool de nós padrão em vez de um pool de nós da instância spot.

A estratégia de alocação empregada no GKE na AWS se concentra na seleção de pools de instâncias Spot com a maior capacidade disponível, minimizando o risco de interrupções. Essa abordagem é particularmente benéfica para cargas de trabalho com um custo maior de interrupção, como renderização de imagem e mídia ou aprendizado profundo. Especificamente, a estratégia de alocação capacityOptimized foi implementada, conforme descrito em Estratégias de alocação para instâncias spot.

Criar um pool de nós do Spot

Para criar um pool de nós de instâncias do Spot, execute o seguinte comando:

gcloud container aws node-pools create NODE_POOL_NAME \
    --cluster CLUSTER_NAME \
    --spot-instance-types INSTANCE_TYPE_LIST \
    --root-volume-size ROOT_VOLUME_SIZE \
    --iam-instance-profile NODEPOOL_PROFILE \
    --node-version NODE_VERSION \
    --min-nodes MIN_NODES \
    --max-nodes MAX_NODES \
    --max-pods-per-node MAX_PODS_PER_NODE \
    --location GOOGLE_CLOUD_LOCATION \
    --subnet-id NODEPOOL_SUBNET \
    --ssh-ec2-key-pair SSH_KEY_PAIR_NAME \
    --config-encryption-kms-key-arn CONFIG_KMS_KEY_ARN \
    --tags "Name=CLUSTER_NAME-NODE_POOL_NAME"

Substitua:

  • NODE_POOL_NAME: o nome que você quer atribuir a esse pool de nós.
  • CLUSTER_NAME: o nome do cluster ao qual você quer anexar esse pool de nós.
  • INSTANCE_TYPE_LIST: uma lista separada por vírgulas de tipos de instância do AWS EC2. O pool de nós provisiona instâncias do Spot com esses tipos de instância. Os tipos de instância precisam ter a mesma arquitetura de CPU, o mesmo número de CPUs e a mesma quantidade de memória. Por exemplo: "c6g.large,c6gd.large,c6gn.large,c7g.large,t4g.medium". Use a ferramenta Seletor de instâncias do Amazon EC2 para encontrar tipos de instância com configurações idênticas de CPU e memória.
  • ROOT_VOLUME_SIZE: o tamanho desejado para o volume raiz de cada nó, em Gb.
  • NODEPOOL_PROFILE: o perfil de instância do IAM para VMs de pool de nós
  • NODE_VERSION: a versão do Kubernetes a ser instalada em cada nó no pool de nós (por exemplo, "1.32.4-gke.200")
  • MIN_NODES: o número mínimo de nós que o pool pode conter.
  • MAX_NODES: o número máximo de nós que o pool pode conter.
  • MAX_PODS_PER_NODE: o número máximo de pods que podem ser criados em qualquer nó no pool;
  • GOOGLE_CLOUD_LOCATION: o nome do local do Google Cloud em que esse pool de nós será gerenciado.
  • NODEPOOL_SUBNET: o ID da sub-rede em que o pool de nós será executado;
    • Não pode haver nenhuma sobreposição entre os intervalos de IP de pod/serviço do cluster e a rede de sub-rede do pool de nós. Para mais informações sobre como selecionar intervalos de IP do pod e do serviço para o cluster, consulte Selecionar intervalos CIDR para o cluster.
    • Se essa sub-rede estiver fora do bloco CIDR primário de VPC, algumas etapas adicionais serão necessárias. Para mais informações, consulte grupos de segurança.
  • SSH_KEY_PAIR_NAME: o nome do par de chaves SSH da AWS criado para acesso SSH (opcional)
  • CONFIG_KMS_KEY_ARN: o nome de recurso da Amazon (ARN) da chave de KMS da AWS que criptografa os dados do usuário;

A prática recomendada é listar uma série de tipos de instância no campo INSTANCE_TYPE_LIST. Essa prática recomendada é importante porque, se um pool de nós estiver configurado com apenas um tipo de instância e esse tipo de instância não estiver disponível em nenhuma das zonas de disponibilidade desejadas, o pool de nós poderá aprovisione novos nós. Isso pode afetar a disponibilidade dos aplicativos e causar interrupções no serviço.

O campo spot-instance-types é mutuamente exclusivo com o campo instance-type. Isso significa que você pode fornecer apenas um desses campos, e não ambos.