EKS ingress-nginx и NLB с перенаправлением https

#amazon-ec2 #amazon-eks #aws-nlb #ingress-nginx

#amazon-ec2 #amazon-eks #aws-nlb #вход-nginx

Вопрос:

В последнее время у меня возникли проблемы с nlb, было довольно сложно иметь nlb с завершением https на lb, работающем с перенаправлением http => https и ingress-nginx на EKS.

Теперь я хочу, чтобы заголовки X-Forwarded передавались в модуль, но это нарушает перенаправление http => https, я получаю 400 на http-запросы.

В службе я попытался установить службу с протоколом http или tcp, то же самое.

Добавление service.beta.kubernetes.io/aws-load-balancer-proxy-protocol: "*" заголовка в службу активирует прокси-протокол v2 для всех целевых объектов, а активация use-proxy-protocol: 'true' в configmap для nginx прерывает http-сниппет с перенаправлением 308:

 http-snippet: |
    server {
      listen 2443;
      return 308 https://$host$request_uri;
    }
 

Есть ли у кого-нибудь способ сделать так, чтобы он мог использовать nlb со всеми хорошими заголовками и перенаправлением?

РЕДАКТИРОВАТЬ по запросу комментариев, добавляя полную рабочую конфигурацию

 apiVersion: v1
kind: ConfigMap
metadata:
  labels:
    app.kubernetes.io/version: 0.41.0
    app.kubernetes.io/component: controller
  name: ingress-nginx-controller
data:
  http-snippet: |
    server {
      listen 2443 proxy_protocol;
      return 308 https://$host$request_uri;
    }
  proxy-real-ip-cidr: 10.4.0.0/16
  use-forwarded-headers: 'true'
  use-proxy-protocol: 'true'
  compute-full-forwarded-for: 'true'
 

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

1. Откуда вы взяли ingress-nginx ? kubernetes.github.io/ingress-nginx/deploy ? Если это так, то для включения перенаправления HTTPS вам нужно только настроить TLS во входном ресурсе: kubernetes.github.io/ingress-nginx/user-guide /…

2. Пожалуйста, прочтите заголовок, я специально спрашиваю в случае использования, когда у вас есть NLB, а не CLB или ALB.

3. Я прочитал это снова, и я все еще не понимаю, почему вы используете этот http-фрагмент для перенаправления, когда nginx делает это автоматически, если TLS настроен на входном ресурсе. Я сам использую NLB и nginx ingress в производстве, и мне ничего не нужно было делать, чтобы получить то, чего вы пытаетесь достичь.

4. Оооо, я вижу здесь проблему… Я отредактировал сообщение.

5. Глядя на официальное руководство ( docs.nginx.com/nginx/admin-guide/load-balancer /… ) кажется listen , директива должна содержать proxy_protocol , чтобы NGINX принимал заголовки прокси-протокола. Не могли бы вы попробовать изменить listen 2443; для listen 2443 proxy_protocol; ?

Ответ №1:

В заключение нашего обсуждения комментариев с @night-gold, чтобы заставить NGINX принимать прокси-протокол, вы должны специально указать это в директиве listen:

 http {
    #...
    server {
        listen 80   proxy_protocol;
        listen 443  ssl proxy_protocol;
        #...
    }
}
 

Ознакомьтесь с руководством по NGINX для получения дополнительной информации.

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

1. Для небольшой точности директива активируется в configmap с помощью use-proxy-protocol: ‘true’, чтобы иметь ее во всем мире. Но это не учитывается внутри http-фрагмента configmap.

Ответ №2:

В дополнение к этому ответу не забудьте добавить аннотацию прокси-протокола к сервису.

https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.2/guide/service/nlb/#protocols

Вот мои значения в таблице helm

 helm upgrade 
      ingress-nginx ingress-nginx/ingress-nginx 
      --namespace ingress-nginx 
      --set controller.service.type=LoadBalancer 
      --set controller.service.annotations."service.beta.kubernetes.io/aws-load-balancer-type"=nlb 
      --set controller.service.annotations."service.beta.kubernetes.io/aws-load-balancer-nlb-target-type"=ip 
      --set controller.service.annotations."service.beta.kubernetes.io/aws-load-balancer-cross-zone-load-balancing-enabled"=true 
      --set controller.service.annotations."service.beta.kubernetes.io/aws-load-balancer-type"=external 
      --set controller.service.annotations."service.beta.kubernetes.io/aws-load-balancer-name"="nginx-ingress" 
      --set controller.service.annotations."service.beta.kubernetes.io/aws-load-balancer-proxy-protocol"="*" 
      --set controller.service.annotations."service.beta.kubernetes.io/aws-load-balancer-scheme"="internet-facing" 
      --set controller.config."proxy-real-ip-cidr"="xx.xx.xx.xx/xx" 
      --set controller.config."use-forwarded-headers"="true" 
      --set controller.config."use-proxy-protocol"="true" 
      --set controller.config."compute-full-forwarded-for"="true" 
      --set controller.config."http-snippet"="
server{
  listen 2443;
  return 308 https://$host$request_uri;
}" 
      --dry-run
 

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

1. Helm conf в этом случае не имеет значения, см. Вопрос, и вы можете видеть, что я ввел строки conf (не helm)