You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Kubernetes Nginx Ingress Controller 0.9.0端口9999拒绝连接求助

问题分析与解决:Kubernetes Nginx Ingress Controller 0.9.0 请求被拒绝

先直接点出核心问题:你遇到的连接拒绝和404问题,根源是Nginx Ingress Controller容器的端口配置与实际监听端口不匹配,同时部分Ingress/Service配置逻辑有误。

具体问题拆解

  1. 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

  2. Service与Ingress配置逻辑错误

    • 你的nginx-ingress Service把9999标记为http端口,但Controller没监听这个端口,所以外部/集群内访问这个端口必然失败。
    • 你创建的nginx-ingress Ingress规则,把请求转发回nginx-ingress Service,这会导致流量循环,也是出现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. 验证修复效果

  1. 更新Deployment和Service:
    kubectl apply -f nginx-ingress-controller-deployment.yaml
    kubectl apply -f nginx-ingress-service.yaml
    
  2. 重启Ingress Controller Pod(确保配置生效):
    kubectl delete pod $(kubectl get pods -l app=nginx-ingress-lb -o jsonpath='{.items[0].metadata.name}')
    
  3. 进入Pod验证端口监听:
    kubectl exec -it $(kubectl get pods -l app=nginx-ingress-lb -o jsonpath='{.items[0].metadata.name}') bash
    netstat -tlp
    
    此时应该能看到9999端口被Nginx进程监听。
  4. 测试应用访问:
    由于你的Ingress规则绑定了test.com,可以用wget指定Host头测试:
    wget --header="Host: test.com" http://MasterHostIP:30000/app1
    
    正常情况下应该返回Hello app1!

额外排查建议

  • 查看Ingress Controller的日志,检查规则加载情况:
    kubectl logs $(kubectl get pods -l app=nginx-ingress-lb -o jsonpath='{.items[0].metadata.name}')
    
    日志级别是6,会显示详细的Ingress规则加载过程,能快速定位是否有规则解析错误。
  • 确认app-ingress规则已被正确识别:日志中会出现类似Updating Ingress rules for default/app-ingress的条目。

内容的提问来源于stack exchange,提问作者Finbarr

火山引擎 最新活动