如何使用 kubernetes_ingress terraform 资源创建 AWS ALB?

How to create AWS ALB using kubernetes_ingress terraform resource?

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

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

现在我正在尝试部署 deploymentserviceingress

这是我的 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 和一个面向 CLB 的互联网。

关于如何使用此设置创建面向 Internet 的应用程序负载均衡器有什么想法吗?

---更新----

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

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

谢谢!

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

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

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

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

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
          }
        }
      }
    }
  }
}