K8s Service/Ingress 綁定 AWS LB 的流程
K8s 不直接建 ALB/NLB——你寫 K8s 物件,AWS Load Balancer Controller 看到後幫你呼叫 AWS API 建 LB。然後可以透過 tag 反向找回那顆 LB,做 Route 53 alias。
兩個觸發來源
| K8s 物件 | 觸發 | 結果 |
|---|---|---|
Service (type=LoadBalancer) | annotation 控制細節 | NLB(L4 TCP/UDP) |
Ingress (ingressClassName=alb) | annotation 控制細節 | ALB(L7 HTTP/HTTPS) |
綁定流程
1. 你 apply K8s yaml
Service yaml: namespace=monitoring, name=vmauth-nlb, type=LoadBalancer
或
Ingress yaml: name=grafana-central-ingress-alb, group.name=...
2. AWS LB Controller (cluster 內 Pod,watch K8s API)
→ 看到新物件 → 呼叫 AWS API: CreateLoadBalancer
→ AWS 隨機產生 NLB/ALB
- 內部 ID
- DNS hostname (k8s-monitori-vmauthnl-XXXX.elb.us-east-1.amazonaws.com)
3. Controller 自動在 LB 上打 tag:
NLB:
elbv2.k8s.aws/cluster = <cluster name>
service.k8s.aws/stack = <namespace>/<service-name>
service.k8s.aws/resource = LoadBalancer
ALB:
elbv2.k8s.aws/cluster = <cluster name>
ingress.k8s.aws/stack = <group.name> 或 <namespace>/<ingress-name>
ingress.k8s.aws/resource = LoadBalancer
4. Controller 把 LB DNS 寫回 K8s 物件的 status:
Service: status.loadBalancer.ingress[0].hostname
Ingress: status.loadBalancer.ingress[0].hostname
5. kubectl get 才看得到 EXTERNAL-IP/hostname
反向查詢:用 tag 找 LB(給 Route 53 alias 用)
# 找 NLB
data "aws_lb" "service" {
tags = {
"elbv2.k8s.aws/cluster" = var.eks_cluster_name
"service.k8s.aws/stack" = "monitoring/vmauth-nlb" # ns/service
}
}
# 找 ALB
data "aws_lb" "ingress" {
tags = {
"elbv2.k8s.aws/cluster" = var.eks_cluster_name
"ingress.k8s.aws/stack" = "monitor-ingress-controller" # group.name 或 ns/ingress-name
}
}
data.aws_lb.xxx.dns_name / .zone_id 就是 LB 的當前 DNS。