Crie e personalize um node pool

Esta página mostra como criar um conjunto de nós no GKE no AWS e como personalizar a configuração dos nós através de um ficheiro de configuração.

Para criar um node pool, tem de fornecer os seguintes recursos:

  • O nome de um cluster da AWS existente no qual criar o node pool
  • Um perfil de instância do IAM para VMs do pool de nós
  • Uma sub-rede onde as VMs do node pool são executadas

Se quiser acesso SSH aos seus nós, pode criar um par de chaves do EC2.

Esta página destina-se a administradores de TI e operadores que querem configurar, monitorizar e gerir a infraestrutura na nuvem. Para saber mais sobre as funções comuns e exemplos de tarefas que referimos no Google Cloud conteúdo, consulte Funções e tarefas comuns do utilizador do GKE.

Crie um node pool padrão

Assim que estes recursos estiverem disponíveis, pode criar um conjunto 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 o seguinte:

  • NODE_POOL_NAME: um nome que escolhe para o seu node pool
  • CLUSTER_NAME: o nome do cluster ao qual anexar o grupo de nós
  • INSTANCE_TYPE: o tipo de instância de máquina da AWS pretendido para este conjunto de nós, por exemplo, m5.large
  • ROOT_VOLUME_SIZE: o tamanho pretendido para o volume raiz de cada nó, em GB
  • NODEPOOL_PROFILE: o perfil de instância do IAM para VMs do conjunto de nós. Para ver detalhes sobre como atualizar um perfil de instância do IAM, consulte o artigo Atualize o perfil de instância do IAM da AWS.
  • NODE_VERSION: a versão do Kubernetes a instalar em cada nó no node pool (por exemplo, "1.32.4-gke.200")
  • MIN_NODES: o número mínimo de nós que o node pool pode conter
  • MAX_NODES: o número máximo de nós que o node pool pode conter
  • MAX_PODS_PER_NODE: o número máximo de agrupamentos que podem ser criados em qualquer nó único no conjunto
  • GOOGLE_CLOUD_LOCATION: o nome da Google Cloud localização a partir da qual este node pool vai ser gerido
  • NODEPOOL_SUBNET: o ID da sub-rede na qual o conjunto de nós vai ser executado.
    • Não pode haver sobreposição entre os intervalos de IP de pods/serviços do cluster e a rede de sub-rede do conjunto de nós. Para mais informações sobre como selecionar intervalos de IPs de pods e serviços para o seu cluster, consulte o artigo Selecione intervalos de CIDR para o seu cluster
    • Se esta sub-rede estiver fora do bloco CIDR principal da VPC, são necessários alguns passos adicionais. Para mais informações, consulte os 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 do AWS KMS que encripta os dados do utilizador

Se estiver presente, o parâmetro --tags aplica a etiqueta especificada a todos os nós no seu conjunto de nós. Este exemplo etiqueta todos os nós no conjunto com os nomes do cluster e do conjunto de nós ao qual o nó pertence.

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

Pode personalizar a configuração do nó através de vários métodos. Por exemplo, pode especificar parâmetros como o limite de CPU do pod quando cria um conjunto de nós.

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

Configure o agente kubelet

Para personalizar a configuração dos nós através do kubelet, use a CLI do Google Cloud ou o Terraform.

gcloud

Pode especificar definições personalizadas para o agente do nó do Kubernetes (kubelet) quando cria os seus conjuntos de nós. Por exemplo, para configurar o kubelet para usar a política de gestão 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 o seguinte:

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

Para ver uma lista completa dos campos que pode adicionar ao comando anterior, consulte as Opções de configuração do Kubelet.

Terraform

Pode saber mais acerca do Terraform num ambiente AWS na referência do conjunto de nós do Terraform.

  1. Defina as variáveis do Terraform incluindo o seguinte bloco no ficheiro 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 o seguinte:

    • NODE_POOL_RESOURCE_NAME: o nome do recurso do conjunto de nós no modelo do Terraform.
    • CLUSTER_NAME: o nome do cluster existente.
    • POOL_NAME: o nome do node pool a personalizar.
    • SUBNET_ID: a sub-rede atribuída ao node pool.
    • CLUSTER_VERSION: a versão para o plano de controlo e os nós do cluster do GKE no AWS.
    • CLUSTER_LOCATION: a região ou a zona do Compute Engine do cluster.

Configure o utilitário sysctl

Para personalizar a configuração do sistema de nós através da API sysctl, faça um POST pedido ao método awsClusters.awsNodePools.create. Este pedido POST cria um conjunto de nós com as personalizações especificadas. No exemplo seguinte, os parâmetros busy_poll e busy_read estão configurados para 5000 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 o seguinte:

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

Para ver uma lista completa dos pares de chave-valor que pode adicionar ao pedido JSON anterior, consulte as opções de configuração do Sysctl.

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

A tabela seguinte mostra as opções de kubelet que pode modificar.

Definições de configuração do Kubelet Restrições Predefinição Descrição
kubelet_config_cpu_manager_policy O valor tem de ser none ou static "none" Esta definição controla a política do gestor de CPU do kubelet. O valor predefinido é none, que é o esquema de afinidade de CPU predefinido, não oferecendo afinidade além do que o agendador do SO faz automaticamente.

