Ответ
В Kubernetes есть несколько основных способов обеспечить внешний доступ к приложению. Выбор зависит от среды развертывания (облако или on-prem) и требований к трафику.
Основные методы:
-
Service типа LoadBalancer
- Как работает: Kubernetes API взаимодействует с облачным провайдером (AWS, GCP, Azure) для автоматического создания внешнего балансировщика нагрузки. Он получает публичный IP и распределяет трафик на Pod'ы сервиса.
- Когда использовать: Стандартный способ в облачных средах для TCP/UDP-сервисов.
- Пример манифеста:
apiVersion: v1 kind: Service metadata: name: my-webapp spec: type: LoadBalancer selector: app: my-webapp ports: - protocol: TCP port: 80 # Порт, на который приходит внешний трафик targetPort: 8080 # Порт контейнера в Pod
-
Ingress
- Как работает: Работает на уровне приложения (L7) для маршрутизации HTTP/HTTPS трафика. Требует установки Ingress-контроллера (например, ingress-nginx, Traefik). Позволяет управлять маршрутами, виртуальными хостами, TLS-терминацией на одном IP.
- Когда использовать: Для веб-приложений с несколькими сервисами, когда нужны правила маршрутизации по пути или домену, SSL offloading.
- Пример манифеста:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: app-ingress spec: rules: - host: app.example.com http: paths: - path: /api pathType: Prefix backend: service: name: api-service port: number: 80 - path: / pathType: Prefix backend: service: name: frontend-service port: number: 80
-
Service типа NodePort
- Как работает: Открывает статический порт (в диапазоне 30000-32767) на каждой ноде кластера. Трафик на
<NODE_IP>:<NODEPORT>перенаправляется на сервис. - Когда использовать: Для тестирования, демонстраций, или в on-prem средах, где есть внешний балансировщик, который можно настроить на эти порты вручную.
- Недостаток: Требует управления доступом к IP-адресам нод и может быть небезопасно.
- Как работает: Открывает статический порт (в диапазоне 30000-32767) на каждой ноде кластера. Трафик на
-
ExternalName и ExternalIPs (менее распространенные)
- ExternalName: Сервис выступает как CNAME-запись для внешнего DNS имени. Не проксирует трафик внутри кластера.
- ExternalIPs: Ручное назначение IP-адресов (которые маршрутизируются к нодам кластера) сервису. Требует ручного управления IP.
Практический выбор:
- В облаке для веб-сервисов: Ingress (чаще) или LoadBalancer (проще, но по одному на сервис).
- В on-prem: Установить Ingress-контроллер (например, nginx) и использовать Ingress, либо использовать NodePort вместе с внешним hardware/software балансировщиком (HAProxy, F5).