新闻详情

新闻详情

首页 / 资讯中心 / 详情

记录一次部署k3s后,服务404 page not found,nginx显示正常:从Traefik到iptables的排查链路

发布时间:2026/9/28 4:32:16来源:尧图网络
记录一次部署k3s后,服务404 page not found,nginx显示正常:从Traefik到iptables的排查链路
1. 一次诡异的 404nginx 日志干净得让人发毛如果你在 k3s 里部署完服务浏览器访问域名却只看到一行冷冰冰的404 page not found第一反应大概率是去翻 nginx 的 access.log 和 error.log。结果日志里干干净净连一条请求记录都没有——这时候你就该意识到请求压根没走到 nginx 这一层。我这次遇到的场景就是这样k3s 单节点集群服务用 Deployment 跑着Service 是 ClusterIPIngress 用的是 k3s 自带的 Traefik。域名解析没问题curl本地 Pod IP 能拿到正常页面但一从外部访问域名返回的就是 Traefik 默认的 404 页面。更迷惑的是kubectl get pods里 nginx 的 Pod 状态是 Runningkubectl logs里没有任何异常kubectl get ingress也显示 ADDRESS 有值。这个 404 的本质是请求到达了 Traefik但 Traefik 没有匹配到任何 IngressRoute 规则于是返回了默认的 404。问题不在 nginx也不在 Service而在 Traefik 到 Service 之间的路由匹配以及更底层的 iptables 转发链路。下面我把整条链路拆开逐层验证每一步都给可复制的命令。2. 前置准备确认 k3s 与 Traefik 的版本和入口在开始排查之前先把环境信息固定下来。k3s 不同版本自带的 Traefik 版本差异较大IngressRoute 的 API 版本和字段名会变所以第一步是确认版本。# 查看 k3s 版本 k3s --version # 查看 Traefik 相关 Pod kubectl get pods -n kube-system | grep traefik # 查看 Traefik Service kubectl get svc -n kube-system -o wide | grep traefik我这边输出大致是k3s version v1.28.2k3s1 traefik-7d9f8c6b5-xxxxx 1/1 Running 0 3d traefik LoadBalancer 10.43.0.1 192.168.1.100 80:30080/TCP,443:30443/TCP注意这里traefik这个 Service 的类型是 LoadBalancerk3s 内置的 ServiceLB也就是 klipper-lb会给它分配一个外部 IP同时把 80 和 443 映射到节点端口。如果你的节点上已经有别的进程占用了 80/443或者 iptables 里有旧的 DNAT 规则流量就会被劫持到别的地方这正是我这次踩坑的核心。提示k3s 默认会把 Traefik 的 80/443 通过 ServiceLB 暴露到节点上。如果你之前装过 nginx、apache 或者别的反向代理先确认端口占用情况。3. 可复制配置从 IngressRoute 到 Service 的完整定义排查 404 的第一步是确认你的 IngressRoute 到底有没有正确匹配。下面是一个最小可用的 IngressRoute 配置我把它拆成三块Deployment、Service、IngressRoute。apiVersion: apps/v1 kind: Deployment metadata: name: web-demo namespace: default spec: replicas: 1 selector: matchLabels: app: web-demo template: metadata: labels: app: web-demo spec: containers: - name: nginx image: nginx:1.25-alpine ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: web-demo-svc namespace: default spec: selector: app: web-demo ports: - name: http port: 80 targetPort: 80 --- apiVersion: traefik.io/v1alpha1 kind: IngressRoute metadata: name: web-demo-route namespace: default spec: entryPoints: - web routes: - match: Host(demo.example.com) kind: Rule services: - name: web-demo-svc port: 80关键点有三个entryPoints必须是web对应 80或websecure对应 443match里的 Host 必须和你的访问域名完全一致services里的 name 和 port 必须和 Service 对得上。任何一处写错Traefik 都会返回 404。应用之后用下面的命令确认资源都创建成功kubectl apply -f web-demo.yaml kubectl get ingressroute -n default kubectl get svc web-demo-svc -n default kubectl get endpoints web-demo-svc -n defaultkubectl get endpoints这一步特别重要。如果 Endpoints 是空的说明 Service 的 selector 没匹配到任何 PodTraefik 即使匹配到了路由也会因为后端为空而返回 404 或 503。4. 逐层验证Service、Endpoint、IngressRoute 与 iptables4.1 验证 Service 和 Endpoint# 查看 Service 详情确认 selector 和 port kubectl describe svc web-demo-svc -n default # 查看 Endpoint必须有 Pod IP:Port kubectl get endpoints web-demo-svc -n default -o wide正常输出应该是NAME ENDPOINTS AGE web-demo-svc 10.42.0.15:80 5m如果 ENDPOINTS 显示none就去检查 Pod 的 labels 是否和 Service 的 selector 一致。这一步用kubectl get pods --show-labels对照即可。4.2 验证 IngressRoute 是否被 Traefik 识别# 查看 Traefik 的 dashboard 端口或者直接看 CRD 状态 kubectl get ingressroute web-demo-route -n default -o yaml # 查看 Traefik 日志确认有没有加载路由 kubectl logs -n kube-system -l app.kubernetes.io/nametraefik --tail100Traefik 日志里如果出现No matching route found或者rule not matched基本就是 match 写错了。我这次的问题是 Host 写成了demo.example.com但实际访问的是www.demo.example.com差一个www就 404。4.3 验证 iptables 转发链路这是最容易被忽略的一层。k3s 的 ServiceLB 会在节点上写 iptables 规则把外部流量 DNAT 到 Traefik 的 Pod。如果节点上之前有别的服务占用了 80/443iptables 里可能残留旧的 DNAT 规则导致流量被转到错误的后端。# 查看 nat 表中 80 和 443 的 DNAT 规则 sudo iptables -L -n -t nat | grep -E 80|443 # 查看具体的 DNAT 目标 sudo iptables -t nat -L PREROUTING -n -v --line-numbers我当时的输出里出现了两条 80 端口的 DNAT一条指向 Traefik 的 Pod IP另一条指向一个已经不存在的旧 Pod IP。旧规则优先级更高流量就被转到了那个已经不存在的地址表现就是 404 或者连接超时。清理旧规则的方法是先确认规则编号然后删除# 假设旧规则在 PREROUTING 链的第 3 条 sudo iptables -t nat -D PREROUTING 3注意直接操作 iptables 有风险建议先iptables-save /tmp/iptables.bak备份确认无误后再删除。k3s 重启后会自动重建 ServiceLB 的规则所以手动删掉的旧规则不会影响 k3s 自身。4.4 完整请求链路验证动作把上面几步串起来做一次端到端验证# 1. 从集群内部直接访问 Service kubectl run curl-test --rm -it --imagecurlimages/curl -- sh curl -H Host: demo.example.com http://web-demo-svc.default.svc.cluster.local # 2. 从节点上访问 Traefik 的 NodePort curl -H Host: demo.example.com http://127.0.0.1:30080 # 3. 从外部访问域名 curl -v -H Host: demo.example.com http://节点IP如果第 1 步通、第 2 步不通问题在 Traefik 到 Service 的路由如果第 2 步通、第 3 步不通问题在 iptables 或节点端口映射。我这次就是第 2 步通、第 3 步不通最终定位到 iptables 旧规则。5. 本篇常见错排查清单下面这张表是我在实际排查中整理出来的高频错误按出现概率排序现象可能原因验证命令修复方式404 page not foundIngressRoute match 写错kubectl logs -n kube-system -l app.kubernetes.io/nametraefik修正 Host 或 Path404 且 nginx 无日志请求未到达 nginxkubectl get endpoints检查 Service selector404 但 Endpoint 正常Traefik 未加载路由kubectl get ingressroute -o yaml确认 CRD 版本和 entryPoints连接被拒绝iptables 旧规则劫持iptables -L -n -t nat | grep 80删除旧 DNAT 规则证书错误用了 Traefik 默认证书kubectl get secret -n kube-system配置正确的 TLS secret间歇性 404多副本 Pod 标签不一致kubectl get pods --show-labels统一 labels其中「404 且 nginx 无日志」和「连接被拒绝」这两类最容易让人误以为是中间人攻击或者数据库被锁。我这次就一度怀疑是外部攻击甚至重置了服务结果第二天装完 k3s 又复现了才发现是 iptables 规则冲突。提示如果你在节点上跑过 Docker 或者其他容器运行时它们也会往 iptables 里写规则。k3s 的 ServiceLB 和 Docker 的端口映射经常打架排查时一定要把iptables -t nat -L完整看一遍。6. 把请求链路固定下来后续接入更省心排查完这一轮我最大的感受是k3s 的 Ingress 链路虽然组件不多但每一层都有独立的失败模式。Traefik 负责路由匹配Service 负责服务发现Endpoint 负责后端地址iptables 负责流量转发。任何一层出问题表现都可能是 404但根因完全不同。如果你后续要频繁调试模型接口或者做本地 Agent 开发建议把 API Key 和接入文档提前准备好避免在环境问题上反复消耗时间。模型对话调试可以直接在网页端验证请求格式接入文档里有完整的鉴权和请求示例Coding Plan 则适合长期跑编码类 Agent 任务省去每次手动配环境的麻烦。把上面的排查命令存成一个脚本下次再遇到 404按 Service → Endpoint → IngressRoute → iptables 的顺序跑一遍基本十分钟内就能定位到具体是哪一层的问题。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

