Короткий ответ
Service даёт стабильный сетевой адрес (имя и/или виртуальный IP) и балансировку нагрузки для группы Pod, чьи IP-адреса меняются при каждом пересоздании — без Service клиентам пришлось бы вручную отслеживать актуальные IP подов.
Как это работает подробнее
Service выбирает Pod по selector с метками и формирует список endpoint'ов (объект Endpoints/EndpointSlice), на который kube-proxy настраивает правила перенаправления трафика (iptables или IPVS) на уровне узла; DNS внутри кластера (CoreDNS) резолвит имя Service в его ClusterIP.
Пример кода
manifest.yaml
apiVersion: v1
kind: Service
metadata:
name: web
spec:
selector: { app: web }
ports:
- port: 80
targetPort: 8080Что использовать на практике
- Практика. приложения обращаются к другим сервисам по доменному имени вида
service-name.namespace.svc.cluster.local, а не по IP конкретного Pod; при масштабировании или пересоздании Pod список endpoint'ов обновляется автоматически, и клиенту не нужно ничего менять.
Подводные камни
- Риски. обращаться к Pod напрямую по IP в коде приложения; забывать, что Service балансирует только между Pod, у которых есть хотя бы один прошедший readiness probe; несовпадение меток в
selectorService иlabelsв шаблоне Pod — самая частая причина "сервис не находит под".