Как установить входное действие AWS ALB по умолчанию для портов, отличных от ssl и ssl

#kubernetes-ingress #amazon-eks #aws-application-load-balancer

#kubernetes-вход #amazon-eks #aws-application-балансировщик нагрузки

Вопрос:

Я использую контроллер входа alb, а файл ingress yaml вставлен ниже.

 apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  namespace: default
  name: alb-ingress
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:us-east-1:123456789123:certificate/xxxxxxx-yyyy-zzzz-abce-ffffffffffff
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/security-groups: sg-xxxxxxxxxxxxxx
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS":443}]'
    alb.ingress.kubernetes.io/actions.ssl-redirect: '{"Type": "redirect", "RedirectConfig": { "Protocol": "HTTPS", "Port": "443", "StatusCode": "HTTP_301"}}'
spec:
  rules:
    - http:
        paths:
         - path: /*
           backend:
             serviceName: ssl-redirect
             servicePort: use-annotation
    - host: domain.com
      http:
       paths:
       - backend:
          serviceName: greensvc
          servicePort: 80
         path: /green
       - backend:
          serviceName: redsvc
          servicePort: 80
         path: /red
    - host: mongo.domain.com
      http:
       paths:
       - backend:
          serviceName: mongo-express-service
          servicePort: 8081

 

соответствующие правила в ALB

введите описание изображения здесь

введите описание изображения здесь

ALB был успешно развернут, но в журналах входа «alb-ingress» сообщалось о двух ошибках

 /*   ssl-redirect:use-annotation (<error: endpoints "ssl-redirect" not found>)

Default backend:  default-http-backend:80 (<error: endpoints "default-http-backend" not found>)
 

чего я пытаюсь добиться, так это создать единственное действие по умолчанию (не требующее каких-либо других правил) на порту 80, которое принудительно передает https-трафик. Действие по умолчанию в порту https, которое перенаправляется службе вместе с маршрутизацией на основе другого хоста или пути в соответствии с scrren shot. В настоящее время оба действия по умолчанию настроены на возврат фиксированного ответа 404.

Как я могу изменить текущий файл yaml таким образом, чтобы правила ALB были обновлены в соответствии с моими интересами. Также почему вход регистрирует ошибку аннотации для ssl-перенаправления.

Комментарии:

1. У вас есть решение для этого?

Ответ №1:

Я сам это не тестировал, поэтому, пожалуйста, внимательно оцените это, прежде чем подавать заявку напрямую.

 apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  namespace: default
  name: alb-ingress
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:us-east-1:123456789123:certificate/xxxxxxx-yyyy-zzzz-abce-ffffffffffff
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/security-groups: sg-xxxxxxxxxxxxxx
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS":443}]'
    alb.ingress.kubernetes.io/actions.ssl-redirect: '{"Type": "redirect", "RedirectConfig": { "Protocol": "HTTPS", "Port": "443", "StatusCode": "HTTP_301"}}'
    alb.ingress.kubernetes.io/actions.response-404: >
      {"type":"fixed-response","fixedResponseConfig":{"contentType":"text/plain","statusCode":"404","messageBody":"Not Found"}}
    alb.ingress.kubernetes.io/actions.green-svc: >
      {"type":"forward","forwardConfig":{"targetGroups":[{"serviceName":"green-k8s-service","servicePort":80,"weight":100}]}}
    alb.ingress.kubernetes.io/conditions.green-svc: >
      [{"field":"host-header","hostHeaderConfig":{"values":["domain.com"]}},{"field":"path-pattern","pathPatternConfig":{"values":["/green"]}}]
    alb.ingress.kubernetes.io/actions.red-svc: >
      {"type":"forward","forwardConfig":{"targetGroups":[{"serviceName":"red-k8s-service","servicePort":80,"weight":100}]}}
    alb.ingress.kubernetes.io/conditions.red-svc: >
      [{"field":"host-header","hostHeaderConfig":{"values":["domain.com"]}},{"field":"path-pattern","pathPatternConfig":{"values":["/red"]}}]
    alb.ingress.kubernetes.io/actions.mongo-svc: >
      {"type":"forward","forwardConfig":{"targetGroups":[{"serviceName":"mongo-k8s-service","servicePort":8081,"weight":100}]}}
    alb.ingress.kubernetes.io/conditions.mongo-svc: >
      [{"field":"host-header","hostHeaderConfig":{"values":["mongo.domain.com"]}}]
spec:
  backend:
    serviceName: response-404
    servicePort: use-annotation
  rules:
    - http:
        paths:
          - backend:
              serviceName: ssl-redirect
              servicePort: use-annotation
          - backend:
              serviceName: green-svc
              servicePort: use-annotation
          - backend:
              serviceName: red-svc
              servicePort: use-annotation
          - backend:
              serviceName: mongo-svc
              servicePort: use-annotation
 

Правило ALB по умолчанию указывается непосредственно под spec объектом, но перед rules объектом.

Для аннотаций действия и условия интерпретируются вместе, когда они имеют одно и то же имя.

Страница Ingress Annotations doc для AWS LoadBalancer Controller содержит множество замечательных примеров, которые помогут вам проработать любые другие настройки или изменения, которые вы, возможно, захотите внести. В частности, проверьте маршрутизацию трафика

Ответ №2:

Использование apiVersion: networking.k8s.io/v1 сработало на меня. Вы должны знать о некоторых изменениях, которые необходимо внести, поскольку вы используете другую apiVersion, указанную здесь https://kubernetes.io/docs/reference/using-api/deprecation-guide/#ingress-v122

Мой окончательный код был таким:

 apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  namespace: ...
  name: ...
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip
    alb.ingress.kubernetes.io/actions.response-420: >
      {"type":"fixed-response","fixedResponseConfig":{"contentType":"text/plain","statusCode":"420","messageBody":"..."}}
spec:
  rules:
    - http:
        paths:
          - path: /myPath
            pathType: Prefix
            backend:
              service:
                name: response-420
                port:
                  name: use-annotation