能否在同一VPC的两个不同EKS集群间共享同一个ELB给Ingress Controller?
能否在同一VPC的两个不同EKS集群间共享同一个ELB给Ingress Controller?
首先直接给结论:可以实现,但不能用你之前尝试的那种直接在Helm配置里绑定现有ELB的方式——这也是你的Ingress Controller Service一直Pending的原因,我来给你拆解清楚:
为什么你的方法行不通?
EKS里的LoadBalancer类型Service默认会独占并完全管控对应的ELB:它会自动创建ELB、配置安全组、注册/注销后端节点。当你强行指定一个已经被另一个集群Service占用的ELB时,Kubernetes会因为无法获取这个ELB的控制权(比如没有权限修改已有配置,或者ELB的归属权不在当前集群的IAM角色下),导致Service一直卡在Pending状态。
可行的实现方案
下面给两种靠谱的方案,优先推荐第一种:
方案1:使用NLB(Network Load Balancer)+ 多Target Groups(推荐)
NLB天生支持跨集群共享,而且性能更优,步骤如下:
- 确认两个EKS集群在同一个VPC,且集群节点(或Fargate Pod)的安全组允许NLB的流量访问(比如开放Ingress Controller的默认端口80/443)。
- 复用你现有的NLB(或者创建新的),为每个集群的Ingress Controller创建独立的Target Group:
- 如果你用NodePort模式部署Ingress Controller,Target Group的目标类型选
实例,把第二个集群的节点IP+NodePort端口加进去; - 如果你用IP模式(比如Ingress Controller的Pod直接获取VPC IP),Target Group的目标类型选
IP,把第二个集群的Ingress Controller Pod IP加进去。
- 如果你用NodePort模式部署Ingress Controller,Target Group的目标类型选
- 在NLB的Listener上配置路由规则:比如按域名(
app1.example.com转发到集群1的Target Group,app2.example.com转发到集群2的),或者按路径前缀区分。 - 把两个集群的Ingress Controller Service类型设为
NodePort或ClusterIP(不要用LoadBalancer),避免K8s自动创建新的ELB。
方案2:使用Classic ELB(不推荐,功能受限)
如果一定要用现有的Classic ELB,只能手动管理ELB的后端:
- 把两个集群的Ingress Controller都部署为
NodePort类型; - 手动登录AWS控制台,把第二个集群的节点IP+NodePort端口添加到Classic ELB的后端实例列表;
- 注意:不要让任何一个集群的Service类型设为
LoadBalancer,否则K8s会自动覆盖ELB的后端配置,导致手动添加的节点被移除。
关键注意事项
- 权限配置:确保两个集群的IAM角色(比如节点角色或Ingress Controller的服务账号角色)拥有操作ELB/Target Group的权限,比如
elasticloadbalancing:RegisterTargets、elasticloadbalancing:DeregisterTargets等; - 流量路由:需要在NLB/ELB层面或者Ingress Controller的Ingress资源里做好路由规则,避免两个集群的服务流量冲突;
- 状态同步:如果要实现Pod/节点变化时自动注册到Target Group,可以用AWS的Target Group自动注册功能(比如基于EC2标签筛选节点,或者用VPC CNI的IP模式自动发现Pod IP);
- 版本兼容:尽量保持两个集群的Ingress Controller版本一致,避免配置语法或功能差异导致问题。
备注:内容来源于stack exchange,提问作者Jaumzera
相关产品推荐
相关产品推荐

