配置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

