Короткий ответ
Headless Service (clusterIP: None) даёт каждому Pod StatefulSet собственную стабильную DNS-запись вместо единого виртуального IP с балансировкой, что нужно для прямой адресации конкретного экземпляра (например, primary в кластере БД); volumeClaimTemplates обеспечивает каждому порядковому Pod свой персональный PVC, который сохраняется и переподключается при пересоздании Pod с тем же именем.
Как это работает подробнее
обычный Service скрывает индивидуальные Pod за балансировкой, что не подходит, когда клиенту важно обратиться именно к конкретному экземпляру (например, к primary узлу репликации). Headless Service вместо виртуального IP возвращает через DNS список A-записей (или SRV) на все Pod, а в сочетании со StatefulSet каждый Pod получает дополнительно отдельное стабильное имя вида <pod>.<service>.<namespace>.svc.cluster.local. volumeClaimTemplates гарантирует, что при пересоздании db-1 (например, после удаления) новый под снова подключит тот же PVC data-db-1, а не получит пустой том.
Пример кода
apiVersion: v1
kind: Service
metadata: { name: kafka }
spec:
clusterIP: None
selector: { app: kafka }
ports: [{ port: 9092 }]Что использовать на практике
- Практика. эта комбинация — основа для развёртывания кластеризованных систем (etcd, Kafka, Postgres с репликацией), где identity и данные конкретного узла должны сохраняться между перезапусками. Приложение-клиент или sidecar обычно сам реализует логику поиска текущего primary через DNS-запросы ко всем Pod или через механизм выбора лидера.
Подводные камни
- Риски. использовать обычный (не headless) Service со StatefulSet и удивляться, что нельзя обратиться к конкретной реплике напрямую; удалять StatefulSet с параметром, который также удаляет PVC (в зависимости от версии и настроек
persistentVolumeClaimRetentionPolicy), теряя данные, которые предполагалось сохранить.