使用Helm与Terraform部署Ingress ALB时如何获取负载均衡器域名
问题背景
- 部署EKS集群,计划在集群内运行基于ALB的Ingress控制器
- 需要获取负载均衡器DNS地址,用于Route53的CNAME记录配置
- 现有通过Terraform Helm provider部署AWS Load Balancer Controller的配置片段如下:
resource "helm_release" "aws_lb_controller" { name = "aws-load-balancer-controller" repository = "https://aws.github.io/eks-charts" chart = "aws-load-balancer-controller" namespace = "kube-system" force_update = "true" dependency_update = "true" depends_on = [ aws_iam_role.aws_lb_controller_role, null_resource.get_kubeconfig] # version = "2.4.2" # current set { # 其余配置项 } }
实现方法
AWS Load Balancer Controller本身是管控组件,部署完成时不会提前创建ALB资源。ALB实例会在你创建标注了alb作为Ingress Class的业务Ingress资源时,由控制器自动调用AWS接口创建,对应DNS地址可以通过以下两种方式获取:
Terraform自动读取(适合基础设施即代码场景)
在Terraform中定义业务Ingress资源后,直接从Ingress的状态属性中读取ALB分配的主机名,直接传入Route53记录配置即可,不需要手动查询,示例配置:
# 业务Ingress配置 resource "kubernetes_ingress_v1" "business_ingress" { metadata { name = "service-ingress" namespace = "default" annotations = { "kubernetes.io/ingress.class" = "alb" "alb.ingress.kubernetes.io/scheme" = "internet-facing" # 按需添加其余ALB配置注解,比如监听端口、SSL证书、安全组等 } } spec { # 填写对应的路由规则、后端服务配置 rule { http { path { path = "/*" backend { service { name = "你的业务服务名" port { number = 服务端口 } } } } } } } # 确保ALB控制器部署完成后再创建Ingress depends_on = [helm_release.aws_lb_controller] } # Route53 CNAME记录配置,直接引用Ingress状态中的ALB DNS resource "aws_route53_record" "service_cname" { zone_id = "你的Route53托管区域ID" name = "业务访问域名,比如api.yourdomain.com" type = "CNAME" ttl = 300 records = [kubernetes_ingress_v1.business_ingress.status[0].load_balancer[0].ingress[0].hostname] }
命令行手动查询(适合临时验证场景)
业务Ingress部署完成后,执行以下kubectl命令可直接输出对应ALB的DNS地址:
kubectl get ingress <你的Ingress资源名称> -n <Ingress所在命名空间> -o jsonpath='{.status.loadBalancer.ingress[0].hostname}'
常见误区:不要尝试从aws-load-balancer-controller的Helm部署输出中找ALB DNS,控制器部署阶段还没有生成任何ALB资源,自然没有对应的DNS地址。
内容的提问来源于stack exchange,提问作者Hristijan
相关产品推荐
相关产品推荐

