Как идут запросы извне к микросервису в Kubernetes

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

Ответ

В моих проектах внешний трафик попадает к микросервисам в Kubernetes по четкому пути, который мы проектируем для безопасности, управляемости и отказоустойчивости.

Типичный путь запроса из интернета:

  1. Внешний балансировщик нагрузки (L4): Запрос приходит на публичный IP-адрес, управляемый облачным LoadBalancer (AWS ALB/NLB, GCP Load Balancer). Этот балансировщик создается Kubernetes Service типа LoadBalancer или, чаще, нашим Ingress-контроллером.

  2. Ingress-контроллер (L7): Балансировщик направляет HTTP/HTTPS трафик на Pod'ы Ingress-контроллера (например, ingress-nginx). Ingress-контроллер — это просто еще один Deployment в кластере.

  3. Ingress-ресурс (правила маршрутизации): Контроллер читает правила из Ingress-ресурсов Kubernetes. Эти правила определяют, какой домен/путь какому внутреннему Service'у соответствует.

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: api-ingress
      annotations:
        cert-manager.io/cluster-issuer: "letsencrypt-prod" # Автоматический TLS
    spec:
      tls:
      - hosts:
        - api.mycompany.com
        secretName: api-tls-secret
      rules:
      - host: api.mycompany.com
        http:
          paths:
          - path: /users
            pathType: Prefix
            backend:
              service:
                name: user-service
                port:
                  number: 80
  4. Service (абстракция над Pod'ами): Ingress-контроллер направляет запрос на ClusterIP Service user-service. Service, используя метки (labels), находит все здоровые Pod'ы с микросервисом user-service и балансирует трафик между ними.

  5. Pod (конечная точка): Запрос достигает одного из контейнеров в Pod'е, где и обрабатывается микросервисом.

Важные детали реализации:

  • TLS-терминация обычно происходит на Ingress-контроллере, разгружая микросервисы.
  • Для gRPC или TCP-сервисов мы можем использовать Service типа LoadBalancer напрямую или специализированные Ingress-контроллеры (например, ingress-nginx с аннотацией nginx.ingress.kubernetes.io/backend-protocol: GRPC).
  • Мы используем Network Policies для ограничения трафика между неймспейсами и подами.