Ответ
Service в Kubernetes — это абстракция, предоставляющая стабильную конечную точку для доступа к набору Pod'ов. Основные типы:
-
ClusterIP (тип по умолчанию)
- Сервису назначается внутренний IP-адрес, доступный только внутри кластера.
- Использование: Связь между микросервисами внутри кластера.
apiVersion: v1 kind: Service metadata: name: my-internal-service spec: selector: app: myapp ports: - protocol: TCP port: 80 targetPort: 9376 # type: ClusterIP (можно не указывать, это значение по умолчанию)
-
NodePort
- Расширяет ClusterIP. Открывает статический порт (в диапазоне 30000-32767) на каждой ноде кластера. Трафик на
:<NodePort>любой ноды перенаправляется в сервис. - Использование: Для доступа извне кластера в dev-средах или когда нет внешнего Load Balancer.
spec: type: NodePort ports: - port: 80 targetPort: 9376 nodePort: 30007 # Опционально. Если не задан, будет выбран случайный.
- Расширяет ClusterIP. Открывает статический порт (в диапазоне 30000-32767) на каждой ноде кластера. Трафик на
-
LoadBalancer
- Расширяет NodePort. При развертывании в облаке (AWS, GCP, Azure) автоматически создает внешний балансировщик нагрузки, который направляет трафик на сервис.
- Использование: Стандартный способ выставить сервис в интернет в облачных средах.
spec: type: LoadBalancer # Облачный провайдер автоматически создаст балансировщик и назначит внешний IP.
-
ExternalName
- Специальный тип, который не использует селекторы. Вместо этого возвращает CNAME-запись с указанным именем (
externalName). - Использование: Предоставление кластерному приложению доступа к внешнему сервису через DNS-псевдоним.
spec: type: ExternalName externalName: my.database.example.com
- Специальный тип, который не использует селекторы. Вместо этого возвращает CNAME-запись с указанным именем (
-
Headless Service
- Не является отдельным типом. Это Service с явно заданным
clusterIP: None. DNS-запрос к такому сервису возвращает не один IP (ClusterIP), а IP-адреса всех Pod'ов, отобранных сервисом. - Использование: Для прямого подключения к конкретным Pod'ам, например, в stateful-приложениях (базы данных) или при использовании сторонних механизмов балансировки (например, DNS-раунд-робин).
spec: clusterIP: None # Это делает сервис headless. selector: app: stateful-app
- Не является отдельным типом. Это Service с явно заданным