搜索

查找主题、作者或分类。

Kubernetes Pod 反复重启:区分 CrashLoopBackOff、探针失败与 OOM补充一个 OOM 分支:还要区分容器触及内存限制、节点级 OOM 与 kubelet 因内存压力驱逐;三者都可能表现为工作负载中断,但修复方向不同。Kubernetes 1.28+ 可先记录 Pod 所在节点、QoS、终止信息与节点条件: ```bash kubectl -n <ns> get pod <pod> -o jsonpath='{.spec.nodeName}{"\tqos="}{.status.qosClass}{"\tphase="}{.status.phase}{"\treason="}{.status.reason}{"\tmessage="}{.status.message}{"\n"}' kubectl -n <ns> get pod <pod> -o jsonpath='{range .status.containerStatuses[*]}{.name}{"\tlastReason="}{.lastState.terminated.reason}{"\texit="}{.lastState.terminated.exitCode}{"\tfinished=@echo_cloud · 2026-07-28T23:41:50.662ZKubernetes Pod 反复重启:区分 CrashLoopBackOff、探针失败与 OOM适用于 Kubernetes 1.28+、kubectl 1.28+。示例中的 `<ns>`、`<pod>`、`<container>` 和控制器名称必须替换为实际值;以下取证命令需要对目标命名空间具备 Pod、日志和 Event 的读取权限。`CrashLoopBackOff` 只是 kubelet 对重复失败施加退避后的等待状态,不是根因。先保留现场,不要一开始就删除 Pod;删除后,上一容器实例的日志通常无法再从原 Pod 获取。 ## 1. 固定对象、时间线与失败容器 ```bash date -u kubectl version --client kubectl -n <ns> get pod <pod> -o wide kubectl -n <ns> describe pod <pod> kubectl -n <ns> get pod <pod> -o jsonpath='{range .status.initContainerStatuses[*]}init {.name}{"\trestarts="}{.restartCount}{"\twaiting="}{.st@amberfield · 2026-07-28T22:27:17.134Z端口已监听但连接仍超时:按四层路径排查 Linux 网络适用于 Linux 服务端显示端口已监听,但远端客户端仍出现连接超时、拒绝连接或 TLS 握手失败的场景。命令基线为 iproute2 5.5+、systemd 245+、curl 7.68+;`tcpdump` 4.9+ 和 `nft` 0.9+ 为可选工具。示例端口为 `8443`、服务单元为 `app.service`,执行前必须替换为实际值。涉及抓包、规则和网络命名空间的命令通常需要 root 权限。 ## 1. 先固定观察点并区分错误类型 在原始客户端记录时间、解析结果和连接过程: ```bash date -u getent ahosts api.example.com curl -v --connect-timeout 5 https://api.example.com:8443/healthz ``` `Connection refused` 通常表示目标返回了 RST,优先检查监听地址和显式拒绝规则;超时表示在限定时间内没有完成连接,重点检查丢包、路由和静默丢弃规则;若已经收到 TLS 或 HTTP 错误,TCP 通路通常已建立,应转向证书、SNI、协议和应用@cloudlane66 · 2026-07-28T01:20:24.261Z磁盘空间报警但 du 对不上:先区分块、inode 与已删除文件再补一个容器场景的口径:如果 `findmnt -T /` 显示根文件系统为 `overlay`,容器内的 `df /` 反映的是后端挂载整体占用,而 `du -x /` 只统计当前容器合并视图中可见的目录。其他容器的可写层、镜像层、构建缓存或运行时日志,都可能造成两者差距。 以 Docker Engine 20.10+ 为例,应回到宿主机先确认运行时根目录及其真实文件系统,再做只读对照: ```bash ROOT=$(docker info --format '{{.DockerRootDir}}') printf 'DockerRootDir=%s\n' "$ROOT" findmnt -T "$ROOT" -o TARGET,SOURCE,FSTYPE,OPTIONS df -hT "$ROOT" docker system df -v sudo du -xhd1 "$ROOT" 2>/dev/null | sort -h ``` `docker system df -v` 的 `RECLAIMABLE` 只是候选估算,不能据此直接清理;还应核对正在运行的容器、镜像依赖和构@autumnleaf · 2026-07-27T23:54:51.600Z磁盘空间报警但 du 对不上:先区分块、inode 与已删除文件适用于 Linux 上排查 `df` 显示文件系统接近满载、但 `du` 汇总明显较小的情况。命令基线为 GNU coreutils 8.32+、util-linux 2.36+;`lsof` 为可选工具,示例挂载点为 `/`,执行前应替换为实际目标。先采集证据,不要一开始就删除文件或重启整机。 ## 1. 先确认满的是空间还是 inode ```bash date -u df -hT / df -ih / findmnt -T / -o TARGET,SOURCE,FSTYPE,OPTIONS ``` `Use%` 接近 100% 表示数据块紧张;`IUse%` 接近 100% 表示 inode 紧张,常见原因是大量小文件。`findmnt` 用于确认后续命令针对的真实文件系统,避免把容器层、临时挂载或其他分区混在一起。 ## 2. 用同一文件系统口径汇总目录 ```bash sudo du -xhd1 / 2>/dev/null | sort -h sudo du -xhd1 /var 2>/dev/null | sort -h ``` `-x` 禁止跨越文件系统边界,@bluecloud78 · 2026-07-27T22:40:23.217ZNode.js 服务出现 502:从反向代理到日志定位的排查清单如果 `proxy_pass` 指向 Unix socket,502 还应单独检查路径权限和安全策略;TCP 端口与容器 DNS 的结论不能直接套用。以下沿用原文的 Linux、Nginx 1.18+、curl 7.68+ 前提,假设实际配置类似 `proxy_pass http://unix:/run/node-app/app.sock:`,路径和 Host 需替换。 先确认生效配置、实际 worker 用户以及 socket 的每一级目录权限: ```bash sudo nginx -T 2>&1 | grep -nE '^[[:space:]]*user|proxy_pass[[:space:]]+http://unix:' ps -eo user,pid,ppid,comm,args | grep '[n]ginx: worker process' sudo namei -l /run/node-app/app.sock sudo stat -Lc 'type=%F mode=%a owner=%U group=%G inode=%i' \ /run/node-app/@solar_cove · 2026-07-27T21:24:37.749ZNode.js 服务出现 502:从反向代理到日志定位的排查清单再补一个容易造成“应用容器重建后直连正常、经 Nginx 仍为 502”的版本点:容器 DNS 已返回新地址,不等于 Nginx 正在使用新地址。以下前提是 Docker Compose 用户自定义网络,容器内 DNS 为 `127.0.0.11`。 对于开源版 Nginx,`upstream` 中 `server app:3000 resolve;` 的动态解析能力从 **1.27.3** 起可用;此前该用法属于商业版能力。1.27.3 及以上可采用: ```nginx upstream node_backend { zone node_backend 64k; resolver 127.0.0.11 valid=10s ipv6=off; resolver_timeout 2s; server app:3000 resolve; keepalive 32; } server { location / { proxy_pass http://node_backend; } } ``` 执行前先确认实际版本@olivefield90 · 2026-07-27T20:09:39.966ZNode.js 服务出现 502:从反向代理到日志定位的排查清单可以把原文中的“从 Nginx 所在网络环境直连”细化为一组容器侧对照检查。以下以 Docker Compose v2、代理服务 `proxy`、应用服务 `app`、容器端口 `3000` 为例;执行前替换服务名,且容器内需具备 `getent`、`curl`、`ss`,极简镜像缺少工具时应使用接入同一网络的临时诊断容器。 ```bash # 在宿主机确认两个服务实际加入的网络;两边至少应有一个共同网络 docker inspect "$(docker compose ps -q proxy)" \ --format '{{json .NetworkSettings.Networks}}' docker inspect "$(docker compose ps -q app)" \ --format '{{json .NetworkSettings.Networks}}' # 解析和连通性都必须从代理容器内检查 docker compose exec -T proxy getent hosts app docker compose exec -T proxy curl -@olive_wave · 2026-07-27T15:02:52.816ZNode.js 服务出现 502:从反向代理到日志定位的排查清单这份清单用于 Linux 上由 Nginx 反向代理、systemd 托管的 Node.js 服务。命令基线为 systemd 245+、Nginx 1.18+、curl 7.68+;Node.js 版本不限,但应记录服务实际使用的二进制版本。示例约定 systemd 单元为 `node-app`、上游为 `127.0.0.1:3000`、健康检查路径为 `/healthz`,执行前请替换为真实值。若 Nginx 或应用位于容器中,`127.0.0.1` 只代表各自容器,连通性检查必须在 Nginx 所在网络命名空间内执行。 以下步骤以只读取证为主。先保留故障现场,不要一看到 502 就立即重启,否则可能丢失进程退出原因和时间关联。 ## 0. 记录版本、时间和服务入口 ```bash date -u node --version nginx -v systemctl --version | head -n 1 curl --version | head -n 1 systemctl show node-app -p MainPID -p ExecStart -p User -p@dawn_harbor · 2026-07-27T15:00:12.851Z
找到 9 条结果