Ответ
ClusterIP — это тип сервиса Kubernetes по умолчанию и стабильный внутренний IP-адрес (виртуальный), который назначается такому сервису. Его основная задача — обеспечить discoverability и балансировку нагрузки между подами одного приложения внутри кластера. Вне кластера этот IP не маршрутизируется.
Как я использовал это на практике:
Допустим, есть Deployment с тремя подами backend-приложения. Каждый под имеет свой мимолетный IP. Другим микросервисам (например, frontend) не нужно знать эти IP. Вместо этого они обращаются к единому DNS-имени сервиса типа ClusterIP (например, backend-service.my-namespace.svc.cluster.local). kube-proxy на каждой ноде (работающий в режиме iptables или ipvs) перехватывает этот запрос и распределяет его на один из IP-адресов подов.
Пример манифеста и как с ним работать:
apiVersion: v1
kind: Service
metadata:
name: api-service
spec:
selector:
app: api # Селектор ищет поды с этой меткой
ports:
- name: http
protocol: TCP
port: 80 # Порт, на котором сервис доступен внутри кластера
targetPort: 8080 # Порт контейнера в поде
type: ClusterIP # Можно не указывать, это значение по умолчанию
После применения:
- Сервису будет выдан стабильный IP из диапазона
service-cluster-ip-range(например,10.96.10.5). - Другие поды могут обращаться к нему по
http://api-service(если в том же namespace) или по полному доменному имени. - Это основа для service mesh (например, Istio), которые внедряют свои sidecar-прокси между сервисами.
Важный нюанс: Для доступа извне кластера поверх ClusterIP-сервиса необходимо создать ресурс Ingress (который направляет внешний трафик на этот сервис) или использовать сервисы типов NodePort / LoadBalancer.