EKS ALB входной маршрут по портам

У нас есть требование сделать приложение доступным через порт. Например, http://example.com:8180 и http://example.com:8181 должны разрешаться в приложении.
Порты открываются с аннотацией listen-ports:

alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS":443}, {"HTTP":8180}, {"HTTP":8181}]'

Я пробовал следующие правила:

rules:
    - host: example.com
      http:
        paths:
          - path: /*
            backend:
              serviceName: ssl-redirect
              servicePort: use-annotation
          - path: /1.0/*
            backend:
              serviceName: some-server-side-app
              servicePort: 8080
          - path: /*
            backend:
              serviceName: some-webpage
              servicePort: 80
      8180:
        paths:
          - path: /*
            backend:
              serviceName: app-reachable-via-port
              servicePort: 8180
      8181:
        paths:
          - path: /*
            backend:
              serviceName: app-reachable-via-port
              servicePort: 8181

Это вызывает ошибку из-за неправильной конфигурации входа.

Я также нашел это руководство на github для ingress-nginx https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/exposing-tcp-udp-services.md и пытался напомнить его, но пока не повезло.

Кто-нибудь знает, как этого можно добиться с помощью ALB-Ingress?


person CodeChimpy    schedule 30.01.2021    source источник
comment
Отвечает ли это на ваш вопрос? кажется, вам может потребоваться использовать функции группы контроллеров stackoverflow.com/questions/58065884/   -  person paltaa    schedule 30.01.2021


Ответы (1)


Если я понимаю, что вы ищете, вы хотите дифференцировать входящий трафик и отправлять его службам в зависимости от порта, через который поступает ваш входящий трафик?

Вы можете сделать это с помощью AWS Load Balancer Controller.. Я не тестировал указанный ниже объект в этой конфигурации с использованием http-заголовка, но я сам использую что-то очень похожее. Я думаю, что это стоит протестировать на основе документацию AWS здесь. Однако вам нужно будет поэкспериментировать с этим. В этом примере также предполагается, что каждая из ваших служб в кластере прослушивает тот же порт, который вы используете для направления трафика - это можно легко изменить на любой порт, который действительно прослушивает ваши службы.

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/group.name: example
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/security-groups: sg-01234567898765432
    alb.ingress.kubernetes.io/ip-address-type: ipv4
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS": 443}, {"HTTP": 8180}, {"HTTP": 8181}]'
    
    alb.ingress.kubernetes.io/actions.response-503: >
      {"type":"fixed-response","fixedResponseConfig":{"contentType":"text/plain","statusCode":"503","messageBody":"Unknown Host"}}

    alb.ingress.kubernetes.io/actions.some-webpage: >
      {"type":"forward","forwardConfig":{"targetGroups":[{"serviceName":"some-webpage","servicePort":80,"weight":100}]}}
    alb.ingress.kubernetes.io/conditions.some-webpage: >
      [{"field":"http-header","HttpHeaderConfig":{"HttpHeaderName":"Host","Values":["example.com:80"]}}]

    alb.ingress.kubernetes.io/actions.app1-reachable-via-port: >
      {"type":"forward","forwardConfig":{"targetGroups":[{"serviceName":"app1-reachable-via-port","servicePort":8180,"weight":100}]}}
    alb.ingress.kubernetes.io/conditions.app1-reachable-via-port: >
      [{"field":"http-header","HttpHeaderConfig":{"HttpHeaderName":"Host","Values":["example.com:8180"]}}]

    alb.ingress.kubernetes.io/actions.app2-reachable-via-port: >
      {"type":"forward","forwardConfig":{"targetGroups":[{"serviceName":"app2-reachable-via-port","servicePort":8181,"weight":100}]}}
    alb.ingress.kubernetes.io/conditions.app2-reachable-via-port: >
      [{"field":"http-header","HttpHeaderConfig":{"HttpHeaderName":"Host","Values":["example.com:8181"]}}]

    alb.ingress.kubernetes.io/target-type: instance
    alb.ingress.kubernetes.io/load-balancer-attributes: routing.http2.enabled=true,idle_timeout.timeout_seconds=600
    alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:us-east-2:999999999999:certificate/11111111-1111-1111-1111-111111111111,arn:aws:acm:us-east-2:999999999999:certificate/22222222-2222-2222-2222-222222222222
    alb.ingress.kubernetes.io/ssl-policy: ELBSecurityPolicy-2016-08
spec:
  backend:
    serviceName: response-503
    servicePort: use-annotation
  rules:
    - http:
        paths:
          - backend:
              serviceName: ssl-redirect
              servicePort: use-annotation
          - backend:
              serviceName: some-webpage
              servicePort: use-annotation
          - backend:
              serviceName: app1-reachable-via-port
              servicePort: use-annotation
          - backend:
              serviceName: app2-reachable-via-port
              servicePort: use-annotation

Другим решением может быть ALB TargetGroupBinding. Вы теряете часть преимущества, позволяющего EKS предоставлять ваши ALB и целевые группы и управлять ими от вашего имени, но вы сохраняете полный контроль над конфигурациями ALB и целевой группы. С TargetGroupBinding вам по-прежнему понадобится AWS Load Balancer Controller в своем кластере, но вы сами создаете ALB и целевые группы, а затем используете объект TargetGroupBinding для сопоставления сервисов из вашего кластера с конкретными ARN целевой группы:

apiVersion: elbv2.k8s.aws/v1beta1
kind: TargetGroupBinding
metadata:
  name: demo1-tgb
spec:
  serviceRef:
    name: demo1-service 
    port: 80
  targetGroupARN: arn:aws:elasticloadbalancing:us-east-2:121212121212:targetgroup/my-target-group/cbc9f05b05caea6b

Удачи - обновите его снова, как только он заработает должным образом.

person Bryan    schedule 03.02.2021
comment
Идеально! Вопрос: можно ли указать два условия на один и тот же набор правил? или это обязательно должен быть файл conditions.x-server - ›actions.x-server? - person E.Z.; 09.04.2021