Ошибка при открытии нескольких портов с помощью ALB Ingress на EKS
У меня есть сервер Triton на EKS, прослушивающий 3 порта, 8000 для http-запросов, 8001 для gRPC и 8002 для метрик prometheus. Итак, я создал развертывание Triton на EKS, которое доступно через службу NodePort EKS. Я также использую ALB ingress, который создает балансировщик нагрузки приложений для балансировки нагрузки серверов Triton на эти порты.
Но трафик не течет правильно, так как он показывает одинаковый вывод для всех трех портов, но он должен быть другим. Итак, теперь мне нужно создать 3 балансировщика нагрузки приложений для 3 портов или можно управлять всеми портами с помощью одного балансировщика нагрузки приложений?
Файл Yaml для ALB Ingress выглядит так:-
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: triton
annotations:
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/target-type: instance
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP":8000}, {"HTTP":8001}, {"HTTP":8002}]'
alb.ingress.kubernetes.io/healthcheck-port: traffic-port
spec:
ingressClassName: alb
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: triton
port:
number: 8000
- http:
paths:
- path: /v2
pathType: Prefix
backend:
service:
name: triton
port:
number: 8001
- http:
paths:
- path: /metrics
pathType: Prefix
backend:
service:
name: triton
port:
number: 8002
1 ответ
Согласно документации контроллера балансировщика нагрузки , порты прослушивания, указанные в аннотацииalb.ingress.kubernetes.io/listen-ports
объединяется со всеми входами, поэтому правила для всех портов будут применяться ко всем прослушивателям.
Для этого потребуется развернуть несколько Ingress в кластере Kubernetes. По умолчанию, если вы развертываете несколько Ingress-контроллеров в EKS, то при каждом создании Ingress между всеми этими контроллерами возникает состояние гонки, в котором каждый контроллер пытается обновить поля состояния Ingress. Следовательно, Kubernetes предоставляет возможность реализовать разные Ingress разными контроллерами Ingress. Это достигается за счет использованияIngressClass
. Тогда мы можем использовать один и тот же ALB, указавalb.ingress.kubernetes.io/group.name
аннотация .
Код должен быть примерно таким:
---
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: alb
spec:
controller: ingress.k8s.aws/alb
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: triton
annotations:
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/target-type: instance
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP":8000}]'
alb.ingress.kubernetes.io/healthcheck-port: traffic-port
alb.ingress.kubernetes.io/group.name: triton-group
spec:
ingressClassName: alb
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: triton
port:
number: 8000
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: triton
annotations:
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/target-type: instance
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP":8001}]'
alb.ingress.kubernetes.io/healthcheck-port: traffic-port
alb.ingress.kubernetes.io/group.name: triton-group
spec:
ingressClassName: alb
rules:
- http:
paths:
- path: /v2
pathType: Prefix
backend:
service:
name: triton
port:
number: 8001
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: triton
annotations:
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/target-type: instance
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP":8002}]'
alb.ingress.kubernetes.io/healthcheck-port: traffic-port
alb.ingress.kubernetes.io/group.name: triton-group
spec:
ingressClassName: alb
rules:
- http:
paths:
- path: /metrics
pathType: Prefix
backend:
service:
name: triton
port:
number: 8002