Sub-redes do balanceador de carga

Nesta página, descrevemos como o GKE na AWS funciona com a AWS para escolher sub-redes para balanceadores de carga de serviço e como marcar sub-redes para serem descobertas automaticamente durante a criação do balanceador de carga de serviço.

Por que você precisa especificar sub-redes

Ao criar balanceadores de carga na nuvem, a AWS precisa saber em quais sub-redes colocá-las. A sub-rede determina as zonas de disponibilidade, os endereços IP e os endpoints do balanceador de carga.

Normalmente, os balanceadores de carga são alocados a uma sub-rede para cada zona de disponibilidade contendo um pool de nós. A AWS precisa de, no mínimo, uma sub-rede disponível para criar um balanceador de carga de rede (NLB, na sigla em inglês) e de duas sub-redes para um balanceador de carga de aplicativo (ALB, na sigla em inglês).

Todas as sub-redes da AWS são públicas (com IPs públicos e uma rota para o gateway da Internet da VPC) ou privadas (sem esses recursos). Os balanceadores de carga voltados para a Internet precisam estar localizados em sub-redes públicas. Os balanceadores de carga internos podem residir em sub-redes públicas ou privadas.

Se não houver nenhuma sub-rede com tag disponível

Se o GKE na AWS precisar criar um balanceador de carga e nenhuma sub-rede marcada estiver disponível ou tiver capacidade, ele poderá criar o balanceador de carga em outra sub-rede. Para evitar isso e controlar em quais sub-redes os balanceadores de carga serão colocados, marque todas as sub-redes.

Descoberta automática da sub-rede

O GKE na AWS descobrirá automaticamente sub-redes a serem usadas em um balanceador de carga listando todas as sub-redes na VPC e selecionando até uma sub-rede de cada zona de disponibilidade.

Para que o GKE na AWS descubra automaticamente uma sub-rede, ela precisa:

  • receber a tag kubernetes.io/role/elb (para um balanceador de carga voltado para a Internet);
  • ter a tag kubernetes.io/role/internal-elb (para um balanceador de carga interno).
  • Não podem conter tags com o prefixo kubernetes.io/cluster/ ou contêm a tag kubernetes.io/cluster/CLUSTER_UID, em que CLUSTER_UID é o UID do cluster atual.

Além disso, uma sub-rede destinada a uso com um balanceador de carga voltado para a Internet precisa ter uma rota para o gateway da Internet da VPC.

Se houver várias sub-redes em uma zona de disponibilidade que atendam aos requisitos do balanceador de carga, o GKE na AWS classificará as sub-redes em ordem pelo ID da sub-rede.

Incluir tags nas sub-redes para o uso pretendido

Para que o GKE na AWS descubra automaticamente uma sub-rede de um balanceador de carga, aplique uma das duas tags à sub-rede para sinalizar a disponibilidade dela. São eles:

  • kubernetes.io/role/elb: aplique esta tag na sub-rede para marcá-la como disponível para um balanceador de carga voltado para a Internet. Precisa ser uma sub-rede pública com uma rota para o gateway de Internet da VPC. Defina a tag como 1. Para aplicar esse recurso, execute o seguinte comando:

    aws ec2 create-tags \
      --resources SUBNET_ID \
      --tags "Key=kubernetes.io/role/elb,Value=1"
    
  • kubernetes.io/role/internal-elb: aplique essa tag à sub-rede para marcá-la como disponível para um balanceador de carga interno. Defina o valor da tag como 1. Para aplicar esse recurso, execute o seguinte comando:

    aws ec2 create-tags \
      --resources SUBNET_ID \
      --tags Key=kubernetes.io/role/internal-elb,Value=1
    

Substitua:

  • SUBNET_ID: o ID da sub-rede que você está marcando.

Depois de atribuir uma tag kubernetes.io/role à sub-rede, também é possível marcá-la com uma ou mais tags kubernetes.io/cluster/CLUSTER_UID, em que CLUSTER_UID é o UID de um cluster do GKE na AWS. Isso impede que qualquer cluster não listado em uma dessas tags descubra automaticamente a sub-rede para uso pelos balanceadores de carga.

Consulte a documentação aws ec2 create-tags do Amazon para mais informações sobre o comando aws ec2 create-tags.

Solução de problemas

O problema mais comum com a configuração do balanceador de carga é a criação de sub-redes com tags incorretas. Isso pode fazer com que o algoritmo de descoberta automática selecione as sub-redes erradas. Para diagnosticar e resolver esse problema, faça o seguinte:

  • Se você estiver criando um balanceador de carga voltado para a Internet, verifique se há pelo menos uma sub-rede pública em cada uma das zonas de disponibilidade que contêm um pool de nós e se as sub-redes estão marcadas com kubernetes.io/role/elb. de dados.

  • Se você estiver criando um balanceador de carga interno, verifique se há pelo menos uma sub-rede em cada uma das zonas de disponibilidade que contêm um pool de nós e se as sub-redes estão marcadas com kubernetes.io/role/internal-elb de dados.

  • Verifique se as sub-redes que você quer descobrir automaticamente têm tags no formato kubernetes.io/cluster/CLUSTER_UID. Se uma sub-rede tiver tags que nomeiam um cluster, ela só poderá ser descoberta automaticamente pelos clusters nomeados. Para resolver isso, exclua todas as tags de nome de cluster (para permitir que a sub-rede seja descoberta automaticamente em qualquer cluster) ou adicione uma tag de nome de cluster com o UID do cluster da AWS e um valor de shared.

  • Verifique o histórico de eventos do Kubernetes com o seguinte comando:

    kubectl get events -A | grep LoadBalancer
    

    Por exemplo, a mensagem de evento could not find any suitable subnets for creating the ELB indica que nenhuma sub-rede pode ser descoberta automaticamente. Se você receber esse aviso, verifique se as sub-redes e as tags delas estão corretas e completas.

  • Para listar as sub-redes que podem ser descobertas automaticamente para balanceadores de carga voltados para a Internet, execute o seguinte comando:

    aws ec2 describe-subnets \
      --filters "Name=vpc-id,Values=VPC_ID" "Name=tag:kubernetes.io/role/elb,Values=*"
    

    VPC_ID: substitua pelo ID do seu modelo.

  • Para listar as sub-redes que podem ser descobertas automaticamente para balanceadores de carga internos, execute:

    aws ec2 describe-subnets \
      --filters "Name=vpc-id,Values=VPC_ID" "Name=tag:kubernetes.io/role/internal-elb,Values=*"
    

Próximas etapas