如何通过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
相关产品推荐
相关产品推荐

