0

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

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

4

1 回答 1

0

好吧,要在标头中获取真实的 IP 地址,基本上需要做两件事。入口控制器和 nlb 都需要使用代理协议。为了实现这一点,您需要通过将 use proxy-protocol 选项添加到配置中来在 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
      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 地址的方式

于 2022-02-19T10:14:21.200 回答