Skip to main content

Configurar um Load Balancer de Serviço

Regiões

Este recurso está disponível nas seguintes regiões:
br-se1
br-ne1

As configurações do Load Balancer são realizadas através de Annotations no recurso Service.

warning

Alterar as configurações do Load Balancer manualmente podem torná-lo inutilizável pelo Cluster Kubernetes. Configure-o apenas através de ferramentas como kubectl.

info

As configurações de Load Balancer são diferentes para as versões v3 e v1 do produto de Kubernetes.

Clique aqui para mais informações sobre as versões de plataforma do produto de Kubernetes.

v3​

Abaixo estão listadas as Annotations suportadas pelo Load Balancer na plataforma de produto de Kubernetes versão v3.

Visibilidade (Externo e Interno)​

Define a visibilidade do Load Balancer durante a criação do Service.

Annotation: magalu.cloud/load-balancer-visibility.
Valor padrão: external.
Valores:

  • external: O Load Balancer será exposto à Internet através de um IP público. O IP público será reservado do pool de IPs da Magalu Cloud e será associado ao Load Balancer.
  • internal: O Load Balancer receberá um IP interno da VPC. Essa abordagem permite que você consiga expor a aplicação internamente sem que ela seja acessível através da Internet.

O exemplo abaixo cria um Load Balancer de serviço interno:

cat <<EOF | kubectl apply -f -
kind: Service
apiVersion: v1
metadata:
name: nginx-internal
annotations:
magalu.cloud/load-balancer-visibility: internal
spec:
selector:
app: nginx
type: LoadBalancer
ports:
- port: 80
targetPort: 80
protocol: TCP
EOF

Verifique o IP interno do Load Balancer com o comando abaixo:

kubectl get service nginx-internal -w

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-internal LoadBalancer 10.104.18.78 <pending> 80:32392/TCP 22s
nginx-internal LoadBalancer 10.104.18.78 172.18.32.9 80:32392/TCP 30s

Retenção do IP Público​

Define a política de reaproveitamento do IP público durante a exclusão de um Load Balancer de serviço.

Annotation: magalu.cloud/public-ip-reclaim-policy.
Valor padrão: delete.
Valores:

  • retain: Durante a exclusão do Service, o IP público associado ao Load Balancer não será excluído e poderá ser reutilizado. O IP público também será retido caso a Annotation magalu.cloud/load-balancer-public-ip-id seja explicitamente usada.
  • delete: O IP público associado ao Load Balancer será removido durante a exclusão do Service.

No exemplo abaixo, o Service é criado com a Annotation magalu.cloud/public-ip-reclaim-policy, utilizando o valor retain.

cat <<EOF | kubectl apply -f -
kind: Service
apiVersion: v1
metadata:
name: nginx
annotations:
magalu.cloud/public-ip-reclaim-policy: retain
spec:
selector:
app: nginx
type: LoadBalancer
ports:
- port: 80
targetPort: 80
protocol: TCP
EOF

Verifique as informações do Service:

kubectl get service nginx

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx LoadBalancer 10.101.170.119 201.23.69.201 80:31198/TCP 34s

É possível consultar as informações do IP público através da CLI da MGC. Verificamos que o seu status atual é in_use.

mgc network public-ips list | grep '201.23.69.201' -C10

[...]
- created_at: 2025-11-21T15:10:52.576443
description: Public IP for Load Balancer.
error: null
external_id: null
id: 9812d66c-f1ee-4210-aac1-64740d9fce31
port_id: null
project_type: default
public_ip: 201.23.69.201

# definição do status
status: in_use

tenant_id: 00000000-0000-0000-0000-000000000000
updated: 2025-11-21T15:10:52.576444
vpc_id: 00000000-0000-0000-0000-000000000000
[...]

Após deletar o Service, podemos verificar que o IP ainda está listado, mas agora seu status é created:

kubectl delete service nginx
mgc network public-ips list | grep '201.23.69.201' -C10

[...]
- created_at: 2025-11-21T15:10:52.576443
description: Public IP for Load Balancer.
error: null
external_id: null
id: 9812d66c-f1ee-4210-aac1-64740d9fce31
port_id: null
project_type: default
public_ip: 201.23.69.201

# definição do status
status: created

tenant_id: 00000000-0000-0000-0000-000000000000
updated: 2025-11-21T15:13:20.965765
vpc_id: 00000000-0000-0000-0000-000000000000
[...]

Utilizando um IP Público Existente​

Para criar um Load Balancer de serviço utilizando um IP público existente é necessário ter um IP público reservado com o status de created.

