Pular para o conteúdo principal

Capítulo 8.2 - Ingress Controller

Objetivos de Aprendizagem​

Ao final deste capítulo, você será capaz de:

  • Entender o que é um Ingress Controller
  • Instalar o NGINX Ingress Controller
  • Configurar um Ingress Controller
  • Compreender os diferentes tipos de controladores
  • Gerenciar anotações e configurações avançadas
  • Solucionar problemas de um Ingress Controller

Introdução​

Um Ingress Controller é um Pod que monitora os recursos Ingress e configura um load balancer para implementar as regras de roteamento. Sem um Ingress Controller, os recursos Ingress não funcionam.


O que é um Ingress Controller?​

Um Ingress Controller é um reverse proxy que:

  • Monitora os recursos Ingress no cluster
  • Configura um load balancer conforme as regras Ingress
  • Gerencia o roteamento HTTP/HTTPS
  • Faz a terminação TLS/SSL
  • Fornece load balancing

Importante: Um Ingress Controller deve ser instalado separadamente. O Kubernetes não fornece um controlador por padrão.


Tipos de Ingress Controllers​

1. NGINX Ingress Controller​

O mais popular

Vantagens:

  • Altíssimo desempenho
  • Muitas funcionalidades
  • Bem documentado
  • Suporte ativo

Instalação:

# Kubernetes oficial
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml

# Verificar a instalação
kubectl get pods -n ingress-nginx

2. Traefik​

Simples e moderno

Vantagens:

  • Auto-configuração
  • Dashboard integrado
  • Configuração simples
  • Suporte Let's Encrypt integrado

Instalação:

# Helm
helm repo add traefik https://traefik.github.io/charts
helm install traefik traefik/traefik

3. HAProxy Ingress​

Altíssimo desempenho

Vantagens:

  • Desempenho excepcional
  • Configuração avançada
  • Suporte TCP/UDP

4. Istio Gateway​

Para service mesh

Vantagens:

  • Integração com Istio
  • Funcionalidades avançadas
  • Service mesh completo

Instalação do NGINX Ingress Controller​

Método 1: Manifest Kubernetes​

# Instalação padrão
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.1/deploy/static/provider/cloud/deploy.yaml

# Verificar
kubectl get pods -n ingress-nginx
kubectl get svc -n ingress-nginx

Método 2: Helm​

# Adicionar o repositório
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update

# Instalar
helm install ingress-nginx ingress-nginx/ingress-nginx \
--namespace ingress-nginx \
--create-namespace

Verificação​

# Ver os Pods
kubectl get pods -n ingress-nginx

# Ver o Service
kubectl get svc -n ingress-nginx

# Ver o IP externo
kubectl get svc ingress-nginx-controller -n ingress-nginx

Configuração Básica​

IngressClass​

Definir qual classe de Ingress utilizar:

apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: nginx
spec:
controller: k8s.io/ingress-nginx

Ingress Resource​

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-ingress
spec:
ingressClassName: nginx
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80

Anotações NGINX​

As anotações permitem configurar o NGINX de forma avançada:

Rewrite​

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: rewrite-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
ingressClassName: nginx
rules:
- host: example.com
http:
paths:
- path: /api/(.*)
pathType: Prefix
backend:
service:
name: api-service
port:
number: 80

SSL Redirect​

metadata:
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "true"

Rate Limiting​

metadata:
annotations:
nginx.ingress.kubernetes.io/limit-rps: "100"

CORS​

metadata:
annotations:
nginx.ingress.kubernetes.io/enable-cors: "true"
nginx.ingress.kubernetes.io/cors-allow-origin: "*"

Autenticação​

metadata:
annotations:
nginx.ingress.kubernetes.io/auth-type: basic
nginx.ingress.kubernetes.io/auth-secret: basic-auth
nginx.ingress.kubernetes.io/auth-realm: "Authentication Required"

Configuração Avançada​

ConfigMap para NGINX​

apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-config
namespace: ingress-nginx
data:
proxy-body-size: "50m"
ssl-protocols: "TLSv1.2 TLSv1.3"
client-max-body-size: "50m"

Aplicar a Configuração​

apiVersion: apps/v1
kind: Deployment
metadata:
name: ingress-nginx-controller
namespace: ingress-nginx
spec:
template:
spec:
containers:
- name: controller
args:
- /nginx-ingress-controller
- --configmap=$(POD_NAMESPACE)/nginx-config

Exemplo Completo​

Etapa 1: Service​

apiVersion: v1
kind: Service
metadata:
name: web-service
spec:
selector:
app: web
ports:
- port: 80
targetPort: 8080

Etapa 2: Ingress​

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
ingressClassName: nginx
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
tls:
- hosts:
- example.com
secretName: example-tls

Comandos Úteis​

Verificação​

# Ver os Pods do Controller
kubectl get pods -n ingress-nginx

# Logs do Controller
kubectl logs -n ingress-nginx -l app.kubernetes.io/component=controller

# Ver os Services
kubectl get svc -n ingress-nginx

# Ver os Ingress
kubectl get ingress
kubectl describe ingress web-ingress

Solução de Problemas​

# Verificar a configuração do NGINX
kubectl exec -n ingress-nginx <controller-pod> -- cat /etc/nginx/nginx.conf

# Testar a conectividade
curl -H "Host: example.com" http://<ingress-ip>/

# Ver os eventos
kubectl get events -n ingress-nginx

Boas Práticas​

1. Namespace Dedicado​

Instale o Ingress Controller em um namespace dedicado (ingress-nginx).

2. Recursos​

Defina limites de recursos para o Controller.

3. Alta Disponibilidade​

Implemente múltiplas réplicas do Controller para alta disponibilidade.

4. Monitoramento​

Monitore as métricas do Controller (requisições, latência, erros).

5. Segurança​

  • Utilize TLS em todos os lugares
  • Configure rate limits
  • Ative autenticação se necessário

Resumo​

Neste capítulo, você aprendeu:

Ingress Controller: Pod que implementa as regras Ingress
Tipos: NGINX (popular), Traefik (simples), HAProxy (performático), Istio (service mesh)
Instalação: Manifest Kubernetes ou Helm
Configuração: IngressClass, anotações, ConfigMap
Anotações: Rewrite, SSL redirect, rate limiting, CORS, auth
Solução de problemas: Logs, configuração NGINX, eventos
Boas práticas: Namespace dedicado, HA, monitoramento, segurança


Próximos Passos​

Capítulo 8.3: Roteamento e TLS
Lab 8.1: Deploy de um Ingress Controller


Capítulo criado em: Dezembro 2024