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

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

Ответ

В Kubernetes есть несколько основных способов обеспечить внешний доступ к приложению. Выбор зависит от среды развертывания (облако или on-prem) и требований к трафику.

Основные методы:

  1. Service типа LoadBalancer

    • Как работает: Kubernetes API взаимодействует с облачным провайдером (AWS, GCP, Azure) для автоматического создания внешнего балансировщика нагрузки. Он получает публичный IP и распределяет трафик на Pod'ы сервиса.
    • Когда использовать: Стандартный способ в облачных средах для TCP/UDP-сервисов.
    • Пример манифеста:
      apiVersion: v1
      kind: Service
      metadata:
        name: my-webapp
      spec:
        type: LoadBalancer
        selector:
          app: my-webapp
        ports:
        - protocol: TCP
          port: 80          # Порт, на который приходит внешний трафик
          targetPort: 8080  # Порт контейнера в Pod
  2. Ingress

    • Как работает: Работает на уровне приложения (L7) для маршрутизации HTTP/HTTPS трафика. Требует установки Ingress-контроллера (например, ingress-nginx, Traefik). Позволяет управлять маршрутами, виртуальными хостами, TLS-терминацией на одном IP.
    • Когда использовать: Для веб-приложений с несколькими сервисами, когда нужны правила маршрутизации по пути или домену, SSL offloading.
    • Пример манифеста:
      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: app-ingress
      spec:
        rules:
        - host: app.example.com
          http:
            paths:
            - path: /api
              pathType: Prefix
              backend:
                service:
                  name: api-service
                  port:
                    number: 80
            - path: /
              pathType: Prefix
              backend:
                service:
                  name: frontend-service
                  port:
                    number: 80
  3. Service типа NodePort

    • Как работает: Открывает статический порт (в диапазоне 30000-32767) на каждой ноде кластера. Трафик на <NODE_IP>:<NODEPORT> перенаправляется на сервис.
    • Когда использовать: Для тестирования, демонстраций, или в on-prem средах, где есть внешний балансировщик, который можно настроить на эти порты вручную.
    • Недостаток: Требует управления доступом к IP-адресам нод и может быть небезопасно.
  4. ExternalName и ExternalIPs (менее распространенные)

    • ExternalName: Сервис выступает как CNAME-запись для внешнего DNS имени. Не проксирует трафик внутри кластера.
    • ExternalIPs: Ручное назначение IP-адресов (которые маршрутизируются к нодам кластера) сервису. Требует ручного управления IP.

Практический выбор:

  • В облаке для веб-сервисов: Ingress (чаще) или LoadBalancer (проще, но по одному на сервис).
  • В on-prem: Установить Ingress-контроллер (например, nginx) и использовать Ingress, либо использовать NodePort вместе с внешним hardware/software балансировщиком (HAProxy, F5).