Caso deseje criar um IP público, confira a documentação aqui.

Annotation: magalu.cloud/load-balancer-public-ip-id.
Valor padrão: "".
Valores:

  • "": Com o valor vazio, o Service cria um IP público durante a criação do Load Balancer.
  • <ip-id>: Ao passar o ID de um IP Público com o status created, o Load Balancer é criado com o IP fornecido.

Aproveitando o exemplo acima, precisamos coletar o ID do IP público:

mgc network public-ips list | grep '201.23.69.201' -C10

[...]
- created_at: 2025-11-21T15:10:52.576443
description: Public IP for Load Balancer.
error: null
external_id: null

# utilize esse ID
id: 9812d66c-f1ee-4210-aac1-64740d9fce31

port_id: null
project_type: default
public_ip: 201.23.69.201
status: created
tenant_id: 00000000-0000-0000-0000-000000000000
updated: 2025-11-21T15:13:20.965765
vpc_id: 00000000-0000-0000-0000-000000000000
[...]

Com o ID em mãos, podemos criar um Load Balancer de serviço com a Annotation magalu.cloud/load-balancer-public-ip-id:

cat <<EOF | kubectl apply -f -
kind: Service
apiVersion: v1
metadata:
name: nginx-com-ip
annotations:
magalu.cloud/load-balancer-public-ip-id: 9812d66c-f1ee-4210-aac1-64740d9fce31
spec:
selector:
app: nginx
type: LoadBalancer
ports:
- port: 80
targetPort: 80
protocol: TCP
EOF

Verifique as informações do Service:

kubectl get service nginx-com-ip -w

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-com-ip LoadBalancer 10.96.130.94 <pending> 80:32444/TCP 8s
nginx-com-ip LoadBalancer 10.96.130.94 201.23.69.201 80:32444/TCP 29s

Após a criação do Load Balancer, podemos verificar o status created no IP público:

mgc network public-ips list | grep '201.23.69.201' -C10

[...]
- created_at: 2025-11-21T15:10:52.576443
description: Public IP for Load Balancer.
error: null
external_id: null
id: 9812d66c-f1ee-4210-aac1-64740d9fce31
port_id: null
project_type: default
public_ip: 201.23.69.201

# sendo utilizado
status: in_use

tenant_id: 00000000-0000-0000-0000-000000000000
updated: 2025-11-21T15:13:20.965765
vpc_id: 00000000-0000-0000-0000-000000000000
[...]

PROXY Protocol​

Habilita o PROXY protocol nos backends do Load Balancer. Quando habilitado, o Load Balancer adiciona um cabeçalho com as informações da conexão original (IP e porta do cliente) no início da conexão TCP, permitindo que a aplicação atrás do Load Balancer conheça o endereço real do cliente.

Annotation: magalu.cloud/load-balancer-proxy-protocol.
Valor padrão: desabilitado (Annotation ausente).
Valores:

  • "*": Habilita o PROXY protocol nos backends de todas as portas do Service.
  • Lista de portas do Service separadas por vírgula (ex.: "80,443"): Habilita o PROXY protocol apenas nos backends das portas listadas. Os valores são as portas do Service (spec.ports[].port), não as portas do container ou NodePort.
warning

A aplicação que recebe o tráfego nas portas habilitadas precisa estar configurada para aceitar o PROXY protocol. Caso contrário, as conexões falharão, já que o cabeçalho adicionado pelo Load Balancer não será interpretado corretamente.

Valores inválidos na Annotation (portas fora do range válido ou que não existem no Service) são ignorados e geram eventos de Warning no Service, sem impedir a aplicação das portas válidas. Verifique os eventos com kubectl describe service <nome>.

A Annotation é reconciliada em Load Balancers existentes: é possível habilitar ou desabilitar o PROXY protocol em um Service já criado, sem precisar recriá-lo.

O exemplo abaixo cria um nginx configurado para aceitar o PROXY protocol na porta 8443 do container e um Load Balancer de serviço com o PROXY protocol habilitado apenas na porta 443 do Service:

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-proxy-protocol
data:
default.conf: |
# Porta sem PROXY protocol.
server {
listen 8080;
location / {
default_type text/plain;
return 200 "remote_addr=\$remote_addr\nproxy_protocol_addr=\$proxy_protocol_addr\n";
}
}

