【问题标题】:AWS - x-real-ip is ip of nginx-ingress-controllerAWS - x-real-ip 是 nginx-ingress-controller 的 ip
【发布时间】:2022-02-19 18:14:21
【问题描述】:

我目前有以下问题。我有一个后端位于 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
}`

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

【问题讨论】:

  • AFAIK,因为您似乎使用的是 NLB,所以您无法从第 7 层获取标头。

标签: amazon-web-services nginx terraform nginx-ingress ingress-controller


【解决方案1】:

好的,要在标头中获取真实的 IP 地址,基本上需要做两件事。入口控制器和 nlb 都需要使用代理协议。为了实现这一点,您需要在 terraform 中设置入口控制器,方法是将 use 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 设置为使用代理协议。

在 githunb 上存在使用 service.beta.kubernetes.io/aws-load-balancer-type: "nlb-ip"service.beta.kubernetes.io/aws-load-balancer-proxy-protocol: ""*

会做到这一点,但我做不到。所以目前我手动打开它。为此,请转到 aws 控制台 --> EC2 --> 负载平衡下的目标组 --> 选择与您的 nlb 关联的目标组 --> 属性 --> 启用代理协议 2

我猜想在 terraform 中,最佳解决方案是显式创建网络负载均衡器和正确的目标组,并将其与入口控制器服务相关联。当我很好地实现这个时,我会更新这个答案,但现在这是我在 kubernetes 集群中的应用程序内获取客户端正确 IP 地址的方式

【讨论】:

    猜你喜欢
    • 2019-12-07
    • 2020-10-01
    • 2021-09-21
    • 1970-01-01
    • 2021-02-01
    • 1970-01-01
    • 2022-01-18
    • 2019-11-06
    • 1970-01-01
    相关资源
    最近更新 更多