遇到容器没有bash甚至没有sh的情况,就像被困在没有门窗的房间。但真正的K8S运维高手,即使面对这种情况也能游刃有余。以下是我们在生产环境锤炼出的7大实战技巧:
一、基础三板斧(新手必学)
1. 日志捕获术------穿透重启迷雾
# 查看实时日志(即使容器不断重启)
kubectl logs -f <pod-name> --tail=100
# 查看已崩溃容器的遗言(关键!)
kubectl logs --previous <pod-name> # 救命命令!
适用场景 :容器启动后立即崩溃
避坑指南:必须开启容器日志持久化,否则重启后日志丢失
2. 全息透视------describe命令
kubectl describe pod <pod-name> | grep -A 20 Events # 重点看事件流
关键线索:
- ImagePullBackoff:镜像拉取失败
- CrashLoopBackOff:程序持续崩溃
- FailedScheduling:节点资源不足
3. 无侵入探测------临时执行命令
# 即使没有shell也能执行单次命令
kubectl exec <pod-name> -- ls /app # 查看目录结构
kubectl exec <pod-name> -- env # 查看环境变量
二、高阶四式(专家必备)
4. 时空穿越术------临时调试容器
# 注入临时容器(需要K8S 1.23+)
kubectl debug -it <pod-name> --image=busybox:1.35 --target=<原容器名>
原理 :在目标Pod中插入一个共享进程命名空间的临时容器
优势:
- 原容器无需任何修改
- 可使用完整工具链(nc/tcpdump等)
限制:需要启用EphemeralContainers特性门控
5. 网络侦探模式------nsenter直连容器网络
# 在宿主机上执行(需节点访问权限)
PID=$(docker inspect -f '{{.State.Pid}}' <容器ID>)
nsenter -n -t $PID ip addr # 查看容器IP
nsenter -n -t $PID tcpdump -i eth0 # 抓包分析
适用场景 :网络不通、端口占用等疑难杂症
安全警告:需严格控制节点SSH访问权限
6. 镜像改造术------构建调试专用镜像
FROM 原镜像
RUN microdnf install -y busybox ncurses # 针对Alpine镜像
# 或
RUN apt-get update && apt-get install -y curl telnet # 针对Debian系
部署技巧:
- 使用独立标签如
-debug
- 通过环境变量控制调试工具安装
生产建议:在CI/CD流水线中准备调试镜像版本
7. 上帝视角------集群级监控
-
Prometheus+Alertmanager:监控容器OOMKilled事件
-
eBPF工具:使用BCC工具集排查系统调用
查看容器内进程文件访问
execsnoop -n <容器进程名>
三、特殊场景破解秘籍
场景1:容器只有静态二进制文件(如Go程序)
# 使用共享卷挂载busybox
kubectl debug -it <pod-name> --image=busybox --share-processes --copy-to=<新pod名>
场景2:容器用户权限受限
# 以root身份进入
kubectl exec -it <pod-name> -- chroot /host /bin/bash # 适用于OpenShift
场景3:Istio服务网格环境
# 使用istio-proxy容器调试
kubectl exec -it <pod-name> -c istio-proxy -- sh
四、生产环境安全红线
严禁直接修改生产容器
所有调试操作必须通过临时容器或副本进行
调试镜像管理规范
- 使用独立镜像仓库存储调试镜像
- 定期扫描镜像漏洞
权限最小化原则
# RBAC配置示例
kind: ClusterRole
rules:
- apiGroups: [""]
resources: ["pods/exec"]
verbs: ["create"] # 仅开放exec权限
五、调试工具全家福
工具 | 适用场景 | 安装方式 |
---|---|---|
busybox | 基础命令缺失 | kubectl debug注入 |
netshoot | 网络故障排查 | nicolaka/netshoot 镜像 |
kubectl-debug | 全功能调试 | 插件安装 |
crictl | 节点级容器操作 | 所有K8S节点预装 |
六、写在最后:调试哲学
- 先观察后动手:70%的问题通过日志和describe即可定位
- 最小侵入原则:像外科手术般精准操作
- 善用可观测性:提前部署监控比事后调试更重要
记住:真正的王者,不是能进入所有容器,而是不用进入容器就能解决问题!