如何将旧AKS集群公网IP迁移至新集群Azure负载均衡器
你现在遇到的新集群nginx LB卡在Pending状态、持续生成Ensuring Load Balancer事件是正常现象,本质是目标公网IP仍被旧集群的负载均衡器占用,Azure云控制器无法获取资源所有权。你猜测的「给旧集群ingress LB分配其他IP释放目标IP」核心逻辑成立,但不推荐手动在Azure控制台拆装负载均衡器的Frontend IP配置——这类手动操作很容易打乱AKS云控制器的资源状态,后续控制器自动调谐时可能覆盖你的手动配置,用K8s原生资源操作路径最稳定,全程仅会出现1-5分钟的公网访问中断,符合你可接受短暂停机的要求。
操作前先确认两个前提,避免踩坑:
- 要复用的旧集群公网IP必须是Standard SKU、静态分配类型,如果当前是动态分配,先改成静态,否则IP和旧资源解绑时会被Azure直接回收,无法复用
- 目标公网IP和新集群处于同一Azure区域,跨区域公网IP无法直接绑定到新集群LB
1. 解绑旧集群上的目标公网IP
你不需要手动在控制台删LB配置,直接修改旧集群的ingress-nginx Service资源即可,AKS云控制器会自动清理对应的LB规则、frontend绑定:
- 如果你暂时还要保留旧集群的公网访问能力,给旧的ingress LB分配一个新的空闲静态公网IP即可,执行命令:
kubectl patch service ingress-nginx-controller -n ingress-nginx -p '{"spec":{"loadBalancerIP":"<新的临时公网IP地址>"}}' - 如果你不需要旧集群再对外提供服务(后续直接下线),可以更快操作:直接把旧ingress Service的类型改成ClusterIP,直接释放原公网IP绑定:
kubectl patch service ingress-nginx-controller -n ingress-nginx -p '{"spec":{"type":"ClusterIP"}}'
操作完成后等2-3分钟,到Azure控制台查看目标公网IP的「关联资源」字段,确认显示为「无」,代表IP已经完全释放,没有被旧资源占用。
不要在IP还没完全解绑的时候就操作新集群,否则云控制器会持续报资源占用错误,卡住绑定流程。
2. 触发新集群绑定目标公网IP
你已经提前在新集群ingress-nginx的YAML里写了目标公网IP的话,不需要额外修改LB配置,等IP释放后云控制器会自动完成绑定,你可以手动重启一次ingress控制器加快调谐流程:
kubectl rollout restart deployment ingress-nginx-controller -n ingress-nginx
执行后持续观察Service状态:
kubectl describe service ingress-nginx-controller -n ingress-nginx
当事件栏出现Ensured Load Balancer记录,且Service的EXTERNAL-IP字段显示你要复用的旧公网IP时,代表绑定完成。
3. 配置校验
绑定完成后不需要手动配置backend pool、健康探针、转发规则,这些都是AKS云控制器自动生成的,手动修改反而会被控制器同步覆盖,你只需要做两个校验:
- 本地curl目标公网IP,确认请求能正常转发到新集群的后端服务,没有超时、5xx错误
- 控制台查看新集群LB的后端池,确认已经正常关联新集群的工作节点,健康探针状态正常
校验通过后观察10-15分钟业务流量无异常,就可以按计划下线、删除旧集群。
- 不要把目标公网IP从旧集群的节点资源组移动到新集群的节点资源组:AKS云控制器默认有同订阅下同区域网络资源的操作权限,移动资源反而可能导致权限校验失败,无法绑定IP
- 如果绑定流程卡了超过10分钟,检查新集群使用的托管标识/服务主体,确认对目标公网IP所在资源组有
Network Contributor权限,权限不足会导致绑定失败 - 不要给旧LB的frontend IP配置加资源锁,否则会导致IP解绑失败,操作前先检查并删除相关资源锁
内容的提问来源于stack exchange,提问作者Patrick Koorevaar