# Porta com PROXY protocol: o IP real do cliente é restaurado a partir do cabeçalho.
server {
listen 8443 proxy_protocol;
set_real_ip_from 0.0.0.0/0;
real_ip_header proxy_protocol;
location / {
default_type text/plain;
return 200 "remote_addr=\$remote_addr\nproxy_protocol_addr=\$proxy_protocol_addr\n";
}
}
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-proxy-protocol
spec:
replicas: 2
selector:
matchLabels:
app: nginx-proxy-protocol
template:
metadata:
labels:
app: nginx-proxy-protocol
spec:
containers:
- name: nginx
image: nginxinc/nginx-unprivileged:1.27-alpine
ports:
- name: plain
containerPort: 8080
- name: proxied
containerPort: 8443
volumeMounts:
- name: config
mountPath: /etc/nginx/conf.d
volumes:
- name: config
configMap:
name: nginx-proxy-protocol
---
apiVersion: v1
kind: Service
metadata:
name: nginx-proxy-protocol
annotations:
magalu.cloud/load-balancer-proxy-protocol: "443"
spec:
type: LoadBalancer
selector:
app: nginx-proxy-protocol
ports:
- name: plain
port: 80
protocol: TCP
targetPort: plain
- name: proxied
port: 443
protocol: TCP
targetPort: proxied
EOF

Aguarde o IP externo do Load Balancer:

kubectl get service nginx-proxy-protocol -w

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-proxy-protocol LoadBalancer 10.99.104.201 <pending> 80:30412/TCP,443:31007/TCP 6s
nginx-proxy-protocol LoadBalancer 10.99.104.201 201.23.72.101 80:30412/TCP,443:31007/TCP 38s

Na porta 80, sem PROXY protocol, a aplicação enxerga apenas o IP interno da conexão:

curl http://201.23.72.101/

remote_addr=192.168.101.34
proxy_protocol_addr=

Na porta 443, com PROXY protocol, a aplicação enxerga o IP real do cliente. Neste exemplo, a porta 443 serve HTTP puro (não TLS), portanto utilize http://:

curl http://201.23.72.101:443/

remote_addr=186.251.145.198
proxy_protocol_addr=186.251.145.198

Para habilitar o PROXY protocol em todas as portas de um Service existente:

kubectl annotate service nginx-proxy-protocol --overwrite \
magalu.cloud/load-balancer-proxy-protocol='*'

Para desabilitar, remova a Annotation:

kubectl annotate service nginx-proxy-protocol magalu.cloud/load-balancer-proxy-protocol-

Restringindo acesso ao Load Balancer​

Ao utilizar um Load Balancer de serviço, você pode especificar as faixas de IP (CIDRs) que têm permissão para acessá-lo utilizando o campo spec.loadBalancerSourceRanges. Este campo recebe uma lista de CIDRs, utilizado pelo serviço de Load Balancer da Magalu Cloud para configurar sua lista de ACLs.

Por padrão, o acesso ao Load Balancer é liberado para todos os IPs.

info

Atualmente, somente endereços e faixas IPv4 podem ser configurados. Não há suporte para IPv6.

warning

Ao utilizar o campo spec.loadBalancerSourceRanges, você obrigatoriamente precisará incluir a faixa de IPs do Cluster CIDR à lista. Para consultar esse CIDR, utilize o comando abaixo:

mgc kubernetes cluster get <cluster-id>

[...]
cluster_ipv4_cidr: 192.168.0.0/16
[...]

Com o exemplo abaixo, crie Load Balancer de serviço limitando seu acesso para o endereço 186.251.145.190 e para a faixa de IPs 201.23.12.0/24.

Caso o endereço seja um IP único, é necessário adicionar a máscara /32 ao CIDR. Portanto, o endereço 186.251.145.190 se torna 186.251.145.190/32.

cat <<EOF | kubectl apply -f -
kind: Service
apiVersion: v1
metadata:
name: nginx-com-restricoes
spec:
loadBalancerSourceRanges:
- 186.251.145.198/32
- 201.23.12.0/24
# Cluster CIDR
- 192.168.0.0/16
selector:
app: nginx
type: LoadBalancer
ports:
- port: 80
targetPort: 80
protocol: TCP
EOF

Verifique as informações do Service:

kubectl get service nginx-com-restricoes -w

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-com-restricoes LoadBalancer 10.101.235.48 <pending> 80:30584/TCP 4s
nginx-com-restricoes LoadBalancer 10.101.235.48 201.23.72.176 80:30584/TCP 35s

Caso o seu endereço de IP não esteja na lista, o acesso ao endereço do Load Balancer não será permitido:

curl http://201.23.72.176 --connect-timeout 2

curl: (28) Connection timeout after 2001 ms

v1​

Para os Clusters de plataforma do produto de Kubernetes na versão v1, todas as Annotations disponíveis estão documentadas aqui.