Три основных типа сервисов для предоставления сетевого доступа в Kubernetes

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

Ответ

В Kubernetes три основных типа Service для управления доступом к подам:

  1. ClusterIP — сервис по умолчанию. Создает внутренний, стабильный IP-адрес, доступный только внутри кластера. Используется для внутренней коммуникации между компонентами.

    apiVersion: v1
    kind: Service
    metadata:
      name: my-internal-service
    spec:
      type: ClusterIP
      selector:
        app: my-app
      ports:
        - port: 80
          targetPort: 9376
  2. NodePort — открывает статический порт (в диапазоне 30000-32767) на IP-адресе каждой ноды (Node) кластера. Трафик на <NodeIP>:<NodePort> перенаправляется в сервис. Используется для простого внешнего доступа, например, в dev-средах или для сервисов, не требующих балансировки извне.

    apiVersion: v1
    kind: Service
    metadata:
      name: my-nodeport-service
    spec:
      type: NodePort
      selector:
        app: my-app
      ports:
        - port: 80
          targetPort: 9376
          nodePort: 30007 # Опционально. Если не указан, будет выбран случайный.
  3. LoadBalancer — стандартный способ для публикации сервиса в облачных средах (AWS, GCP, Azure). Kubernetes API взаимодействует с провайдером, который автоматически создает внешний балансировщик нагрузки и назначает ему внешний IP-адрес. Весь входящий трафик идет на балансировщик, который распределяет его по подам.

    apiVersion: v1
    kind: Service
    metadata:
      name: my-loadbalancer
    spec:
      type: LoadBalancer
      selector:
        app: my-app
      ports:
        - port: 80
          targetPort: 9376

Дополнительные типы и уточнения:

  • ExternalName — маппит сервис на внешнее DNS-имя (CNAME). Полезно для интеграции с внешними сервисами.
  • Ingress — не является типом Service, а представляет собой отдельный объект API. Ingress — это более гибкий и мощный способ управлять внешним HTTP/HTTPS доступом, предоставляющий маршрутизацию на основе хостов и путей, SSL/TLS-терминацию. Для работы Ingress требуется контроллер Ingress (например, nginx-ingress, traefik).