Nginx-Ingress无法暴露Kubernetes服务,访问域名提示连接被拒绝
根因说明
你部署的Ingress Nginx默认使用了适配云厂商环境的LoadBalancer类型Service,私有部署的Kubernetes集群没有云厂商提供的负载均衡实现,因此Ingress Nginx服务无法在宿主机上暴露80/443端口,导致本地访问域名时连接被拒绝。
排查验证
执行以下命令确认问题:
kubectl get svc -n ingress-nginx
正常会返回类似如下结果,ingress-nginx-controller的TYPE为LoadBalancer,EXTERNAL-IP列显示<pending>:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ingress-nginx-controller LoadBalancer 10.96.xxx.xxx <pending> 80:30080/TCP,443:30443/TCP 1h
解决方案
你可以根据使用场景选择以下任意一种方案:
方案1:修改Ingress Nginx Service为NodePort类型(推荐长期使用)
NodePort类型会将Service端口映射到宿主机端口,你可以直接手动指定映射到80/443端口(需确保宿主机80/443端口未被其他进程占用):
kubectl patch svc ingress-nginx-controller -n ingress-nginx -p '{"spec":{"type":"NodePort","ports":[{"name":"http","port":80,"nodePort":80},{"name":"https","port":443,"nodePort":443}]}}'
配置完成后无需修改hosts文件,直接访问域名即可正常响应。
方案2:配置Ingress Nginx使用hostNetwork模式
让Ingress Nginx Pod直接共享宿主机网络栈,直接监听宿主机的80/443端口:
kubectl patch deployment ingress-nginx-controller -n ingress-nginx -p '{"spec":{"template":{"spec":{"hostNetwork":true,"dnsPolicy":"ClusterFirstWithHostNet"}}}}'
执行后Ingress Nginx Pod会自动重启,重启完成后即可直接访问域名。
方案3:使用端口转发临时测试
如果仅需要临时验证功能,可以执行端口转发命令:
kubectl port-forward svc/ingress-nginx-controller -n ingress-nginx 80:80
命令保持前台运行期间即可正常访问,关闭命令后转发失效。
结果验证
配置完成后执行以下命令确认宿主机80端口已被监听:
ss -tulpn | grep :80
再执行curl访问billing.meetaza.dev和api.meetaza.dev即可正常获取返回结果。
内容的提问来源于stack exchange,提问作者TheArKa
相关产品推荐
相关产品推荐

