【问题标题】:How to create AWS ALB using kubernetes_ingress terraform resource?如何使用 kubernetes_ingress terraform 资源创建 AWS ALB?
【发布时间】:2022-01-03 07:16:46
【问题描述】:

我正在尝试使用 Terraform 的 kubernetes_ingress 资源将 Application Load Balancer 部署到 AWS:

我正在使用aws-load-balancer-controller,我使用helm_release 资源安装到我的集群。

现在我正在尝试使用serviceingress 部署deployment

这就是我的service 的样子:

resource "kubernetes_service" "questo-server-service" {
  metadata {
    name      = "questo-server-service-${var.env}"
    namespace = kubernetes_namespace.app-namespace.metadata.0.name
  }
  spec {
    selector = {
      "app.kubernetes.io/name" = lookup(kubernetes_deployment.questo-server.metadata.0.labels, "app.kubernetes.io/name")
    }

    port {
      port        = 80
      target_port = 4000
    }
    type = "LoadBalancer"
  }
}

这就是我的ingress 的样子:

resource "kubernetes_ingress" "questo-server-ingress" {
  wait_for_load_balancer = true
  metadata {
    name = "questo-server-ingress-${var.env}"
    namespace = kubernetes_namespace.app-namespace.metadata.0.name
    annotations = {
      "kubernetes.io/ingress.class" = "alb"
      "alb.ingress.kubernetes.io/target-type" = "instance"
    }
  }
  spec {
    rule {
      http {
        path {
          path = "/*"
          backend {
            service_name = kubernetes_service.questo-server-service.metadata.0.name
            service_port = 80
          }
        }
      }
    }
  }
}

问题是,当我运行 terraform apply 时,它会创建一个 Classic Load Balancer 而不是 Application Load Balancer。

我尝试将service 的类型更改为NodePort,但没有帮助。

我还尝试向ingress 添加更多注释,例如"alb.ingress.kubernetes.io/load-balancer-name" = "${name}",但随后它一次创建了两个负载平衡器!一个内部 ALB 和一个面向 Internet 的 CLB。

任何想法如何使用此设置创建面向 Internet 的应用程序负载均衡器?

--- 更新----

我注意到,实际上,service 是 Classic Load Balancer,我可以通过它连接到我的 deployment

Ingress 创建了一个 ALB,但它的前缀是 internal,所以我的问题是,如何创建一个面向 Internet 的 ALB?

谢谢!

【问题讨论】:

  • 您能分享使用 helm_release 安装 aws-load-balancer-controller 的 tf 文件吗?
  • 您自己需要它吗?如果是这样,请在 PM 中 ping 我,我会发送给您。编辑:如果需要,您实际上可以在我的仓库中找到它:github.com/matewilk/questo/blob/master/tf/k8s/…

标签: amazon-web-services kubernetes terraform load-balancing


【解决方案1】:

尝试使用alb.ingress.kubernetes.io/scheme: internet-facing 注释。

您可以在此处找到所有可用注释的列表:https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.2/guide/ingress/annotations/

【讨论】:

  • 嘿@florianmaxim,感谢您的回答,我在发布问题的当天晚上就知道了,我只是没有时间发布它。感谢您的输入,它确实是 internet-facingNodePort 组合的服务类型。
【解决方案2】:

像大多数时候一样回答我自己的问题:)

这是正确的设置,以防万一有人遇到它:

service 的类型必须是 NodePort

resource "kubernetes_service" "questo-server-service" {
  metadata {
    name      = "questo-server-service-${var.env}"
    namespace = kubernetes_namespace.app-namespace.metadata.0.name
  }
  spec {
    selector = {
      "app.kubernetes.io/name" = lookup(kubernetes_deployment.questo-server.metadata.0.labels, "app.kubernetes.io/name")
    }

    port {
      port        = 80
      target_port = 4000
    }
    type = "NodePort"
  }
}

并且ingress的注释必须设置如下:(你可以忽略load-balancer-namehealthcheck-pass,因为它们与问题无关:

resource "kubernetes_ingress" "questo-server-ingress" {
  wait_for_load_balancer = true
  metadata {
    name      = "questo-server-ingress-${var.env}"
    namespace = kubernetes_namespace.app-namespace.metadata.0.name
    annotations = {
      "kubernetes.io/ingress.class"                  = "alb"
      "alb.ingress.kubernetes.io/target-type"        = "ip"
      "alb.ingress.kubernetes.io/scheme"             = "internet-facing"
      "alb.ingress.kubernetes.io/load-balancer-name" = "questo-server-alb-${var.env}"
      "alb.ingress.kubernetes.io/healthcheck-path"   = "/health"
    }
  }

  spec {
    rule {
      http {
        path {
          path = "/*"
          backend {
            service_name = kubernetes_service.questo-server-service.metadata.0.name
            service_port = 80
          }
        }
      }
    }
  }
} 

【讨论】:

    猜你喜欢
    • 2019-05-19
    • 1970-01-01
    • 2020-09-12
    • 1970-01-01
    • 2015-05-18
    • 2021-01-21
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    相关资源
    最近更新 更多