Что такое ClusterIP в Kubernetes?

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

Ответ

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.