Ответ
Service в Kubernetes — это абстракция, которая определяет устойчивую конечную точку для доступа к логическому набору Pod'ов. Его основная цель — обеспечить сетевое взаимодействие с динамически меняющимся набором рабочих нагрузок.
Решаемые проблемы:
- Динамические IP-адреса Pod'ов: При пересоздании Pod получает новый IP.
- Масштабирование: Несколько реплик Pod'ов должны быть доступны через единую точку входа.
- Балансировка нагрузки: Трафик должен распределяться между всеми здоровыми Pod'ами.
Типы Service и их назначение:
-
ClusterIP (тип по умолчанию): Создает внутренний виртуальный IP, доступный только внутри кластера. Используется для связи между микросервисами.
apiVersion: v1 kind: Service metadata: name: backend-service spec: type: ClusterIP selector: app: backend-api ports: - port: 80 # Порт, на котором Service доступен внутри кластера targetPort: 3000 # Порт контейнера в Pod -
NodePort: Открывает статический порт на КАЖДОМ узле кластера (Node). Трафик на
NodeIP:NodePortперенаправляется в Service. Используется для доступа извне в dev-средах или когда нет Ingress/LoadBalancer. -
LoadBalancer: Интегрируется с облачным провайдером (AWS ELB, GCP Load Balancer) для создания внешнего балансировщика нагрузки, который автоматически направляет трафик в Service. Стандартный способ выхода в интернет.
-
Headless: Создается путем явного указания
clusterIP: None. Возвращает DNS-записи, указывающие непосредственно на IP-адреса Pod'ов, минуя прокси и балансировку. Критично для StatefulSet (например, для кластеров БД).
Как это работает: Service постоянно отслеживает Pod'ы через selector и поддерживает актуальный список их IP-адресов в объекте Endpoints. Внутренний компонент kube-proxy на каждой ноде настраивает правила (iptables/IPVS) для перенаправления трафика на эти IP-адреса.