В чем разница между типами сервисов NodePort и ClusterIP в Kubernetes?

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

Ответ

ClusterIP и NodePort — это два фундаментальных типа Service в Kubernetes, обеспечивающих доступ к подам (Pods).

ClusterIP (Тип по умолчанию):

  • Назначение: Обеспечить внутреннюю связь между компонентами внутри кластера.
  • Как работает: Kubernetes назначает сервису стабильный внутренний IP-адрес (виртуальный, из диапазона кластера). Другие поды или сервисы внутри кластера могут обращаться к этому IP-адресу (или DNS-имени сервиса). Доступа извне кластера нет.
  • Пример манифеста:
    apiVersion: v1
    kind: Service
    metadata:
      name: backend-service
    spec:
      type: ClusterIP # Можно не указывать, это значение по умолчанию
      selector:
        app: backend
      ports:
        - protocol: TCP
          port: 80        # Порт, на котором сервис доступен внутри кластера
          targetPort: 8080 # Порт контейнера в поде

NodePort:

  • Назначение: Предоставить внешний доступ к сервису напрямую через IP-адрес любого узла (Node) кластера.
  • Как работает: Kubernetes, помимо создания внутреннего ClusterIP, открывает один и тот же порт (в диапазоне 30000-32767) на каждом узле кластера. Трафик, пришедший на :<NodePort> любого узла, перенаправляется в сервис, а затем в под.
  • Пример манифеста:
    apiVersion: v1
    kind: Service
    metadata:
      name: frontend-nodeport
    spec:
      type: NodePort
      selector:
        app: frontend
      ports:
        - protocol: TCP
          port: 80          # Порт сервиса (ClusterIP)
          targetPort: 3000  # Порт контейнера
          nodePort: 31000   # (Опционально) Фиксируем порт на узлах. Если не указать, будет выбран случайный.

    Доступ извне: http://<IP_любого_узла_кластера>:31000

Ключевые отличия:

  1. Область видимости: ClusterIP — только внутри кластера. NodePort — извне, через узлы.
  2. Порты: ClusterIP использует только внутренние порты кластера. NodePort открывает высокоуровневый порт на физических/виртуальных машинах узлов.
  3. Использование: ClusterIP — для связи микросервисов (бэкенд -> бэкенд). NodePort — для простого внешнего доступа в dev-средах или когда нет Ingress/LoadBalancer. В production для HTTP/HTTPS поверх NodePort обычно ставят Ingress-контроллер или внешний балансировщик.