繁体   English   中英

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

[英]How to create AWS ALB using kubernetes_ingress terraform resource?

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

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

现在我正在尝试使用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?

谢谢!

尝试使用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
          }
        }
      }
    }
  }
} 

暂无
暂无

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

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