Esta página descreve como o GKE na AWS funciona com a AWS para escolher sub-redes para equilibradores de carga de serviços e como etiquetar sub-redes para serem descobertas automaticamente durante a criação do equilibrador de carga de serviços.
Por que motivo tem de especificar sub-redes
Ao criar balanceadores de carga, a AWS precisa de saber em que sub-redes os colocar. A sub-rede determina as zonas de disponibilidade, os endereços IP e os pontos finais do balanceador de carga.
Normalmente, os balanceadores de carga são atribuídos a uma sub-rede para cada zona de disponibilidade que contenha um conjunto de nós. A AWS precisa de, pelo menos, uma sub-rede disponível para criar um Network Load Balancer (NLB) e, pelo menos, duas sub-redes para um Application Load Balancer (ALB).
Todas as sub-redes da AWS são públicas (com IPs públicos e uma rota para o gateway de Internet da VPC) ou privadas (sem estas funcionalidades). Os balanceadores de carga virados para a Internet têm de estar localizados em sub-redes públicas. Os balanceadores de carga internos podem residir em sub-redes públicas ou privadas.
Se não existirem sub-redes etiquetadas disponíveis
Se o GKE no AWS precisar de criar um balanceador de carga e não estiverem disponíveis ou não tiverem capacidade sub-redes etiquetadas, pode criar o balanceador de carga noutra sub-rede. Para evitar esta situação e controlar em que sub-redes os equilibradores de carga são colocados, deve etiquetar todas as suas sub-redes.
Deteção automática de sub-redes
O GKE no AWS descobre automaticamente as sub-redes a usar para um equilibrador de carga ao listar todas as sub-redes na VPC e selecionar até uma sub-rede de cada zona de disponibilidade.
Para que o GKE no AWS descubra automaticamente uma sub-rede, esta tem de:
- Ter a etiqueta
kubernetes.io/role/elb
(para um balanceador de carga virado para a Internet) - Ter a etiqueta
kubernetes.io/role/internal-elb
(para um balanceador de carga interno) - Não contêm etiquetas com o prefixo
kubernetes.io/cluster/
ou contêm a etiquetakubernetes.io/cluster/CLUSTER_UID
, em queCLUSTER_UID
é o UID do cluster atual.
Além disso, uma sub-rede destinada a utilização com um equilibrador de carga virado para a Internet tem de ter uma rota para o gateway de Internet da VPC.
Se existirem várias sub-redes numa zona de disponibilidade que satisfaçam os requisitos do equilibrador de carga, o GKE on AWS classifica as sub-redes por ordem do respetivo ID de sub-rede.
Etiquete as suas sub-redes para a utilização pretendida
Para que o GKE no AWS descubra automaticamente uma sub-rede para um equilibrador de carga, tem de aplicar uma de duas etiquetas à sub-rede para sinalizar a respetiva disponibilidade. São eles:
kubernetes.io/role/elb
: aplique esta etiqueta à sua sub-rede para a marcar como disponível para um balanceador de carga virado para a Internet. Tem de ser uma sub-rede pública com uma rota para o gateway de Internet da sua VPC. Defina a etiqueta como1
. Para aplicar esta etiqueta, 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 esta etiqueta à sua sub-rede para a marcar como disponível para um equilibrador de carga interno. Defina o valor da etiqueta como1
. Para aplicar esta etiqueta, execute o seguinte comando:aws ec2 create-tags \ --resources SUBNET_ID \ --tags Key=kubernetes.io/role/internal-elb,Value=1
Substitua o seguinte:
SUBNET_ID
: o ID da sub-rede que está a etiquetar
Depois de atribuir à sub-rede uma etiqueta kubernetes.io/role
, também pode etiquetá-la com uma ou mais etiquetas kubernetes.io/cluster/CLUSTER_UID
, em que CLUSTER_UID é o UID de um cluster do GKE no AWS.
Isto impede que qualquer cluster não listado numa destas etiquetas detete automaticamente a sub-rede para utilização pelos respetivos equilibradores de carga.
Consulte a documentação da Amazon
aws ec2 create-tags
para mais informações sobre o comando aws ec2 create-tags
.
Resolução de problemas
O problema mais comum com a configuração do equilibrador de carga são as sub-redes etiquetadas incorretamente. Isto pode fazer com que o algoritmo de deteção automática selecione as sub-redes erradas. Para diagnosticar e resolver este problema:
Se estiver a criar um equilibrador de carga virado para a Internet, certifique-se de que existe, pelo menos, uma sub-rede pública em cada uma das zonas de disponibilidade que contêm um conjunto de nós e que as sub-redes estão etiquetadas com
kubernetes.io/role/elb
.Se estiver a criar um equilibrador de carga interno, certifique-se de que existe, pelo menos, uma sub-rede em cada uma das zonas de disponibilidade que contêm um conjunto de nós e que as sub-redes estão etiquetadas com
kubernetes.io/role/internal-elb
.Verifique se as sub-redes que quer detetar automaticamente têm etiquetas do formulário
kubernetes.io/cluster/CLUSTER_UID
. Se uma sub-rede tiver etiquetas deste tipo a dar nome a um cluster, a sub-rede só pode ser descoberta automaticamente pelos clusters com nome. Para resolver este problema, elimine todas as etiquetas de nome do cluster (para permitir que a sub-rede seja detetada automaticamente a partir de qualquer cluster) ou adicione uma etiqueta de nome do cluster com o UID do cluster do GKE no AWS e um valor deshared
.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 não foi possível detetar automaticamente nenhuma sub-rede. Se receber este aviso, certifique-se de que as suas sub-redes e respetivas etiquetas estão corretas e completas.Para apresentar uma lista das sub-redes que podem ser descobertas automaticamente para equilibradores de carga virados 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=*"
Substitua
VPC_ID
pelo ID da sua VPC.Para listar as sub-redes que podem ser descobertas automaticamente para equilibradores de carga internos, execute:
aws ec2 describe-subnets \ --filters "Name=vpc-id,Values=VPC_ID" "Name=tag:kubernetes.io/role/internal-elb,Values=*"
Passos seguintes
Saiba mais acerca do equilíbrio de carga de rede