Kubernetes Debug 专用镜像实践指南
适用人群:SRE / DevOps / 运维工程师
适用场景:Kubernetes 生产环境排障、网络/进程/资源问题快速定位
一、为什么需要 Debug 专用镜像
在实际生产环境中,我们常见的业务镜像往往具备以下特点:
- 基于
alpine/debian-slim/distroless - 体积极小,攻击面低
- 不包含任何运维排障工具
常见问题包括:
ps: command not foundss / netstat / top / free不存在- 无法抓包、无法定位端口、无法确认真实启动参数
结论
生产镜像应该极简,但排障能力不能没有。
因此,一个 Debug 专用镜像 是 Kubernetes 运维体系中的必备组件。
二、Debug 镜像设计原则
一个合格的 Debug 镜像应满足:
-
工具齐全:
- 进程:
pstop - 网络:
ssnetstattcpdump - 系统:
freeuptimevmstat - 基础工具:
curlwgetbash
- 进程:
-
系统稳定:
- Debian / Ubuntu LTS
-
镜像可控:
- 内部镜像仓库
- 固定 tag,不随意变更
-
仅用于排障,不承载业务
三、推荐基础镜像选择
推荐使用:
debian:11ubuntu:22.04
本文以 Debian 11 为例。
四、Debug 镜像 Dockerfile 示例
dockerfile
FROM debian:11
LABEL maintainer="sre@company.com"
LABEL description="Kubernetes Debug Image"
# 替换为大陆镜像源(阿里云)
RUN sed -i 's@deb.debian.org@mirrors.aliyun.com@g' /etc/apt/sources.list \
&& sed -i 's@security.debian.org@mirrors.aliyun.com/debian-security@g' /etc/apt/sources.list
# 安装常用运维调试工具
RUN apt-get update && apt-get install -y \
procps \
iproute2 \
net-tools \
tcpdump \
curl \
wget \
vim \
less \
lsof \
strace \
bash \
&& rm -rf /var/lib/apt/lists/*
CMD ["bash"]
五、镜像包含工具说明
| 分类 | 工具 | 用途 |
|---|---|---|
| 进程 | ps / top | 查看进程、CPU、内存 |
| 网络 | ss / netstat | 查看端口、连接状态 |
| 抓包 | tcpdump | 网络问题定位 |
| 系统 | free / uptime | 资源使用情况 |
| 文件 | lsof | 端口与进程映射 |
| 调试 | strace | 系统调用分析 |
六、构建并推送镜像
bash
docker build -t registry.example.com/ops/k8s-debug:debian11 .
docker push registry.example.com/ops/k8s-debug:debian11
建议:
- 放入 公司私有镜像仓库
- tag 固定(如
debian11/v1.0)
七、在 Kubernetes 中使用 Debug 镜像(推荐)
方式一:kubectl debug(最佳实践)
bash
kubectl debug pod/mx-devops-frontend \
-it \
--image=registry.example.com/ops/k8s-debug:debian11 \
--target=frontend
特点:
- 不影响原 Pod
- 共享网络 / PID / 文件系统(取决于配置)
- 排障完成即可退出
方式二:临时 Debug Pod
yaml
apiVersion: v1
kind: Pod
metadata:
name: debug-tools
spec:
containers:
- name: debug
image: registry.example.com/ops/k8s-debug:debian11
command: ["sleep", "36000"]
适合:
- 长时间排查
- 网络连通性测试
八、常用排障命令速查
查看完整进程启动参数
bash
ps auxww
查看监听端口
bash
ss -lntp
查看端口被哪个进程占用
bash
lsof -i :3000
抓包(示例)
bash
tcpdump -i any port 80
九、生产环境最佳实践建议
- 业务镜像与 Debug 镜像严格分离
- 禁止在业务镜像中安装 tcpdump
- Debug 镜像仅授予运维权限
- 结合 RBAC 控制 kubectl debug 权限
成熟团队一定有 Debug 镜像,没有只是时间问题。
十、总结
ps不存在 ≠ 系统有问题- 而是 镜像设计选择问题
- Debug 镜像是 Kubernetes 运维的"急救箱"
平时不用,但出事时必须能拿出来。
吐槽一下:
说好AI能更好效率工作,释放运维的工作,但是有些公司已经把非运维主要工作硬硬塞进来,已经成为了一个四不像了。
