Короткий ответ
ClusterIP (по умолчанию) доступен только внутри кластера; NodePort дополнительно открывает один и тот же порт на всех узлах кластера наружу; LoadBalancer запрашивает у облачного провайдера внешний балансировщик, который направляет трафик на NodePort.
Как это работает подробнее
ClusterIP создаёт виртуальный IP, маршрутизируемый только внутри кластерной сети. NodePort включает в себя ClusterIP и дополнительно резервирует порт (по умолчанию из диапазона 30000–32767) на каждом узле, перенаправляя внешний трафик на сервис. LoadBalancer — надстройка над NodePort: облачный контроллер создаёт внешний балансировщик (например, AWS ELB), который слушает публичный адрес и шлёт трафик на NodePort узлов.
Пример кода
manifest.yaml
apiVersion: v1
kind: Service
metadata:
name: web-public
spec:
type: LoadBalancer
selector: { app: web }
ports:
- port: 80
targetPort: 8080Что использовать на практике
- Практика.
ClusterIPиспользуют для внутренних сервисов (базы данных, внутренние API);NodePort— редко напрямую, чаще как механизм для Ingress-контроллера или в кластерах без облачного балансировщика (bare-metal);LoadBalancer— для публичного входа в облаке, но каждый такой сервис обычно создаёт отдельный платный балансировщик у провайдера.
Подводные камни
- Риски. создавать
LoadBalancerдля каждого внутреннего микросервиса, что приводит к лишним расходам — для внешнего трафика к множеству сервисов обычно нужен один Ingress; забывать, чтоNodePortоткрывает порт на всех узлах независимо от того, где физически работает под; путатьLoadBalancerс Ingress, хотя это разные уровни (L4 vs L7).