Что такое Service и какие типы существуют?
Service — абстракция, которая определяет логическую группу Pod’ов и политику доступа к ним. Обеспечивает стабильный сетевой эндпоинт (IP-адрес и DNS-имя) для набора Pod’ов, даже если сами Pod’ы пересоздаются и их IP-адреса меняются.
Зачем нужен Service
Pod’ы эфемерны — они могут быть уничтожены и созданы заново с другим IP. Service решает эту проблему, предоставляя постоянный адрес и балансировку нагрузки.
Типы Service
| Тип | Доступность | Использование | Особенности |
|---|---|---|---|
| ClusterIP (по умолчанию) | Только внутри кластера | Взаимодействие микросервисов | Виртуальный IP, доступный по DNS |
| NodePort | Извне через IP ноды | Тестирование, dev-окружения | Порт 30000-32767 на каждой ноде |
| LoadBalancer | Извне через балансировщик | Продакшен в облаке | Создаёт внешний LB (AWS ELB, GCP LB) |
| ExternalName | DNS-алиас | Доступ к внешним сервисам | Возвращает CNAME, не создаёт прокси |
Примеры манифестов для каждого типа Service
ClusterIP:
apiVersion: v1
kind: Service
metadata:
name: my-java-app-service
spec:
type: ClusterIP
selector:
app: my-java-app
ports:
- port: 80
targetPort: 8080
Другие сервисы в кластере обращаются по адресу http://my-java-app-service:80 или http://my-java-app-service.namespace.svc.cluster.local:80.
NodePort:
apiVersion: v1
kind: Service
metadata:
name: my-java-app-nodeport
spec:
type: NodePort
selector:
app: my-java-app
ports:
- port: 80
targetPort: 8080
nodePort: 30080
LoadBalancer:
apiVersion: v1
kind: Service
metadata:
name: my-java-app-lb
spec:
type: LoadBalancer
selector:
app: my-java-app
ports:
- port: 80
targetPort: 8080
ExternalName:
apiVersion: v1
kind: Service
metadata:
name: external-db
spec:
type: ExternalName
externalName: database.example.com
На собеседовании: нужно перечислить 4 типа Service и сказать, когда какой использовать. Частая ошибка — не знать, что ClusterIP создаётся по умолчанию, или путать NodePort с LoadBalancer.