EKS 实战:Load Balancer Controller 与集群内 DNS 解析
EKS 实战:Load Balancer Controller 与集群内 DNS 解析
两件在 EKS 上常碰的事:装 AWS Load Balancer Controller(让 Ingress/Service 能拉起 ALB/NLB),以及搞清楚集群内部域名为什么解析不了。命令里的集群名、账号 ID、VPC ID 都换成了占位符。
安装 AWS Load Balancer Controller
AWS Load Balancer Controller 管两类资源:
- 给 Kubernetes Ingress 对象创建 Application Load Balancer (ALB)。
- 给带相应注解、类型为 LoadBalancer 的 Service 创建 Network Load Balancer (NLB)。
用 Helm 安装,前置是给集群配好 IAM OIDC Provider 和对应的 IAM 角色。
创建 IAM OIDC Provider:
eksctl utils associate-iam-oidc-provider \
--region ap-east-1 \
--cluster my-eks-cluster \
--approve
下载官方 IAM policy 并创建:
curl -Lo iam-policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.4.0/docs/install/iam_policy.json
aws iam create-policy \
--policy-name AWSLoadBalancerControllerIAMPolicy \
--policy-document file://iam-policy.json
用 eksctl 创建绑定了这个 policy 的 IAM ServiceAccount(把 <ACCOUNT_ID> 换成你的账号):
eksctl create iamserviceaccount \
--cluster=my-eks-cluster \
--namespace=kube-system \
--name=aws-load-balancer-controller \
--attach-policy-arn=arn:aws:iam::<ACCOUNT_ID>:policy/AWSLoadBalancerControllerIAMPolicy \
--approve
Helm 安装 controller,serviceAccount.create=false 复用上一步建好的 SA:
helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
-n kube-system \
--set clusterName=my-eks-cluster \
--set serviceAccount.create=false \
--set serviceAccount.name=aws-load-balancer-controller \
--set region=ap-east-1 \
--set vpcId=vpc-xxxxxxxxxxxxxxxxx
controller 依赖 cert-manager 的 CRD,装一下:
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.17.1/cert-manager.crds.yaml
想看 Helm 实际渲染出来的 manifest:
helm get manifest aws-load-balancer-controller -n kube-system > existing-manifest.yaml
需要重装时,先把旧的 Deployment / ClusterRole / ClusterRoleBinding / ServiceAccount 清掉:
kubectl delete deployment -n kube-system aws-load-balancer-controller
kubectl delete clusterRole aws-load-balancer-controller
kubectl delete ClusterRoleBinding aws-load-balancer-controller
kubectl delete ServiceAccount -n kube-system aws-load-balancer-controller
集群内部域名解析问题
集群内 Pod 之间通信走的是内部 DNS(通常是 CoreDNS)和 CNI 插件(Calico、Weave、Amazon VPC CNI 等)管理的内部网络,不需要经过外部网关,也不必把网关 IP 加白名单。
Kubernetes 的 Service DNS 解析遵循 <service-name>.<namespace>.svc.cluster.local;没指定命名空间时默认是 default。所以如果用一个自定义外部域名(比如 serviceops.example.com)在集群内解析不了,基本是 DNS 配置问题。
排查顺序:
确认服务名和命名空间。比如 service 叫
serviceops、在default命名空间,集群内应该用serviceops.default.svc.cluster.local访问。做一次解析测试。在任意 Pod 里用
nslookup或dig看域名能不能解出来:nslookup serviceops.default.svc.cluster.local要用自定义域名就配 ExternalDNS。希望用
serviceops.example.com这类对外域名,就得在集群里跑 ExternalDNS 并接好 DNS 提供商(如 Route 53)。ExternalDNS 会根据 Ingress / Service 的 annotations 自动维护 DNS 记录。