自定义Kubeadm集群中Nginx Ingress Controller无法生成LoadBalancer IP
可以在你的自定义Kubernetes集群中实现Ingress功能!
你的核心问题在于LoadBalancer类型的Service在自建kubeadm集群中无法自动获取外部IP——这是因为kubeadm搭建的集群没有集成云厂商(比如AWS、GCP)的负载均衡器驱动,Kubernetes没法自动申请云平台的LB资源,所以External-IP会一直处于<pending>状态。但我们可以通过调整Ingress Controller的暴露方式来解决这个问题,具体方案如下:
方案1:将Ingress Controller改为NodePort类型暴露
这是最直接的解决方案,适配你熟悉的NodePort使用场景:
- 修改Ingress Controller的Service配置:
- 如果你用Helm管理,编辑
values.yaml将ingressService.type从LoadBalancer改为NodePort,然后执行:helm upgrade my-nginx k2-charts/nginx-ingress --namespace kube-system -f updated-values.yaml - 或者直接用kubectl修改现有Service:
把kubectl edit svc nginx-ingress --namespace kube-systemtype: LoadBalancer改成type: NodePort
- 如果你用Helm管理,编辑
- 确认Ingress Controller的NodePort端口:
从你之前的kubectl describe svc输出看,已经自动分配了端口:http:31378/TCP、https:32127/TCP - 配置域名解析:
将test.example.com解析到你集群中任意节点的IP地址 - 访问验证:
现在你可以通过http://test.example.com:31378/entity访问后端服务(HTTPS用32127端口即可)
方案2:使用HostNetwork模式部署Ingress Controller
这种方式让Ingress Controller Pod直接使用宿主机网络,直接监听宿主机的80/443端口,无需额外NodePort:
- 修改Ingress Controller的Deployment配置:
在kubectl edit deployment my-nginx-nginx-ingress --namespace kube-systemspec.template.spec下添加hostNetwork: true - 确保宿主机端口可用:
检查集群节点的80和443端口没有被其他服务占用 - 域名解析与访问:
同样将test.example.com解析到集群节点IP,之后直接通过http://test.example.com/entity访问即可
方案3:手动配置外部负载均衡器(如果有硬件/自建LB)
如果你有自己的负载均衡器(比如F5、自建Nginx反向代理),可以:
- 将LB的流量转发到集群所有节点的NodePort(31378/32127)
- 给Ingress Controller的Service添加
externalIPs字段:kubectl patch svc nginx-ingress --namespace kube-system -p '{"spec":{"externalIPs":["你的LB IP地址"]}}' - 之后
kubectl get svc nginx-ingress --namespace kube-system就能看到External-IP显示为你的LB地址,域名解析到该LB IP即可访问
额外注意:检查你的Ingress配置正确性
从你提供的ingress.yaml来看,有个潜在问题需要确认:
- 你的后端Service
testsvc的servicePort写的是30003,但从values.yaml看,你的Service配置的port是8007,容器端口是80。请确保ingress.yaml中的servicePort和testsvc实际暴露的端口一致(用kubectl get svc testsvc查看)。如果不一致,需要修正ingress.yaml中的servicePort值。
配置完成后,可以用kubectl describe ingress test-ingress查看Ingress规则是否正常生效,也可以在集群内部用以下命令测试:
curl -H "Host: test.example.com" http://<集群节点IP>:<NodePort>/entity
内容的提问来源于stack exchange,提问作者Pranita Kadge
相关产品推荐
相关产品推荐

