Ajudar a melhorar esta página
Para contribuir com este guia de usuário, escolha o link Editar esta página no GitHub, disponível no painel direito de cada página.
Configurar serviços do tipo LoadBalancer para nós híbridos
Este tópico descreve como configurar o balanceamento de carga de camada 4 (L4) para aplicações executadas no Amazon EKS Hybrid Nodes. Os serviços Kubernetes do tipo LoadBalancer são usados para expor aplicações do Kubernetes externos ao cluster. Serviços do tipo LoadBalancer são comumente usados com a infraestrutura física do balanceador de carga na nuvem ou no ambiente on-premises para atender ao tráfego da workload. Essa infraestrutura de balanceador de carga geralmente é provisionada com um controlador específico do ambiente.
A AWS oferece suporte para o AWS Network Load Balancer (NLB) e o Cilium para serviços do tipo LoadBalancer em execução no EKS Hybrid Nodes. A decisão de usar o NLB ou o Cilium é baseada na origem do tráfego da aplicação. Se o tráfego da aplicação for originário de uma região da AWS, a AWS recomenda usar o AWS NLB e o AWS Load Balancer Controller. Se o tráfego da aplicação for originado do ambiente on-premises ou de borda, a AWS recomenda usar os recursos de balanceamento de carga integrados do Cilium, que podem ser usados com ou sem a infraestrutura de balanceador de carga em seu ambiente.
Para balanceamento de carga de tráfego de aplicações de camada 7 (L7), consulte Configurar o Ingress do Kubernetes para nós híbridos. Para obter informações gerais sobre balanceamento de carga com EKS, consulte Melhores práticas para balanceamento de carga.
AWS Network Load Balancer
Você pode usar o AWS Load Balancer Controller e o NLB com o tipo de destino ip
para workloads executadas em nós híbridos. Ao usar o tipo de destino ip
, o NLB encaminha o tráfego diretamente para os pods, ignorando o caminho de rede da camada de serviço. Para que o NLB alcance as metas de IP do pod em nós híbridos, os CIDRs de pods on-premises deverão ser roteáveis em sua rede on-premises roteáveis em sua rede on-premises roteáveis. Além disso, o AWS Load Balancer Controller usa webhooks e requer comunicação direta do ambiente de gerenciamento EKS. Para obter mais informações, consulte Configurar webhooks para nós híbridos.
-
Consulte Roteamento de tráfego TCP e UDP com Network Load Balancers os requisitos de configuração de sub-rede, Instale o AWS Load Balancer Controller com o Helm e as melhores práticas para balanceamento de carga para obter informações adicionais sobre o AWS Network Load Balancer e o AWS Load Balancer Controller.
-
Consulte Configurações de NLB do AWS Load Balancer Controller
para ver as configurações que podem ser aplicadas a serviços do tipo LoadBalancer
com o AWS Network Load Balancer.
Pré-requisitos
-
Cilium instalado seguindo as instruções em Configurar a CNI para nós híbridos.
-
O ambiente de gerenciamento BGP do Cilium é habilitado seguindo as instruções em Configurar o BGP do Cilium para nós híbridos. Se não quiser usar o BGP, você deverá usar um método alternativo para tornar seus CIDRs de pods on-premises roteáveis em sua rede on-premises. Consulte CIDRs de pods remotos roteáveis para obter mais informações.
-
O Helm foi instalado em seu ambiente de linha de comando. Consulte as Instruções de configuração do Helm.
-
O eksctl foi instalado em seu ambiente de linha de comando. Consulte as Instruções de configuração do eksctl.
Procedimento
-
Baixe uma política do IAM para o AWS Load Balancer Controller que permita que ele faça chamadas para APIs da AWS em seu nome.
curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/refs/heads/main/docs/install/iam_policy.json
-
Crie uma política do IAM usando a política obtida por download na etapa anterior.
aws iam create-policy \ --policy-name AWSLoadBalancerControllerIAMPolicy \ --policy-document file://iam_policy.json
-
Substitua os valores do nome do cluster (
CLUSTER_NAME
), região da AWS (AWS_REGION
) e ID da conta da AWS (AWS_ACCOUNT_ID
) pelas suas configurações e execute o comando a seguir.eksctl create iamserviceaccount \ --cluster=CLUSTER_NAME \ --namespace=kube-system \ --name=aws-load-balancer-controller \ --attach-policy-arn=arn:aws:iam::AWS_ACCOUNT_ID:policy/AWSLoadBalancerControllerIAMPolicy \ --override-existing-serviceaccounts \ --region AWS_REGION \ --approve
-
Adicione o repositório de chart do Helm eks-charts. A AWS mantém esse repositório no GitHub.
helm repo add eks https://aws.github.io/eks-charts
-
Atualize o repositório local do Helm para confirmar que você tem os gráficos mais recentes.
helm repo update eks
-
Instale o AWS Load Balancer Controller. Substitua os valores do nome do cluster (
CLUSTER_NAME
), região da AWS (AWS_REGION
), ID da VPC (VPC_ID
) e a versão do chart do Helm do AWS Load Balancer Controller (AWS_LBC_HELM_VERSION
) pelas suas configurações. Você pode encontrar a versão mais recente do chart do Helm executandohelm search repo eks/aws-load-balancer-controller --versions
. Se você estiver executando um cluster em modo misto com nós híbridos e nós na Nuvem AWS, você pode executar o AWS Load Balancer Controller nos nós da nuvem seguindo as instruções em AWS Load Balancer Controller.helm install aws-load-balancer-controller eks/aws-load-balancer-controller \ -n kube-system \ --version
AWS_LBC_HELM_VERSION
\ --set clusterName=CLUSTER_NAME
\ --set region=AWS_REGION
\ --set vpcId=VPC_ID
\ --set serviceAccount.create=false \ --set serviceAccount.name=aws-load-balancer-controller -
Verifique se o AWS Load Balancer Controller foi instalado com êxito.
kubectl get -n kube-system deployment aws-load-balancer-controller
NAME READY UP-TO-DATE AVAILABLE AGE aws-load-balancer-controller 2/2 2 2 84s
-
Defina uma aplicação de amostra em um arquivo chamado
tcp-sample-app.yaml
. O exemplo abaixo usa uma implantação simples do NGINX com uma porta TCP.apiVersion: apps/v1 kind: Deployment metadata: name: tcp-sample-app namespace: default spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: public.ecr.aws/nginx/nginx:1.23 ports: - name: tcp containerPort: 80
-
Aplique a implantação ao seu cluster.
kubectl apply -f tcp-sample-app.yaml
-
Defina um serviço do tipo LoadBalancer para a implantação em um arquivo chamado
tcp-sample-service.yaml
.apiVersion: v1 kind: Service metadata: name: tcp-sample-service namespace: default annotations: service.beta.kubernetes.io/aws-load-balancer-type: external service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: ip service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing spec: ports: - port: 80 targetPort: 80 protocol: TCP type: LoadBalancer selector: app: nginx
-
Aplicar a configuração do serviço ao seu cluster.
kubectl apply -f tcp-sample-service.yaml
-
O provisionamento do NLB para o serviço pode levar alguns minutos. Depois que o NLB for provisionado, o serviço terá um endereço atribuído a ele que corresponde ao nome DNS da implantação do NLB.
kubectl get svc tcp-sample-service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE tcp-sample-service LoadBalancer 172.16.115.212 k8s-default-tcpsampl-xxxxxxxxxx-xxxxxxxxxxxxxxxx.elb.<region>.amazonaws.com 80:30396/TCP 8s
-
Acesse o serviço usando o endereço do NLB.
curl k8s-default-tcpsampl-xxxxxxxxxx-xxxxxxxxxxxxxxxx.elb.<region>.amazonaws.com
Um exemplo de saída está abaixo.
<!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> [...]
-
Limpe os recursos que você criou.
kubectl delete -f tcp-sample-service.yaml kubectl delete -f tcp-sample-app.yaml
Balanceamento de carga no cluster do Cilium
O Cilium pode ser usado como um balanceador de carga no cluster para workloads em execução no EKS Hybrid Nodes, o que pode ser útil para ambientes que não têm infraestrutura de balanceador de carga. Os recursos de balanceamento de carga do Cilium são baseados em uma combinação de atributos do Cilium, incluindo a substituição do kube-proxy, o Gerenciador de endereços IP (IPAM) do balanceador de carga e o ambiente de gerenciamento BGP. As responsabilidades desses atributos estão detalhadas abaixo:
-
Substituição do Cilium kube-proxy: manipula o tráfego do serviço de roteamento para pods de backend.
-
IPAM do Cilium Load Balancer: gerencia endereços IP que podem ser atribuídos a serviços do tipo
LoadBalancer
. -
Ambiente de gerenciamento do Cilium BGP: anuncia endereços IP alocados para IPAM do balanceador de carga para a rede on-premises.
Se você não estiver usando o substituto kube-proxy do Cilium, ainda poderá usar o IPAM do balanceador de carga do Cilium e o ambiente de gerenciamento do BGP para alocar e atribuir endereços IP para serviços do tipo LoadBalancer. Se você não estiver usando o substituto kube-proxy do Cilium, o balanceamento de carga dos serviços para pods de backend é feito pelas regras kube-proxy e iptables por padrão no EKS.
Pré-requisitos
-
O Cilium foi instalado seguindo as instruções Configurar a CNI para nós híbridos com ou sem a substituição do kube-proxy ativada. A substituição do kube-proxy do Cilium requer a execução de um sistema operacional com um kernel Linux pelo menos tão recente quanto v4.19.57, v5.1.16 ou v5.2.0. Todas as versões recentes dos sistemas operacionais compatíveis para uso com nós híbridos atendem a esses critérios, com exceção do Red Hat Enterprise Linux (RHEL) 8.x.
-
O ambiente de gerenciamento BGP do Cilium é habilitado seguindo as instruções em Configurar o BGP do Cilium para nós híbridos. Se não quiser usar o BGP, você deverá usar um método alternativo para tornar seus CIDRs de pods on-premises roteáveis em sua rede on-premises. Consulte CIDRs de pods remotos roteáveis para obter mais informações.
-
O Helm foi instalado em seu ambiente de linha de comando. Consulte as Instruções de configuração do Helm.
Procedimento
-
Crie um arquivo chamado
cilium-lbip-pool-loadbalancer.yaml
com um recursoCiliumLoadBalancerIPPool
para configurar o intervalo de endereços IP do balanceador de carga para seus serviços do tipo LoadBalancer.-
Substitua
LB_IP_CIDR
pelo intervalo de endereços IP a ser usado para os endereços IP do balanceador de carga. Para selecionar um único endereço IP, use um/32
CIDR. Para obter mais informações, consulte Gerenciamento de endereços IP do LoadBalancerna documentação do Cilium. -
O campo
serviceSelector
está configurado para corresponder ao nome do serviço que você criará em uma etapa subsequente. Com essa configuração, os IPs desse pool serão alocados somente aos serviços com o nometcp-sample-service
.apiVersion: cilium.io/v2alpha1 kind: CiliumLoadBalancerIPPool metadata: name: tcp-service-pool spec: blocks: - cidr: "LB_IP_CIDR" serviceSelector: matchLabels: io.kubernetes.service.name: tcp-sample-service
-
-
Aplique o recurso
CiliumLoadBalancerIPPool
ao seu cluster.kubectl apply -f cilium-lbip-pool-loadbalancer.yaml
-
Confirme se há pelo menos um endereço IP disponível no pool.
kubectl get ciliumloadbalancerippools.cilium.io
NAME DISABLED CONFLICTING IPS AVAILABLE AGE tcp-service-pool false False 1 24m
-
Crie um arquivo
cilium-bgp-advertisement-loadbalancer.yaml
com o nome de um recursoCiliumBGPAdvertisement
para anunciar o endereço IP do balanceador de carga para o serviço que você criará na próxima etapa. Se você não estiver usando o Cilium BGP, poderá ignorar esta etapa. O endereço IP do balanceador de carga usado para seu serviço deve ser roteável em sua rede on-premises para que você possa consultar o serviço na etapa final.-
O campo
advertisementType
está definido comoService
eservice.addresses
está definido comoLoadBalancerIP
para anunciar somente oLoadBalancerIP
para serviços do tipoLoadBalancer
. -
O campo
selector
está configurado para corresponder ao nome do serviço que você criará em uma etapa subsequente. Com essa configuração, somente oLoadBalancerIP
para os serviços com o nometcp-sample-service
serão anunciados.apiVersion: cilium.io/v2alpha1 kind: CiliumBGPAdvertisement metadata: name: bgp-advertisement-tcp-service labels: advertise: bgp spec: advertisements: - advertisementType: "Service" service: addresses: - LoadBalancerIP selector: matchLabels: io.kubernetes.service.name: tcp-sample-service
-
-
Aplique o recurso
CiliumBGPAdvertisement
ao seu cluster. Se você não estiver usando o Cilium BGP, poderá ignorar esta etapa.kubectl apply -f cilium-bgp-advertisement-loadbalancer.yaml
-
Defina uma aplicação de amostra em um arquivo chamado
tcp-sample-app.yaml
. O exemplo abaixo usa uma implantação simples do NGINX com uma porta TCP.apiVersion: apps/v1 kind: Deployment metadata: name: tcp-sample-app namespace: default spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: public.ecr.aws/nginx/nginx:1.23 ports: - name: tcp containerPort: 80
-
Aplique a implantação ao seu cluster.
kubectl apply -f tcp-sample-app.yaml
-
Defina um serviço do tipo LoadBalancer para a implantação em um arquivo chamado
tcp-sample-service.yaml
.-
Você pode solicitar um endereço IP específico do pool IP do balanceador de carga com a anotação
lbipam.cilium.io/ips
no objeto do serviço. Você pode remover essa anotação se não quiser solicitar um endereço IP específico para o serviço. -
O campo de especificação
loadBalancerClass
é obrigatório para evitar que o provedor de Nuvem AWS herdado crie um Classic Load Balancer para o serviço. No exemplo abaixo, isso está configuradoio.cilium/bgp-control-plane
para usar o ambiente de gerenciamento BGP do Cilium como a classe do balanceador de carga. Como alternativa, esse campo pode ser configurado para queio.cilium/l2-announcer
use o atributo L2 Announcements do Cilium(atualmente em versão beta e não compatível com a AWS). apiVersion: v1 kind: Service metadata: name: tcp-sample-service namespace: default annotations: lbipam.cilium.io/ips:
"LB_IP_ADDRESS"
spec: loadBalancerClass: io.cilium/bgp-control-plane ports: - port: 80 targetPort: 80 protocol: TCP type: LoadBalancer selector: app: nginx
-
-
Aplique o serviço ao seu cluster. O serviço será criado com um endereço IP externo que você poderá usar para acessar a aplicação.
kubectl apply -f tcp-sample-service.yaml
-
Verifique se o serviço foi criado com sucesso e tem um IP atribuído a ele a partir do
CiliumLoadBalancerIPPool
criado na etapa anterior.kubectl get svc tcp-sample-service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE tcp-sample-service LoadBalancer 172.16.117.76
LB_IP_ADDRESS
80:31129/TCP 14m -
Se você estiver usando o Cilium no modo de substituição do kube-proxy, você pode confirmar que o Cilium está lidando com o balanceamento de carga do serviço executando o comando a seguir. Na saída abaixo, os endereços
10.86.2.x
são os endereços IP dos pods de backend para o serviço.kubectl -n kube-system exec ds/cilium -- cilium-dbg service list
ID Frontend Service Type Backend ... 41
LB_IP_ADDRESS
:80/TCP LoadBalancer 1 => 10.86.2.76:80/TCP (active) 2 => 10.86.2.130:80/TCP (active) 3 => 10.86.2.141:80/TCP (active) -
Confirme se o Cilium está anunciando o endereço IP para a rede on-premises via BGP. No exemplo abaixo, há cinco nós híbridos, cada um anunciando o
LB_IP_ADDRESS
para o serviço detcp-sample-service
na rede on-premises.Node VRouter Prefix NextHop Age Attrs mi-026d6a261e355fba7
NODES_ASN
LB_IP_ADDRESS
/32 0.0.0.0 12m3s [{Origin: i} {Nexthop: 0.0.0.0}] mi-082f73826a163626eNODES_ASN
LB_IP_ADDRESS
/32 0.0.0.0 12m3s [{Origin: i} {Nexthop: 0.0.0.0}] mi-09183e8a3d755abf6NODES_ASN
LB_IP_ADDRESS
/32 0.0.0.0 12m3s [{Origin: i} {Nexthop: 0.0.0.0}] mi-0d78d815980ed202dNODES_ASN
LB_IP_ADDRESS
/32 0.0.0.0 12m3s [{Origin: i} {Nexthop: 0.0.0.0}] mi-0daa253999fe92daaNODES_ASN
LB_IP_ADDRESS
/32 0.0.0.0 12m3s [{Origin: i} {Nexthop: 0.0.0.0}] -
Acesse o serviço usando o endereço IP do balanceador de carga atribuído.
curl
LB_IP_ADDRESS
Um exemplo de saída está abaixo.
<!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> [...]
-
Limpe os recursos que você criou.
kubectl delete -f tcp-sample-service.yaml kubectl delete -f tcp-sample-app.yaml kubectl delete -f cilium-lb-ip-pool.yaml kubectl delete -f cilium-bgp-advertisement.yaml