📝 Kubernetes

Ingress: HTTP-роутинг в Kubernetes

P
Автор
Pyland
📅
Опубликовано
30.06.2026
⏱️
Время чтения
2 мин
👁️
Просмотров
79
🌳
Уровень
Продвинутый
🐦 💼 ✈️

У тебя 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)

🔐 Войдите в систему, чтобы оставить комментарий
🚪 Войти
💭

Комментариев пока нет

Станьте первым, кто поделится мнением об этой статье!

🔗 Похожие

Похожие статьи

Продолжите изучение с этими материалами

📝

AI-агенты: ReAct loop и автономные действия

Чат-бот отвечает на вопросы. Агент — действует: вызывает инструменты, получает реальные данные и использует их...

📅 30.06.2026 👁️ 101
📝

RAG: чат с документами через векторный поиск

RAG (Retrieval-Augmented Generation) — паттерн для работы с собственными документами. Вместо того чтобы переобучать модель,...

📅 30.06.2026 👁️ 94
📝

Health Checks: liveness и readiness в Kubernetes

Контейнер запущен — не значит, что приложение работает. Может быть дедлок, переполнение памяти или медленная...

📅 30.06.2026 👁️ 93

Понравилась статья?

Подпишитесь на наши обновления и получайте новые статьи первыми. Развивайтесь вместе с PyLand!