Ответ
В моих проектах внешний трафик попадает к микросервисам в Kubernetes по четкому пути, который мы проектируем для безопасности, управляемости и отказоустойчивости.
Типичный путь запроса из интернета:
-
Внешний балансировщик нагрузки (L4): Запрос приходит на публичный IP-адрес, управляемый облачным LoadBalancer (AWS ALB/NLB, GCP Load Balancer). Этот балансировщик создается Kubernetes Service типа
LoadBalancerили, чаще, нашим Ingress-контроллером. -
Ingress-контроллер (L7): Балансировщик направляет HTTP/HTTPS трафик на Pod'ы Ingress-контроллера (например, ingress-nginx). Ingress-контроллер — это просто еще один Deployment в кластере.
-
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 -
Service (абстракция над Pod'ами): Ingress-контроллер направляет запрос на ClusterIP Service
user-service. Service, используя метки (labels), находит все здоровые Pod'ы с микросервисом user-service и балансирует трафик между ними. -
Pod (конечная точка): Запрос достигает одного из контейнеров в Pod'е, где и обрабатывается микросервисом.
Важные детали реализации:
- TLS-терминация обычно происходит на Ingress-контроллере, разгружая микросервисы.
- Для gRPC или TCP-сервисов мы можем использовать Service типа
LoadBalancerнапрямую или специализированные Ingress-контроллеры (например, ingress-nginx с аннотациейnginx.ingress.kubernetes.io/backend-protocol: GRPC). - Мы используем Network Policies для ограничения трафика между неймспейсами и подами.