Какие виды Service вы знаете в Kubernetes и в каких случаях они применяются?

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

Ответ

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

Основные типы и сценарии их использования:

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

    • Применение: Для внутренней коммуникации между микросервисами внутри кластера. Например, сервису backend нужно обратиться к сервису database.
      apiVersion: v1
      kind: Service
      metadata:
      name: internal-api-service
      spec:
      type: ClusterIP
      selector:
      app: backend-api
      ports:
      - port: 80          # Порт самого Service
        targetPort: 8080  # Порт на Pod'ах
  2. NodePort

    • Применение: Для доступа к сервису снаружи кластера на этапе разработки или демонстрации, либо когда нет облачного LoadBalancer. Открывает статический порт (30000-32767) на каждой ноде.
      spec:
      type: NodePort
      ports:
      - port: 80
        targetPort: 8080
        nodePort: 31000 # (опционально) Можно зафиксировать порт.
  3. LoadBalancer

    • Применение: Стандартный способ вывести сервис в интернет в облачных средах (AWS, GCP, Azure). Провайдер автоматически создает внешний балансировщик нагрузки.
      spec:
      type: LoadBalancer
      # В аннотациях можно задать специфичные для облака настройки
      # metadata:
      #   annotations:
      #     service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
  4. Headless Service (Без ClusterIP)

    • Применение: Когда нужен прямой доступ к каждому Pod'у, минуя балансировку (например, для StatefulSets типа кластера Cassandra или Kafka). DNS-запрос к такому сервису вернет IP-адреса всех Pod'ов.
      spec:
      clusterIP: None # Ключевой параметр
      selector:
      app: stateful-db
  5. ExternalName

    • Применение: Для создания CNAME-алиаса внутри кластера на внешний сервис (например, legacy БД за пределами k8s). Это не прокси, а просто перенаправление DNS.
      spec:
      type: ExternalName
      externalName: legacy-mysql.prod.company.com

Выбор типа — это всегда компромисс между требованиями безопасности, доступности и архитектуры приложения.