У тебя 5 микросервисов, и каждому нужен внешний доступ. Создать 5 LoadBalancer — дорого и неудобно. Ingress позволяет направлять весь HTTP/HTTPS-трафик через один балансировщик, распределяя его по сервисам по URL-правилам.
Зачем Ingress
Без Ingress: каждый Service типа LoadBalancer — это отдельный внешний IP и отдельный балансировщик. 5 сервисов = 5 IP-адресов = 5 оплачиваемых LB у облачного провайдера.
С Ingress:
Интернет → 1 IP (LoadBalancer) → Ingress Controller
├── /api → backend-service:8000
├── /static → frontend-service:3000
└── /admin → admin-service:8080
Один IP, один балансировщик, маршрутизация по URL или хосту.
Ingress Controller
Ingress — это объект K8s с правилами маршрутизации. Сам по себе он ничего не делает.
Ingress Controller — это Pod (обычно nginx, Traefik или HAProxy), который читает правила Ingress и реально маршрутизирует трафик.
Установка nginx Ingress Controller
# Через Helm (рекомендуется)
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm install ingress-nginx ingress-nginx/ingress-nginx \
--namespace ingress-nginx \
--create-namespace
# Или через манифест
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.9.5/deploy/static/provider/cloud/deploy.yaml
# Проверка
kubectl get pods -n ingress-nginx
# NAME READY STATUS AGE
# ingress-nginx-controller-7d4db76476-xq2jk 1/1 Running 2m
kubectl get svc -n ingress-nginx
# NAME TYPE EXTERNAL-IP
# ingress-nginx-controller LoadBalancer 34.123.45.67
Для minikube:
minikube addons enable ingress
Path-based Routing (по URL)
# ingress-path.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: app-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx
rules:
- http:
paths:
- path: /api
pathType: Prefix
backend:
service:
name: backend-service
port:
number: 8000
- path: /
pathType: Prefix
backend:
service:
name: frontend-service
port:
number: 3000
kubectl apply -f ingress-path.yaml
kubectl get ingress
# NAME CLASS HOSTS ADDRESS PORTS AGE
# app-ingress nginx * 34.123.45.67 80 2m
Теперь:
- http://34.123.45.67/api/users → backend-service
- http://34.123.45.67/ → frontend-service
Host-based Routing (по домену)
# ingress-host.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: multi-host-ingress
spec:
ingressClassName: nginx
rules:
- host: api.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: api-service
port:
number: 8080
- host: app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: frontend-service
port:
number: 3000
- host: admin.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: admin-service
port:
number: 8081
Запросы маршрутизируются по заголовку Host:
- api.example.com → api-service
- app.example.com → frontend-service
- admin.example.com → admin-service
TLS/SSL конфигурация
Шаг 1: Создать Secret с сертификатом
# Самоподписанный (для тестов)
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout tls.key -out tls.crt \
-subj "/CN=example.com/O=example"
kubectl create secret tls example-tls \
--cert=tls.crt \
--key=tls.key
Шаг 2: Ingress с TLS
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: secure-ingress
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
ingressClassName: nginx
tls:
- hosts:
- api.example.com
- app.example.com
secretName: example-tls
rules:
- host: api.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: api-service
port:
number: 8080
Автоматические сертификаты с cert-manager
# Установить cert-manager
helm repo add jetstack https://charts.jetstack.io
helm install cert-manager jetstack/cert-manager \
--namespace cert-manager \
--create-namespace \
--set installCRDs=true
# ClusterIssuer для Let's Encrypt
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: admin@example.com
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- http01:
ingress:
class: nginx
# Ingress с автоматическим сертификатом
metadata:
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
tls:
- hosts:
- api.example.com
secretName: api-tls # cert-manager создаст этот Secret автоматически
Полезные аннотации nginx Ingress
metadata:
annotations:
# Ограничить размер тела запроса
nginx.ingress.kubernetes.io/proxy-body-size: "10m"
# Таймаут
nginx.ingress.kubernetes.io/proxy-read-timeout: "60"
# Rate limiting
nginx.ingress.kubernetes.io/limit-rps: "10"
# Basic Auth
nginx.ingress.kubernetes.io/auth-type: basic
nginx.ingress.kubernetes.io/auth-secret: basic-auth
# CORS
nginx.ingress.kubernetes.io/enable-cors: "true"
💬 Комментарии (0)
Комментариев пока нет
Станьте первым, кто поделится мнением об этой статье!