GitHub EN PT

K8s em Exemplos: Services (LoadBalancer)

LoadBalancer provisiona um load balancer externo do seu provedor cloud (AWS ELB, GCP LB, Azure LB). O tráfego é roteado para seus Pods. Funciona apenas em ambientes suportados.

service-loadbalancer.yaml

Defina type: LoadBalancer para provisionar um load balancer cloud. O cloud controller cria e configura o LB automaticamente.

apiVersion: v1
kind: Service
metadata:
  name: my-app
spec:
  type: LoadBalancer
  ports:
    - port: 80
      targetPort: 8080
  selector:
    app: my-app
terminal

O IP externo aparece no status do Service uma vez provisionado. Isso pode levar alguns minutos dependendo do provedor cloud.

$ kubectl get svc my-app -w
NAME     TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
my-app   LoadBalancer   10.96.0.100   <pending>     80:31234/TCP   10s
my-app   LoadBalancer   10.96.0.100   34.123.45.67  80:31234/TCP   45s

$ curl http://34.123.45.67
Hello from my-app!
service-lb-aws.yaml

Annotations específicas de cloud configuram o load balancer. Cada provedor tem opções diferentes para LBs internos, NLB vs ALB, etc.

apiVersion: v1
kind: Service
metadata:
  name: my-app
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-type: nlb
    service.beta.kubernetes.io/aws-load-balancer-internal: "true"
spec:
  type: LoadBalancer
  ports:
    - port: 80
      targetPort: 8080
  selector:
    app: my-app
service-external-traffic.yaml

externalTrafficPolicy: Cluster (padrão) faz balanceamento entre todos os nodes. Tráfego pode saltar entre nodes, causando latência extra e perdendo IP de origem.

spec:
  type: LoadBalancer
  externalTrafficPolicy: Cluster

externalTrafficPolicy: Local roteia tráfego apenas para nodes com pods. Preserva IP de origem e reduz latência, mas requer pods em todos os nodes recebendo tráfego.

spec:
  type: LoadBalancer
  externalTrafficPolicy: Local
  ports:
    - port: 80
      targetPort: 8080
  selector:
    app: my-app
terminal

Com política Local, verifique se pods rodam em nodes recebendo tráfego. Use DaemonSet ou pod anti-affinity para garantir cobertura. Nodes sem pods retornam connection refused.

$ kubectl get svc my-app -o yaml | grep externalTrafficPolicy
  externalTrafficPolicy: Local

$ kubectl get pods -o wide -l app=my-app
NAME       NODE      IP
my-app-1   node-1    10.244.1.5
my-app-2   node-2    10.244.2.8

$ kubectl logs my-app-1
Received request from 203.0.113.50
terminal

Cada Service LoadBalancer cria um recurso cloud separado (deletado quando o Service é deletado). Para múltiplos services, use Ingress para compartilhar um único load balancer.

$ kubectl delete svc my-app
service "my-app" deleted

Índice | Use as setas do teclado para navegar