Azure K8s部署后如何将Nginx Ingress Controller的公网IP更换为预留静态IP
AKS Nginx Ingress 更换绑定预留静态公网IP操作指南
原操作失效原因
- 手动修改Service的
status字段属于无效操作:该字段由AKS云控制器自动托管,用户无写入权限;同时status.loadBalancer.ingress本身是数组结构,手动传入map结构会直接触发格式校验报错,即你遇到的cannot restore slice from map问题。 - 直接在Azure门户修改底层LoadBalancer公网IP的操作,会被AKS控制器的自动协调逻辑覆盖,最终IP配置会回到初始自动分配的状态,无法生效。
前置准备
- 确认两个预留静态公网IP满足以下要求:
- 公网IP SKU为Standard,匹配AKS默认Standard Load Balancer的规格要求
- 公网IP所在Azure区域与AKS集群完全一致
- 提前获取两个静态IP的完整Azure资源ID,格式为
/subscriptions/<你的订阅ID>/resourceGroups/<IP所在资源组名>/providers/Microsoft.Network/publicIPAddresses/<静态IP实例名称>
- 若静态IP未存放在AKS默认创建的
MC_<集群资源组名>_<集群名>_<区域>节点资源组内,需提前给AKS集群关联的托管标识/服务主体,分配静态IP所在资源组的「网络参与者」权限,确保AKS具备操作该IP的权限。
具体操作步骤
所有配置通过给LoadBalancer Service添加Azure专属注解完成,无需手动修改任何系统托管字段,执行后等待1-2分钟控制器自动完成IP绑定即可:
- 为ingress-A命名空间下的ingress-nginx-controller LoadBalancer Service,绑定第一个预留静态IP:
kubectl annotate svc ingress-nginx-controller -n ingress-A \ service.beta.kubernetes.io/azure-load-balancer-resource-id="<你的第一个静态IP完整资源ID>" \ --overwrite - 为ingress-B命名空间下的ingress-nginx-controller LoadBalancer Service,绑定第二个预留静态IP:
kubectl annotate svc ingress-nginx-controller -n ingress-B \ service.beta.kubernetes.io/azure-load-balancer-resource-id="<你的第二个静态IP完整资源ID>" \ --overwrite
验证与收尾
- 执行
kubectl get svc -A | grep ingress-nginx-controller查看两个Service的EXTERNAL-IP字段,确认已替换为你预留的静态IP地址。 - 原自动生成的动态公网IP会在新IP绑定完成后自动解绑,确认无其他服务依赖后,可手动删除这些临时IP,避免产生额外费用。
内容的提问来源于stack exchange,提问作者ikenahim
相关产品推荐
相关产品推荐

