Что такое Headless Service в Kubernetes?

«Что такое Headless Service в Kubernetes?» — вопрос из категории Kubernetes, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Headless Service — это специальный тип Kubernetes Service, у которого явно задано clusterIP: None. В отличие от обычного Service, он не получает виртуальный IP-адрес и не выполняет балансировку трафика на уровне kube-proxy. Вместо этого DNS-запрос к его имени возвращает набор DNS A-записей, напрямую указывающих на IP-адреса всех Pod'ов, соответствующих селектору сервиса.

Основные сценарии использования из моей практики:

  1. Stateful-приложения (например, кластеры БД): Каждому поду (ноде) нужна уникальная идентичность и прямое подключение. Например, для настройки репликации между инстансами PostgreSQL.
  2. 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-сервисов.