Service - это объект Kubernetes, который определяет селектор, порты и тип. Сам по себе Service - просто запись в etcd. Трафик он не обрабатывает🔧
Если чууууть детальней раскрывать определение, то:
Селектор (selector) - набор лейблов, по которым находятся целевые поды
Порты (ports) - какие порты слушать и куда их маппить
Тип (type) - как сервис будет доступен извне (или только внутри кластера)
Как только ты создаёшь Service с селектором, контроллер endpoints автоматически находит все поды, подходящие под этот селектор, и создаёт объект Endpoints (или EndpointSlice в новых версиях). В свою очередь Endpoints - это список реальных IP-адресов и портов подов💻
Интересно, что если под падает или пересоздаётся с новым IP, то Endpoints обновляется автоматически, а Service при этом не меняется
На каждой ноде работает демон kube-proxy. Он следит за изменениями объектов Service и Endpoints через API-server (watch) и локально на ноде обновляет правила маршрутизации
А ещё есть разные типы Service и они все между собой различают
ClusterIP
(по дефолту). Сервис доступен только внутри кластера. Получает виртуальный IP (VIP), который существует только в правилах iptables/IPVS на нодах
NodePort
. Открывает один и тот же порт (30000–32767) на всех нодах кластера. Внешний трафик идёт на <NodeIP>:<NodePort> и дальше DNAT-ится на поды
LoadBalancer
. Автоматически заказывает внешний балансировщик у облачного провайдера (AWS ALB, GCP CLB, Yandex Cloud NLB и т.д.). Внутри кластера ведёт себя как NodePort + ClusterIP
ExternalName
(редкий штука). Не создаёт никаких правил - просто CNAME-запись в DNS, которая перенаправляет на внешний хост
