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

发布时间:2026/9/28 4:32:15

记录一次部署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 的顺序跑一遍基本十分钟内就能定位到具体是哪一层的问题。
延伸阅读

更多相关文章

2026/9/28 4:32:15

WordPress主题如何更新防挂马技巧及建站报价避坑指南

WordPress主题如何更新防挂马技巧及建站报价避坑指南 昨晚刚收到客户急电,说官网首页突然跳出一堆乱七八糟的广告窗口,浏览器提示“不安全”。这种网站被黑挂马不知道怎么办是站长最头疼的事,往往因为没做好基础防护,最后只能花高价找技术团队救…

2026/9/28 4:27:15

Trae CN 配 TaoToken:AI 代码编辑器 settings.json 骨架与连通性验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/28 5:27:20

基于协同过滤的电影推荐系统实战:Python实现与Web服务部署

简介:一套基于协同过滤推荐算法的电影推荐系统毕业设计项目,面向计算机相关专业学生,适用于毕业设计、课程设计或期末大作业。项目已获导师指导并通过答辩,评审分97分,源码完整、数据库齐全,下载后无需修改…

2026/9/28 5:27:20

YOLO目标检测实战:咖啡叶片数据集训练前校验与避坑指南

简介:面向咖啡叶片检测任务的YOLO系列目标检测数据集,适合具备基础深度学习概念的目标检测初学者、农业视觉研究者,以及需要快速验证模型效果的开发者;可直接用于从YOLOv5到YOLO11的主流版本训练与验证测试。压缩包共含2000个文件…

2026/9/28 5:27:20

2026最新mip网站有什么好处?3招搞定防黑提速

2026最新mip网站有什么好处?3招搞定防黑提速 网站被黑挂马不知道怎么办?别慌,这事儿我见得太多了。很多河南的老板,站刚上线没俩月,突然打开全是赌博广告,吓得连夜删库。其实,这背后往往不是黑客技术有多牛,而是你的网站太“笨重”,给了攻击…

2026/9/28 5:27:20

【网站建设报价多少钱

新手入门网站建设报价多少钱?不写代码也能落地 自己不会代码想做网站,是不是心里特没底?别慌,这正是新手入门最该搞清楚的环节。很多人以为建站必须精通Python或Java,其实现在工具链已经很成熟,选型比写码更重要。…

2026/9/28 5:27:19

上海网站建设行业完整流程拆解:小白不写代码也能落地

上海网站建设行业完整流程拆解:小白不写代码也能落地 自己不会代码想做网站,这是我在上海网站建设行业摸爬滚打十年,听得最多的一句大实话。很多人以为建站就是拖拽几个模板,或者找个人扔两句需求,结果往往是被坑得找不着北,或者做出来的东西根本没法用…

2026/9/28 5:22:19

Java开源采购系统实战:从Spring Boot到状态机与权限设计

1. 项目定位:这个开源采购系统到底解决什么问题做Java开发这些年,见过不少新手拿着图书管理、学生选课这类项目去面试,十有八九会被面试官追问“你这项目有什么业务复杂度”。不是说那些项目不好,而是它们基本只覆盖了增删改查&am…

2026/9/28 3:03:23

东莞市品牌网站建设报价常见报错与解决

东莞品牌网站建设报价单背后:一份保姆级建站教程避坑实录 网站做好了没人访问,这大概是很多老板最头疼的事。花了大几万做的品牌站,上线后流量惨淡,比路边摊还冷清。别急着骂外包公司,很多“东莞品牌网站建设报价”里藏着不少猫腻,比如用模板站冒充定制…

2026/9/27 0:00:45

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/27 0:00:45

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/28 0:02:03

广州外贸网站建设推广:从零搭建全流程拆解与真实报价避坑

广州外贸网站建设推广:从零搭建全流程拆解与真实报价避坑 改个需求建站公司拖一周,后台改个文案还得再交一笔“技术维护费”。这种憋屈事儿,做外贸的朋友太熟悉了。很多老板在找广州外贸网站建设推广服务商时,光盯着首页好不好看,却忽略了从零搭建一个能…

2026/9/28 0:02:04

搞懂百度竞价推广价格,网站性能优化别掉链子

搞懂百度竞价推广价格,网站性能优化别掉链子 网站突然打不开,浏览器弹出红色警告“此网站存在安全风险”,后台一看全是乱码代码和奇怪的跳转链接。这种网站被黑挂马的绝望感,很多刚转行做网站的朋友都经历过,尤其是那些为了省几百块钱服务器费用的新手。…

2026/9/25 20:55:38

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/26 19:58:38

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/28 1:59:25

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