You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Terraform的kubernetes_ingress资源创建AWS ALB负载均衡器?

解决方案

1. 清理多余CLB生成逻辑

额外生成CLB的原因是kubernetes_service资源使用了LoadBalancer类型,AWS EKS默认会为该类型的Service自动创建Classic Load Balancer,和通过Ingress创建ALB的需求冲突。
将Service的spec.type改为NodePort即可(使用instance类型的ALB目标组时,NodePort即可满足转发要求),修改后的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 = "NodePort"
  }
}

2. 配置ALB为公网类型

aws-load-balancer-controller默认创建内网ALB,需要在Ingress的注解中明确指定公网方案,添加alb.ingress.kubernetes.io/scheme = "internet-facing"注解即可,修改后的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"
      "alb.ingress.kubernetes.io/scheme" = "internet-facing"
      # 可选配置:如果需要指定ALB名称可以保留以下配置
      # "alb.ingress.kubernetes.io/load-balancer-name" = "${name}"
    }
  }
  spec {
    rule {
      http {
        path {
          path = "/*"
          backend {
            service_name = kubernetes_service.questo-server-service.metadata.0.name
            service_port = 80
          }
        }
      }
    }
  }
}

修改完成后重新执行terraform apply,就只会生成一个公网可访问的ALB,不会再出现多余的CLB。


内容的提问来源于stack exchange,提问作者matewilk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 10:36:06