#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)