Какие типы сервисов (Service) существуют в Kubernetes?

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

Ответ

Service в Kubernetes — это абстракция, предоставляющая стабильную конечную точку для доступа к набору Pod'ов. Основные типы:

  • ClusterIP (тип по умолчанию)

    • Сервису назначается внутренний IP-адрес, доступный только внутри кластера.
    • Использование: Связь между микросервисами внутри кластера.
      apiVersion: v1
      kind: Service
      metadata:
      name: my-internal-service
      spec:
      selector:
      app: myapp
      ports:
      - protocol: TCP
        port: 80
        targetPort: 9376
      # type: ClusterIP (можно не указывать, это значение по умолчанию)
  • NodePort

    • Расширяет ClusterIP. Открывает статический порт (в диапазоне 30000-32767) на каждой ноде кластера. Трафик на :<NodePort> любой ноды перенаправляется в сервис.
    • Использование: Для доступа извне кластера в dev-средах или когда нет внешнего Load Balancer.
      spec:
      type: NodePort
      ports:
      - port: 80
      targetPort: 9376
      nodePort: 30007 # Опционально. Если не задан, будет выбран случайный.
  • LoadBalancer

    • Расширяет NodePort. При развертывании в облаке (AWS, GCP, Azure) автоматически создает внешний балансировщик нагрузки, который направляет трафик на сервис.
    • Использование: Стандартный способ выставить сервис в интернет в облачных средах.
      spec:
      type: LoadBalancer
      # Облачный провайдер автоматически создаст балансировщик и назначит внешний IP.
  • ExternalName

    • Специальный тип, который не использует селекторы. Вместо этого возвращает CNAME-запись с указанным именем (externalName).
    • Использование: Предоставление кластерному приложению доступа к внешнему сервису через DNS-псевдоним.
      spec:
      type: ExternalName
      externalName: my.database.example.com
  • Headless Service

    • Не является отдельным типом. Это Service с явно заданным clusterIP: None. DNS-запрос к такому сервису возвращает не один IP (ClusterIP), а IP-адреса всех Pod'ов, отобранных сервисом.
    • Использование: Для прямого подключения к конкретным Pod'ам, например, в stateful-приложениях (базы данных) или при использовании сторонних механизмов балансировки (например, DNS-раунд-робин).
      spec:
      clusterIP: None # Это делает сервис headless.
      selector:
      app: stateful-app