You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义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使用场景:

  1. 修改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-system
      
      把type: LoadBalancer改成type: NodePort
  2. 确认Ingress Controller的NodePort端口:
    从你之前的kubectl describe svc输出看,已经自动分配了端口:http:31378/TCP、https:32127/TCP
  3. 配置域名解析:
    将test.example.com解析到你集群中任意节点的IP地址
  4. 访问验证:
    现在你可以通过http://test.example.com:31378/entity访问后端服务(HTTPS用32127端口即可)

方案2:使用HostNetwork模式部署Ingress Controller

这种方式让Ingress Controller Pod直接使用宿主机网络,直接监听宿主机的80/443端口,无需额外NodePort:

  1. 修改Ingress Controller的Deployment配置:
    kubectl edit deployment my-nginx-nginx-ingress --namespace kube-system
    
    在spec.template.spec下添加hostNetwork: true
  2. 确保宿主机端口可用:
    检查集群节点的80和443端口没有被其他服务占用
  3. 域名解析与访问:
    同样将test.example.com解析到集群节点IP,之后直接通过http://test.example.com/entity访问即可

方案3:手动配置外部负载均衡器(如果有硬件/自建LB)

如果你有自己的负载均衡器(比如F5、自建Nginx反向代理),可以:

  1. 将LB的流量转发到集群所有节点的NodePort(31378/32127)
  2. 给Ingress Controller的Service添加externalIPs字段:
    kubectl patch svc nginx-ingress --namespace kube-system -p '{"spec":{"externalIPs":["你的LB IP地址"]}}'
    
  3. 之后kubectl get svc nginx-ingress --namespace kube-system就能看到External-IP显示为你的LB地址,域名解析到该LB IP即可访问

额外注意:检查你的Ingress配置正确性

从你提供的ingress.yaml来看,有个潜在问题需要确认:

  • 你的后端Servicetestsvc的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:31:37