Se definir este valor como static, os pods na classe de QoS garantida com pedidos de CPU inteiros podem ser atribuídos para utilização exclusiva de CPUs.
kubelet_config_cpu_cfs_quota O valor tem de ser true ou false true Esta definição aplica o limite de CPU do pod. Se definir este valor como false, significa que os limites da CPU para os pods sã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 tem de ser uma duração "100ms" Esta definição define o valor do período da quota do CFS da CPU, cpu.cfs_period_us, que especifica o período com que o acesso de um cgroup aos recursos da CPU deve ser realocado. Esta opção permite-lhe ajustar o comportamento de limitação da CPU.
kubelet_config_pod_pids_limit O valor tem de estar compreendido entre 1024 e 4194304 -1 Esta definição define o número máximo de IDs de processos (PIDs) que cada Pod pode usar. Se estiver definido com o valor predefinido, o limite de PIDs é dimensionado automaticamente com base no tamanho da máquina subjacente.

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

Para otimizar o desempenho do seu sistema, pode modificar os seguintes atributos:

Node pools de instâncias de comando

O GKE no AWS suporta pools de nós de instâncias spot da AWS como uma funcionalidade de pré-visualização. Os conjuntos de nós de instâncias Spot são conjuntos de instâncias Spot do Amazon EC2 que estão disponíveis na AWS a um custo inferior.

As instâncias de opção podem proporcionar poupanças de custos para aplicações sem estado, tolerantes a falhas e flexíveis. No entanto, não são adequados para cargas de trabalho que sejam inflexíveis, com estado, intolerantes a falhas ou fortemente acopladas entre nós de instâncias. As instâncias Spot podem ser interrompidas pelo Amazon EC2 quando o EC2 precisa de recuperar a capacidade e, por isso, estão sujeitas a flutuações no mercado Spot. Se as suas cargas de trabalho exigirem capacidade garantida e não tolerarem períodos ocasionais de indisponibilidade, escolha um conjunto de nós padrão em vez de um conjunto de nós de instância de reserva.

A estratégia de atribuição usada no GKE na AWS foca-se na seleção de pools de instâncias Spot com a maior disponibilidade de capacidade, minimizando o risco de interrupções. Esta abordagem é particularmente benéfica para cargas de trabalho com um custo de interrupção mais elevado, como a renderização de imagens e multimédia ou a aprendizagem profunda. Especificamente, a estratégia de atribuição capacityOptimized foi implementada, conforme descrito em Estratégias de atribuição para instâncias Spot.

Crie um node pool Spot

Para criar um node pool de instâncias 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 o seguinte:

  • NODE_POOL_NAME: o nome que quer atribuir a este conjunto de nós.
  • CLUSTER_NAME: o nome do cluster ao qual quer anexar este node pool.
  • INSTANCE_TYPE_LIST: uma lista separada por vírgulas dos tipos de instâncias do AWS EC2. O node pool aprovisiona instâncias Spot com estes tipos de instâncias. Os tipos de instâncias têm de 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". Pode usar a ferramenta Amazon EC2 Instance Selector para encontrar tipos de instâncias com configurações idênticas de CPU e memória.
  • ROOT_VOLUME_SIZE: o tamanho pretendido para o volume raiz de cada nó, em GB
  • NODEPOOL_PROFILE: o perfil de instância do IAM para VMs do node pool
  • NODE_VERSION: a versão do Kubernetes a instalar em cada nó no node pool (por exemplo, "1.32.4-gke.200")
  • MIN_NODES: o número mínimo de nós que o node pool pode conter
  • MAX_NODES: o número máximo de nós que o node pool pode conter
  • MAX_PODS_PER_NODE: o número máximo de agrupamentos que podem ser criados em qualquer nó único no conjunto
  • GOOGLE_CLOUD_LOCATION: o nome da Google Cloud localização a partir da qual este node pool vai ser gerido
  • NODEPOOL_SUBNET: o ID da sub-rede na qual o conjunto de nós vai ser executado.
    • Não pode haver sobreposição entre os intervalos de IP de pods/serviços do cluster e a rede de sub-rede do conjunto de nós. Para mais informações sobre como selecionar intervalos de IPs de pods e serviços para o seu cluster, consulte o artigo Selecione intervalos de CIDR para o seu cluster
    • Se esta sub-rede estiver fora do bloco CIDR principal da VPC, são necessários alguns passos adicionais. Para mais informações, consulte os 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 do AWS KMS que encripta os dados do utilizador

A prática recomendada é indicar vários tipos de instâncias no campo INSTANCE_TYPE_LIST. Esta prática recomendada é importante porque, se um conjunto 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 conjunto de nós não pode aprovisionar novos nós. Isto pode afetar a disponibilidade das suas aplicações e causar interrupções no serviço.

Tenha em atenção que o campo spot-instance-types é mutuamente exclusivo com o campo instance-type. Isto significa que só pode fornecer um destes campos e não ambos.