Какие способы вывода приложения из Kubernetes наружу вы знаете?

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

Ответ

Для экспозиции сервисов Kubernetes во внешний мир существует несколько основных механизмов, выбор которых зависит от требований к доступу, безопасности и инфраструктуре.

Основные типы Service и Ingress:

  1. Service: NodePort Открывает статический порт (в диапазоне 30000-32767) на каждой ноде кластера. Трафик на этот порт любой ноды перенаправляется в сервис. Подходит для разработки, демонстраций или когда у вас нет внешнего балансировщика.

    apiVersion: v1
    kind: Service
    metadata:
      name: my-nodeport-service
    spec:
      type: NodePort
      selector:
        app: my-app
      ports:
        - port: 80        # Порт самого Service
          targetPort: 8080 # Порт Pod'а
          nodePort: 30007  # (Опционально) Фиксированный порт на нодах

    После этого приложение будет доступно по <NODE_IP>:30007.

  2. Service: LoadBalancer Стандартный способ в облачных средах. При создании такого сервиса cloud-controller-manager автоматически запрашивает у облачного провайдера (AWS, GCP, Azure) создание внешнего балансировщика нагрузки, который распределяет трафик между нодами. Это просто, но каждый сервис получает свой внешний IP и балансировщик, что может быть дорого.

    apiVersion: v1
    kind: Service
    metadata:
      name: my-loadbalancer-service
    spec:
      type: LoadBalancer
      selector:
        app: my-app
      ports:
        - port: 80
          targetPort: 8080
  3. Ingress Это не тип сервиса, а отдельный ресурс API, который управляет внешним доступом к сервисам кластера, обычно по HTTP/HTTPS. Он предоставляет функциональность балансировки нагрузки, SSL/TLS-терминации и виртуального хостинга на основе имени или пути. Для работы требуется запущенный Ingress Controller (например, ingress-nginx, Traefik, AWS ALB Ingress Controller).

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: my-app-ingress
    spec:
      rules:
      - host: myapp.example.com
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: my-web-service
                port:
                  number: 80

    Ingress — наиболее гибкий и рекомендуемый для продакшена способ для веб-приложений.

Дополнительные и вспомогательные методы:

  • Service: ExternalName: Создает сервис, который действует как CNAME-запись для внешнего сервиса за пределами кластера (например, my-database.example.com). Используется для абстракции внешних зависимостей.
  • kubectl port-forward: Команда для быстрой отладки, которая создает безопасный туннель с локальной машины к Pod'у или сервису внутри кластера. Не предназначен для продакшен-доступа.

Эволюция доступа: Часто используется комбинация: Ingress Controller сам создает сервис типа LoadBalancer, который получает внешний IP. Весь внешний HTTP/HTTPS-трафик идет на этот IP, а Ingress правила внутри кластера маршрутизируют его до нужных сервисов типа ClusterIP.