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

配置Traefik NodePort后,节点IP访问K8s应用遭连接拒绝

问题分析与解决方案

一、连接拒绝的根本原因:NodePort服务Endpoints为空

你的NodePort服务无法找到对应的Traefik Pod,导致Endpoints显示<none>,最终连接被拒绝。问题出在服务的Selector标签不匹配:

1. 确认Traefik Pod的实际标签

执行命令查看Traefik Pod的标签:

kubectl get pods -n kube-system -l app.kubernetes.io/name=traefik --show-labels

输出示例:

NAME                      READY   STATUS    RESTARTS   AGE     LABELS
traefik-7cd4fcff6-xxxxx   1/1     Running   0          40d     app.kubernetes.io/instance=traefik,app.kubernetes.io/name=traefik,...

可以看到Traefik Pod的标签只有app.kubernetes.io/instance=traefik和app.kubernetes.io/name=traefik,并没有app=traefik标签,但你的NodePort服务Selector里错误包含了这个多余标签,导致Pod匹配失败。

2. 修正NodePort服务配置

删除多余的app=traefik标签,确保Selector与LoadBalancer服务完全一致:

apiVersion: v1
kind: Service
metadata:
  name: traefik-node-port-svc
  namespace: kube-system
spec:
  type: NodePort
  ports:
  - name: web
    port: 80
    targetPort: web
    nodePort: 30182
    protocol: TCP
  - name: websecure
    port: 443
    targetPort: websecure
    nodePort: 30183
    protocol: TCP
  selector:
    app.kubernetes.io/name: traefik
    app.kubernetes.io/instance: traefik

重新部署服务:

kubectl apply -f traefik-node-port-svc.yaml

再次查看服务详情,Endpoints会显示Traefik Pod的IP,说明匹配成功。

二、实现通过节点IP直接访问应用

即使NodePort服务正常,直接用http://192.168.10.82:30182访问仍会返回404——因为当前Ingress规则仅匹配my.app域名,Traefik不知道如何路由无域名的IP请求。需要修改Ingress配置:

方案1:添加默认路由(无host规则)

在现有Ingress中添加一条无host的规则,作为所有未匹配域名请求的默认路由:

kind: Ingress
...
spec:
  rules:
    - host: my.app
      http:
        paths:
          - pathType: ImplementationSpecific
            path: /
            backend:
              service:
                name: my-app-svc
                port:
                  number: 3000
    # 添加默认路由
    - http:
        paths:
          - pathType: ImplementationSpecific
            path: /
            backend:
              service:
                name: my-app-svc
                port:
                  number: 3000

方案2:添加节点IP的host规则

如果不想设置全局默认路由,可以添加一条匹配节点IP的host规则:

kind: Ingress
...
spec:
  rules:
    - host: my.app
      http:
        paths:
          - pathType: ImplementationSpecific
            path: /
            backend:
              service:
                name: my-app-svc
                port:
                  number: 3000
    # 添加节点IP的路由规则
    - host: 192.168.10.82
      http:
        paths:
          - pathType: ImplementationSpecific
            path: /
            backend:
              service:
                name: my-app-svc
                port:
                  number: 3000

测试访问

重新部署Ingress:

kubectl apply -f your-ingress.yaml

执行测试命令:

curl 192.168.10.82:30182

此时应能正常返回应用内容。

额外优化:无需新增NodePort服务

你已有的LoadBalancer服务外部IP就是192.168.10.82,直接修改Ingress添加上述规则后,无需部署NodePort服务,用http://192.168.10.82即可访问应用,更简洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 07:04:58