智能仓储项目技术专家如何避免背锅?从技术思维到项目防守 2026/9/28 6:39:23

智能仓储项目技术专家如何避免背锅?从技术思维到项目防守

1. 困局拆解:技术专家怎么就成了“背锅侠”先说说我自己的经历。干了八年智能仓储,从WMS(仓储管理系统)开发到自动化立体库集成,再到整个智能仓项目的现场交付负责人,我算是完整走过了“技术越干越深、锅也…

阅读更多 →
PostgreSQL删除表格全指南:从DROP TRUNCATE到误删恢复 2026/9/28 6:39:23

PostgreSQL删除表格全指南:从DROP TRUNCATE到误删恢复

说实话,做数据库的人每天打交道最多的操作,除了查询,就是删除。而“PostgreSQL 删除表格”这件事,看着简单,实际藏了不少坑。刚入门的同学可能觉得不就是一条DROP TABLE嘛,老手都知道,删除表格牵…

阅读更多 →
建设网站要买服务器?3个免费工具搞定选型与备案 2026/9/28 6:39:23

建设网站要买服务器?3个免费工具搞定选型与备案

建设网站要买服务器?3个免费工具搞定选型与备案 域名买好了,服务器到底该挑哪家?这是90%的建站新手最容易卡壳的地方。很多人对着阿里云、腾讯云的控制台发呆,配置看花了眼,价格算不明白,更担心买回来备案过不了、速度跟不上。…

