容器与 Kubernetes
服务放进容器、再交给 Kubernetes 调度之后,很多问题不在应用代码里:资源限额、进程信号、Pod 状态、节点与网络。这个专题从容器本身的边界讲起,每篇都用可复现的实验说明一层机制在什么时候起作用、出了问题时看哪里。
文章
01容器不是轻量虚拟机镜像里没有内核、容器里的 root 就是宿主机 root、nproc 看不见限额,以及 1 号进程收不到 SIGTERM→02进程只占 10 MB,容器却因为内存被杀申请不等于占用、页缓存与 tmpfs 都记在容器头上、上限之下文件页让路而匿名页触发 OOM、kubectl top 看的工作集、-Xms 与预触碰→03日志删掉了,磁盘空间没有回来删除仍被进程打开的文件后 du 归零而 df 不变、进程继续写还会涨;从 /proc 找到并清空、追加方式与清空、改名后的写入去向与日志轮转→04Running 不等于可用没有就绪探针时滚动发布 3.5 秒报成功、请求被拒 9 秒;坏版本卡住不回滚;探针查共用依赖让所有副本一起下线→05同一个镜像 tag,两个节点上跑的不是同一个镜像tag 被重新推送后,按 tag 启动的 Pod 在两个节点上内容不同、重建也不变;Always 的代价、按摘要部署,以及只构建一次再晋级→06Dockerfile 里删掉的文件,还在镜像里后面的指令删除文件只是加一个标记,文件仍在前面的层里;COPY 自成一层、同一条 RUN 里清理、多阶段构建与 secret 挂载、构建参数留在镜像历史里→07节点 NotReady:先分清是 False 还是 Unknown没有 CNI 时 Pod 卡在两个不同的地方、节点全部 Ready 跨节点仍不通、kubelet 停止后旧容器还在处理请求→08Pending、OOMKilled、Evicted:requests 与 limits 各管什么节点只用了 2.6% CPU 却放不下新 Pod、平均占用 0.17 核的 250m limit 让延迟涨到 4.5 倍、OOMKilled 与 Evicted 的区别→09一次请求在集群里经过了什么kube-proxy 按连接而不是按请求分配、两种 Service 配错都是连接被拒绝、ndots 让一次解析变成 8 个查询、出站策略挡住 DNS 要等 20 秒→