Ответ
Для маршрутизации внешнего трафика к разным наборам подов (Pods) на основе доменного имени используется ресурс Ingress вместе с контроллером, например, Nginx Ingress Controller.
Принцип работы:
- В кластере развернут
ingress-nginxDeployment/Service (часто типаLoadBalancerилиNodePort). - Внешний DNS (
app1.example.com,app2.example.com) указывает на IP этого контроллера. - Ingress-ресурс с правилами
hostсообщает контроллеру, какому внутреннему Kubernetes Service направить запрос. - Service, в свою очередь, распределяет трафик на соответствующие Pods по селекторам меток (labels).
Пример манифеста Ingress:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: multi-domain-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
# Трафик для app1.example.com идет в Service `app1-service`
- host: app1.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: app1-service
port:
number: 80
# Трафик для app2.example.com идет в Service `app2-service`
- host: app2.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: app2-service
port:
number: 8080
Практические шаги и нюансы:
- Установка контроллера: Обычно выполняется через Helm (
helm install ingress-nginx ingress-nginx/ingress-nginx) или манифесты. - TLS/HTTPS: Для включения HTTPS в Ingress добавляется секция
tlsсо ссылкой на Secret, содержащий TLS-сертификат. - Проверка: После применения манифеста можно проверить конфигурацию Nginx внутри контроллера:
kubectl exec -n ingress-nginx <ingress-nginx-pod-name> -- cat /etc/nginx/nginx.conf - Канареечные релизы (Canary): Nginx Ingress поддерживает аннотации для постепенного направления части трафика на новую версию приложения, что полезно для развертывания.