阅读更多 →
编程语言类型系统扩展:编译期状态机约束与注解处理器实战 2026/9/28 6:39:22

编程语言类型系统扩展:编译期状态机约束与注解处理器实战

1. 类型系统扩展的整体设计思路类型系统这个东西,表面上看起来是编程语言里最“学术”的部分,什么Hindley-Milner推断、协变逆变、Traits约束……但真正把语言用在生产环境里,你会发现类型系统其实是一个“被低估的工程杠杆”。为什么这么说&…

阅读更多 →
DenseUnet腹部多脏器分割实战:数据集、训练评估与推理全流程 2026/9/28 6:39:22

DenseUnet腹部多脏器分割实战:数据集、训练评估与推理全流程

简介:这是一份面向医学图像分割研究与学习场景的实战资源,基于DenseUnet实现腹部多脏器分割,类别覆盖背景、肝脏、右肾、左肾与脾脏,并附带完整代码、数据集和训练结果。压缩包内共31个文件,以Python脚本为主&#xff…

阅读更多 →
揭秘美工工资一般多少,建站安全怎么选才不踩坑 2026/9/28 6:39:16

揭秘美工工资一般多少,建站安全怎么选才不踩坑

揭秘美工工资一般多少,建站安全怎么选才不踩坑 备案流程一头雾水?别慌,先搞懂 美工工资一般多少 这个底牌,再谈网站安全 怎么选…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