Ответ
Для экспозиции сервисов Kubernetes во внешний мир существует несколько основных механизмов, выбор которых зависит от требований к доступу, безопасности и инфраструктуре.
Основные типы Service и Ingress:
-
Service: NodePort Открывает статический порт (в диапазоне 30000-32767) на каждой ноде кластера. Трафик на этот порт любой ноды перенаправляется в сервис. Подходит для разработки, демонстраций или когда у вас нет внешнего балансировщика.
apiVersion: v1 kind: Service metadata: name: my-nodeport-service spec: type: NodePort selector: app: my-app ports: - port: 80 # Порт самого Service targetPort: 8080 # Порт Pod'а nodePort: 30007 # (Опционально) Фиксированный порт на нодахПосле этого приложение будет доступно по
<NODE_IP>:30007. -
Service: LoadBalancer Стандартный способ в облачных средах. При создании такого сервиса cloud-controller-manager автоматически запрашивает у облачного провайдера (AWS, GCP, Azure) создание внешнего балансировщика нагрузки, который распределяет трафик между нодами. Это просто, но каждый сервис получает свой внешний IP и балансировщик, что может быть дорого.
apiVersion: v1 kind: Service metadata: name: my-loadbalancer-service spec: type: LoadBalancer selector: app: my-app ports: - port: 80 targetPort: 8080 -
Ingress Это не тип сервиса, а отдельный ресурс API, который управляет внешним доступом к сервисам кластера, обычно по HTTP/HTTPS. Он предоставляет функциональность балансировки нагрузки, SSL/TLS-терминации и виртуального хостинга на основе имени или пути. Для работы требуется запущенный Ingress Controller (например, ingress-nginx, Traefik, AWS ALB Ingress Controller).
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-app-ingress spec: rules: - host: myapp.example.com http: paths: - path: / pathType: Prefix backend: service: name: my-web-service port: number: 80Ingress — наиболее гибкий и рекомендуемый для продакшена способ для веб-приложений.
Дополнительные и вспомогательные методы:
- Service: ExternalName: Создает сервис, который действует как CNAME-запись для внешнего сервиса за пределами кластера (например,
my-database.example.com). Используется для абстракции внешних зависимостей. kubectl port-forward: Команда для быстрой отладки, которая создает безопасный туннель с локальной машины к Pod'у или сервису внутри кластера. Не предназначен для продакшен-доступа.
Эволюция доступа: Часто используется комбинация: Ingress Controller сам создает сервис типа LoadBalancer, который получает внешний IP. Весь внешний HTTP/HTTPS-трафик идет на этот IP, а Ingress правила внутри кластера маршрутизируют его до нужных сервисов типа ClusterIP.