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