繁体   English   中英

AWS - x-real-ip 是 nginx-ingress-controller 的 ip

[英]AWS - x-real-ip is ip of nginx-ingress-controller

我目前有以下问题。 我有一个后端位于 nginx-ingress 控制器后面,该控制器用作 aws 中的负载均衡器。 通常我应该通过标头 x-forwarded-for 或 x-real-ip 获取用户的真实 IP。 然而,在我的例子中,这个 ip 总是指向入口控制器的 ip。 我使用 terraform 来设置我的架构。

这是我目前的配置

resource "helm_release" "ingress_nginx" {
  name             = "ingress-nginx"
  namespace        = "ingress"
  create_namespace = true
  chart            = "ingress-nginx"
  version          = "4.0.13"
  repository       = "https://kubernetes.github.io/ingress-nginx"

  values = [
    <<-EOF
    controller:
      service:
        annotations:
          service.beta.kubernetes.io/aws-load-balancer-type: nlb
      admissionWebhooks:
        enabled: false
    EOF
  ]
}

data "kubernetes_service" "ingress_nginx" {
  metadata {
    name      = "ingress-nginx-controller"
    namespace = helm_release.ingress_nginx.metadata[0].namespace
  }
}

data "aws_lb" "ingress_nginx" {
  name = regex(
    "(^[^-]+)",
    data.kubernetes_service.ingress_nginx.status[0].load_balancer[0].ingress[0].hostname
  )[0]
}

output "lb" {
  value = data.aws_lb.ingress_nginx.name
}`

有人知道如何修复此配置中的标头吗?

要在标头中获取真实 IP 地址,入口控制器和 NLB(网络负载均衡器)都需要使用代理协议。 为此,在 terraform 中,您需要使用proxy-protocol选项配置入口控制器:

resource "helm_release" "ingress_nginx" {
  name             = "ingress-nginx"
  namespace        = "ingress"
  create_namespace = true
  chart            = "ingress-nginx"
  version          = "4.0.13"
  repository       = "https://kubernetes.github.io/ingress-nginx"

  values = [
    <<-EOF
    controller:
      service:
        annotations:
          service.beta.kubernetes.io/aws-load-balancer-type: nlb
      config:
        use-forwarded-headers: true
        use-proxy-protocol: true
        enable-real-ip: true
      admissionWebhooks:
        enabled: false
    EOF
  ]
}

data "kubernetes_service" "ingress_nginx" {
  metadata {
    name      = "ingress-nginx-controller"
    namespace = helm_release.ingress_nginx.metadata[0].namespace
  }
}

data "aws_lb" "ingress_nginx" {
  name = regex(
    "(^[^-]+)",
    data.kubernetes_service.ingress_nginx.status[0].load_balancer[0].ingress[0].hostname
  )[0]
}

output "lb" {
  value = data.aws_lb.ingress_nginx.name
}

现在看来,目前似乎没有办法通过注解服务来让 NLB 使用proxy protocol

github中有一些问题提到以下注释可以解决它:

*service.beta.kubernetes.io/aws-load-balancer-type: "nlb-ip"*

*service.beta.kubernetes.io/aws-load-balancer-proxy-protocol: "*"*

但是,这些对我不起作用。 因此,我通过执行以下操作通过 AWS 控制台手动启用了proxy protocol

AWS console --> EC2 --> Target groups under load balancing --> Select Target groups associated with your NLB --> Attributes --> Enable proxy protocol 2

我猜想在 terraform 中,最佳解决方案是显式创建具有正确目标组的网络负载均衡器,并将其与入口控制器服务相关联。

这样做,现在我得到了连接到入口控制器的客户端的正确 IP 地址。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM