Ответ
Headless Service — это специальный тип Kubernetes Service, у которого явно задано clusterIP: None. В отличие от обычного Service, он не получает виртуальный IP-адрес и не выполняет балансировку трафика на уровне kube-proxy. Вместо этого DNS-запрос к его имени возвращает набор DNS A-записей, напрямую указывающих на IP-адреса всех Pod'ов, соответствующих селектору сервиса.
Основные сценарии использования из моей практики:
- Stateful-приложения (например, кластеры БД): Каждому поду (ноде) нужна уникальная идентичность и прямое подключение. Например, для настройки репликации между инстансами PostgreSQL.
- Peer Discovery: Когда приложениям внутри кластера необходимо находить друг друга напрямую, без промежуточного прокси. Часто используется в рамках StatefulSet.
Пример манифеста Headless Service для StatefulSet:
apiVersion: v1
kind: Service
metadata:
name: cassandra
spec:
clusterIP: None # Ключевой параметр для headless-сервиса
selector:
app: cassandra
ports:
- port: 9042
name: cql
Как это работает:
- При запросе DNS имени
cassandra.default.svc.cluster.localбудет возвращен список всех IP-адресов подов с меткойapp: cassandra. - Pod'ы StatefulSet получают стабильные DNS-имена вида
cassandra-0.cassandra.default.svc.cluster.local, что позволяет им находить друг друга для формирования кластера.
Важно: Клиентское приложение должно самостоятельно реализовывать логику выбора конкретного пода или балансировки нагрузки между ними, так как Kubernetes этого не обеспечивает для headless-сервисов.