私有网络K8s集群部署Ingress Nginx Controller遇External IP Pending问题求助
问题:Ingress Nginx Controller的LoadBalancer服务External IP处于Pending状态
集群环境与问题描述
- K8s集群:控制平面节点IP为192.168.1.66,仅包含一个worker节点(IP 192.18.1.67),所有节点无公网IP
- 部署状态:部署Ingress Nginx Controller至「创建Ingress控制器及准入控制器服务」步骤,发现
ingress-nginx-controller服务的External IP始终处于<pending>状态
相关kubectl命令输出
服务列表输出
bino@corobalap ~/k8nan/ingresnginx/nginx-ingress-controller/manifests main kubectl --namespace ingress-nginx get services -o wide NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR ingress-nginx-controller LoadBalancer 10.100.42.100 <pending> 80:30482/TCP,443:31697/TCP 6m32s app.kubernetes.io/component=controller,app.kubernetes.io/instance=ingress-nginx,app.kubernetes.io/name=ingress-nginx ingress-nginx-controller-admission ClusterIP 10.106.242.13 <none> 443/TCP 6m32s app.kubernetes.io/component=controller,app.kubernetes.io/instance=ingress-nginx,app.kubernetes.io/name=ingress-nginx
服务详情输出
bino@corobalap ~/k8nan kubectl describe service ingress-nginx-controller --namespace ingress-nginx Name: ingress-nginx-controller Namespace: ingress-nginx Labels: app.kubernetes.io/component=controller app.kubernetes.io/instance=ingress-nginx app.kubernetes.io/name=ingress-nginx Annotations: <none> Selector: app.kubernetes.io/component=controller,app.kubernetes.io/instance=ingress-nginx,app.kubernetes.io/name=ingress-nginx Type: NodePort IP Family Policy: SingleStack IP Families: IPv4 IP: 10.100.42.100 IPs: 10.100.42.100 Port: http 80/TCP TargetPort: http/TCP NodePort: http 30482/TCP Endpoints: 10.244.1.11:80 Port: https 443/TCP TargetPort: https/TCP NodePort: https 31697/TCP Endpoints: 10.244.1.11:443 Session Affinity: None External Traffic Policy: Local Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Type 54m service-controller LoadBalancer -> NodePort
解决方法
原因
LoadBalancer类型服务依赖云厂商提供的负载均衡器资源,私有集群无此支持,因此K8s自动将服务降级为NodePort类型(从事件日志LoadBalancer -> NodePort可确认)。
操作方案
临时访问方案:使用NodePort直接访问
直接通过worker节点IP+NodePort端口访问Ingress Controller:- HTTP:
http://192.18.1.67:30482 - HTTPS:
https://192.18.1.67:31697
- HTTP:
永久调整:改为NodePort类型部署
修改Ingress Controller的服务yaml文件,将spec.type从LoadBalancer改为NodePort,然后重新执行部署命令:kubectl apply -f <修改后的yaml文件路径>进阶方案:部署MetalLB实现本地LoadBalancer
若需要为服务分配固定内网IP,可部署MetalLB(私有集群的负载均衡器实现):- 确保集群CNI支持
strictARP(如Calico需修改配置) - 安装MetalLB的CRD和控制器组件
- 配置MetalLB的IP地址池(使用集群内网中未被占用的IP段,例如
192.168.1.200-192.168.1.210) - 重新部署Ingress Controller服务,此时External IP会被MetalLB分配为配置池内的可用IP
- 确保集群CNI支持
内容的提问来源于stack exchange,提问作者Bino Oetomo
相关产品推荐
相关产品推荐

