EKS ingress-nginx 和带 https 重定向的 NLB
EKS ingress-nginx and NLB with https redirect
我最近遇到了 nlb 问题,在 lb 上使用重定向 http=>https 和 ingress-nginx 在 EKS 上使用带有 https 终止的 nlb 是一次冒险。
现在,我想将 X-Forwarded header 传递给 pod,但这会破坏 http=>https 重定向,我在 http 请求上得到 400。
在服务上,我尝试将服务与http或tcp协议放在一起,同样的事情。
将 service.beta.kubernetes.io/aws-load-balancer-proxy-protocol: "*"
header 添加到服务,在所有目标上激活代理协议 v2,并在 nginx 的配置映射中激活 use-proxy-protocol: 'true'
打破 http-snippet 308重定向:
http-snippet: |
server {
listen 2443;
return 308 https://$host$request_uri;
}
有没有人有办法让它可以使用 nlb 以及所有好的 header 和重定向工作?
编辑 在评论请求中添加完整的工作配置
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'
为了结束我们与@night-gold 的评论讨论,要使 NGINX 接受代理协议,您必须在 listen 指令中特别提及:
http {
#...
server {
listen 80 proxy_protocol;
listen 443 ssl proxy_protocol;
#...
}
}
查看 NGINX guide 了解更多。
除了这个答案,不要忘记在服务中添加代理协议注释。
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
我最近遇到了 nlb 问题,在 lb 上使用重定向 http=>https 和 ingress-nginx 在 EKS 上使用带有 https 终止的 nlb 是一次冒险。
现在,我想将 X-Forwarded header 传递给 pod,但这会破坏 http=>https 重定向,我在 http 请求上得到 400。
在服务上,我尝试将服务与http或tcp协议放在一起,同样的事情。
将 service.beta.kubernetes.io/aws-load-balancer-proxy-protocol: "*"
header 添加到服务,在所有目标上激活代理协议 v2,并在 nginx 的配置映射中激活 use-proxy-protocol: 'true'
打破 http-snippet 308重定向:
http-snippet: |
server {
listen 2443;
return 308 https://$host$request_uri;
}
有没有人有办法让它可以使用 nlb 以及所有好的 header 和重定向工作?
编辑 在评论请求中添加完整的工作配置
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'
为了结束我们与@night-gold 的评论讨论,要使 NGINX 接受代理协议,您必须在 listen 指令中特别提及:
http {
#...
server {
listen 80 proxy_protocol;
listen 443 ssl proxy_protocol;
#...
}
}
查看 NGINX guide 了解更多。
除了这个答案,不要忘记在服务中添加代理协议注释。
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