Что такое Ingress в Kubernetes и чем он отличается от Service?
Комментарии (3)
Ответ сгенерирован нейросетью и может содержать ошибки
Введение в Ingress и его отличие от Service
В Kubernetes Ingress и Service — это два различных, но взаимодополняющих ресурса, которые решают задачи сетевого доступа к приложениям. В то время как Service обеспечивает внутреннюю балансировку нагрузки и обнаружение сервисов внутри кластера, Ingress управляет внешним доступом к сервисам, предоставляя возможности маршрутизации HTTP/HTTPS трафика, SSL/TLS терминации и виртуального хостинга.
Что такое Ingress?
Ingress — это API-объект Kubernetes, который определяет правила для входящего (ingress) трафика, позволяя внешним клиентам получать доступ к сервисам внутри кластера. Фактически, Ingress действует как интеллектуальный маршрутизатор уровня 7 (HTTP/HTTPS), который направляет запросы к соответствующим сервисам на основе хоста, пути или других атрибутов запроса.
Ключевые возможности Ingress:
- Маршрутизация на основе хоста и пути: Например,
api.example.com→ Service API,app.example.com/static→ Service Static Files - SSL/TLS терминация: Централизованное управление SSL-сертификатами
- Load Balancing: Распределение трафика между подами сервиса
- Виртуальный хостинг: Поддержка нескольких доменов через один IP-адрес
- Аутентификация и авторизация: Интеграция с системами аутентификации
Пример манифеста Ingress:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
tls:
- hosts:
- api.example.com
secretName: tls-secret
rules:
- host: api.example.com
http:
paths:
- path: /users
pathType: Prefix
backend:
service:
name: user-service
port:
number: 80
- path: /products
pathType: Prefix
backend:
service:
name: product-service
port:
number: 80
Что такое Service?
Service — это абстракция, которая определяет логический набор подов и политику доступа к ним. Service обеспечивает стабильную конечную точку (endpoint) для доступа к приложению, даже когда поды создаются, удаляются или перемещаются между нодами.
Основные типы Services:
- ClusterIP: Внутренний IP-адрес, доступный только внутри кластера (по умолчанию)
- NodePort: Открывает порт на каждой ноде кластера
- LoadBalancer: Интегрируется с облачным провайдером для создания внешнего балансировщика нагрузки
- ExternalName: Сопоставляет Service с внешним DNS-именем
Пример манифеста Service:
apiVersion: v1
kind: Service
metadata:
name: user-service
spec:
selector:
app: user-api
ports:
- port: 80
targetPort: 8080
type: ClusterIP
Ключевые различия между Ingress и Service
| Аспект | Service | Ingress |
|---|---|---|
| Уровень работы | Уровень 4 (TCP/UDP) | Уровень 7 (HTTP/HTTPS) |
| Основная функция | Внутренняя балансировка и обнаружение сервисов | Внешняя маршрутизация и управление трафиком |
| Доступность | Встроенный объект Kubernetes | Требует контроллера Ingress |
| SSL/TLS | Ограниченная поддержка | Полноценная SSL/TLS терминация |
| Маршрутизация | Базовая балансировка по IP:порт | Продвинутая маршрутизация по хосту, пути, заголовкам |
| Внешний доступ | Через NodePort или LoadBalancer | Через контроллер Ingress + правила маршрутизации |
Практические сценарии использования
Когда использовать Service:
- Для внутренней коммуникации между микросервисами
- Когда нужно обеспечить стабильную точку доступа к набору подов
- Для простых сценариев внешнего доступа через NodePort или LoadBalancer
- Когда достаточно базовой TCP/UDP балансировки
Когда использовать Ingress:
- Для сложной HTTP/HTTPS маршрутизации
- При необходимости централизованного управления SSL-сертификатами
- Для реализации API Gateway паттерна в кластере
- Когда нужно маршрутизировать трафик на основе доменных имен или URL-путей
- Для реализации canary-развертываний или A/B тестирования через аннотации
Архитектурная интеграция
На практике Ingress и Service работают вместе:
- Ingress Controller (например, Nginx Ingress, Traefik, HAProxy) развертывается в кластере и отслеживает ресурсы Ingress
- При создании Ingress ресурса контроллер конфигурирует балансировщик нагрузки согласно правилам
- Внешний трафик поступает на Ingress Controller
- Ingress Controller анализирует запросы и перенаправляет их на соответствующие Services
- Services, в свою очередь, распределяют трафик между подами приложения
# Пример проверки Ingress и Service
kubectl get ingress
kubectl describe ingress example-ingress
kubectl get svc
kubectl describe svc user-service
Заключение
Ingress и Service — это комплементарные, а не конкурирующие концепции в Kubernetes экосистеме. Service решает задачу внутренней коммуникации и балансировки, предоставляя стабильные endpoint'ы для приложений, в то время как Ingress специализируется на управлении внешним трафиком с расширенными возможностями маршрутизации уровня приложения. В современных production-окружениях эти механизмы обычно используются совместно для построения гибкой, масштабируемой и безопасной сетевой инфраструктуры микросервисных приложений.