Kubernetes Nginx Ingress Controller 0.9.0端口9999拒绝连接求助
问题分析与解决:Kubernetes Nginx Ingress Controller 0.9.0 请求被拒绝
先直接点出核心问题:你遇到的连接拒绝和404问题,根源是Nginx Ingress Controller容器的端口配置与实际监听端口不匹配,同时部分Ingress/Service配置逻辑有误。
具体问题拆解
Ingress Controller未监听9999端口
Nginx Ingress Controller 0.9.0有默认的端口规则:- 80端口:默认处理HTTP类型的Ingress流量
- 443端口:默认处理HTTPS类型的Ingress流量
- 18080端口:默认的状态/监控端口(对应启动参数
--status-port=18080,这也是你能访问32000/nginx_status的原因)
你在Deployment的
containers.ports里手动加了9999端口,但没有通过启动参数告诉Controller要监听这个端口,所以Pod内的Nginx进程根本不会在9999上开启监听,自然会出现Connection refused。Service与Ingress配置逻辑错误
- 你的
nginx-ingressService把9999标记为http端口,但Controller没监听这个端口,所以外部/集群内访问这个端口必然失败。 - 你创建的
nginx-ingressIngress规则,把请求转发回nginx-ingressService,这会导致流量循环,也是出现404的原因之一——这个Ingress完全是多余的,应该删除。
- 你的
分步解决步骤
1. 修正Ingress Controller的端口监听配置
如果你一定要用9999作为HTTP流量端口,需要在Deployment的启动参数里添加--http-port=9999,告诉Controller监听这个端口:
apiVersion: extensions/v1beta1 kind: Deployment metadata: name: nginx-ingress-controller annotations: kubernetes.io/ingress.class: "nginx" spec: replicas: 1 revisionHistoryLimit: 3 template: metadata: labels: app: nginx-ingress-lb spec: terminationGracePeriodSeconds: 60 serviceAccount: nginx containers: - name: nginx-ingress-controller image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.9.0 imagePullPolicy: Always readinessProbe: httpGet: path: /healthz port: 10254 scheme: HTTP livenessProbe: httpGet: path: /healthz port: 10254 scheme: HTTP initialDelaySeconds: 10 timeoutSeconds: 5 args: - /nginx-ingress-controller - '--default-backend-service=$(POD_NAMESPACE)/default-backend' - '--configmap=$(POD_NAMESPACE)/nginx-ingress-controller-conf' - '--http-port=9999' # 新增:指定HTTP流量监听端口为9999 - --v=6 env: - name: POD_NAME valueFrom: fieldRef: fieldPath: metadata.name - name: POD_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace ports: - containerPort: 9999 # 保留这个端口配置 - containerPort: 443 - containerPort: 18080
如果不需要自定义端口,直接把容器端口改回默认的80,同时删除--http-port参数即可。
2. 修正nginx-ingress Service配置
如果用自定义的9999端口,当前的Service配置是对的;如果改回默认80端口,需要调整Service的ports部分:
apiVersion: v1 kind: Service metadata: name: nginx-ingress spec: type: NodePort ports: - port: 80 nodePort: 30000 name: http - port: 18080 nodePort: 32000 name: http-mgmt selector: app: nginx-ingress-lb
3. 删除错误的nginx-ingress Ingress规则
这个Ingress会把请求转发回Ingress Controller自身,完全没有意义,直接删除:
kubectl delete ingress nginx-ingress
4. 验证修复效果
- 更新Deployment和Service:
kubectl apply -f nginx-ingress-controller-deployment.yaml kubectl apply -f nginx-ingress-service.yaml - 重启Ingress Controller Pod(确保配置生效):
kubectl delete pod $(kubectl get pods -l app=nginx-ingress-lb -o jsonpath='{.items[0].metadata.name}') - 进入Pod验证端口监听:
此时应该能看到9999端口被Nginx进程监听。kubectl exec -it $(kubectl get pods -l app=nginx-ingress-lb -o jsonpath='{.items[0].metadata.name}') bash netstat -tlp - 测试应用访问:
由于你的Ingress规则绑定了test.com,可以用wget指定Host头测试:
正常情况下应该返回wget --header="Host: test.com" http://MasterHostIP:30000/app1Hello app1!。
额外排查建议
- 查看Ingress Controller的日志,检查规则加载情况:
日志级别是6,会显示详细的Ingress规则加载过程,能快速定位是否有规则解析错误。kubectl logs $(kubectl get pods -l app=nginx-ingress-lb -o jsonpath='{.items[0].metadata.name}') - 确认
app-ingress规则已被正确识别:日志中会出现类似Updating Ingress rules for default/app-ingress的条目。
内容的提问来源于stack exchange,提问作者Finbarr




