K8s无Shell容器排障指南
Kubernetes无Shell容器排障指南
在云原生时代,越来越多的生产容器采用精简镜像(如Distroless、Scratch),这些"沉默的容器"虽然提升了安全性,却给故障排查带来了新挑战。本文将分享一线SRE团队的无Shell排障实战经验。
一、无Shell容器三大特征
- 极简主义:移除所有非必要组件(如/bin/sh)
- 安全加固:减少攻击面,遵循最小权限原则
- 只读文件系统:防止运行时篡改
二、六大战术突破"沉默防线"
战术1:日志捕手(基础必杀技)
# 实时日志追踪(适合启动问题)
kubectl logs -f <pod-name> --since=5m --tail=100
# 多容器日志聚合(Sidecar模式)
kubectl logs <pod-name> --all-containers
战术2:事件回溯(kubectl describe)
kubectl describe pod <pod-name> | grep -A 30 Events
典型事件解密:
Warning Unhealthy 3s kubelet Readiness probe failed:
HTTP probe failed with statuscode: 503
👉 诊断方向:就绪探针失败,检查应用健康接口
战术3:临时调试容器(Ephemeral Containers)
# Kubernetes 1.23+ 版本支持
kubectl debug -it <pod-name> --image=busybox --target=<目标容器>
操作示例:
# 检查容器进程
ps aux
# 查看网络连接
netstat -tulpn
# 测试DNS解析
nslookup service.namespace.svc.cluster.local
战术4:文件系统侦察
# 从容器内复制文件
kubectl cp <pod-name>:/app/config.yaml ./config-copy.yaml
# 向容器注入诊断工具
kubectl cp /usr/local/bin/strace <pod-name>:/tmp/
kubectl exec <pod-name> -- /tmp/strace -p 1
战术5:Sidecar诊断舱
# 临时添加调试容器
apiVersion: v1
kind: Pod
metadata:
name: debug-pod
spec:
containers:
- name: app
image: distroless-app:v1
- name: debugger # 诊断专用容器
image: nicolaka/netshoot
command: ["sleep", "3600"]
战术6:节点级深度检查
# 定位容器运行时目录
crictl inspect <container-id> | jq .info.runtimeSpec.linux.mounts
# 直接查看容器文件系统
# 节点操作(需root)
cd /var/lib/containerd/.../rootfs
ls -l app/
三、经典排障场景演练
场景1:Golang应用OOM崩溃
- 症状:容器反复重启,无可用日志
- 武器库:
# 检查退出码 kubectl get pod -o jsonpath='{.status.containerStatuses[0].lastState.terminated.exitCode}' # 查看内核日志 journalctl -k | grep -i oom
场景2:Python应用依赖缺失
- 突破步骤:
- 使用kubectl cp导入ldd
- 检查动态链接库
kubectl exec <pod> -- /tmp/ldd /app/main
场景3:JVM堆内存配置错误
- 内存取证:
# 导出内存映射 kubectl exec <pod> -- cat /proc/1/maps > heap.txt # 分析Native内存 kubectl debug --image=photon:3.0 -- perf mem report
四、防御性编程:构建可观测容器
1. 必备诊断接口
# 容器规范示例
livenessProbe:
exec:
command: ["/bin/health", "status"]
readinessProbe:
httpGet:
path: /healthz
port: 8080
2. 标准化日志输出
# Python日志模板
import logging
logging.basicConfig(
format='%(asctime)s | %(levelname)s | %(module)s | %(message)s',
level=logging.INFO
)
3. 构建时注入元数据
# Dockerfile最佳实践
ARG BUILD_TIME
ENV BUILD_TIMESTAMP=$BUILD_TIME
LABEL org.opencontainers.image.revision=$GIT_COMMIT
五、无Shell排障工具包
| 工具名称 | 适用场景 | 安装方式 |
|---|---|---|
| busybox | 基础命令替代 | kubectl debug镜像自带 |
| nsenter | 命名空间渗透 | 节点预装 |
| strace | 系统调用跟踪 | kubectl cp动态注入 |
| tcpdump | 网络抓包分析 | Sidecar容器运行 |
| checkers | 容器健康检查 | 预埋HTTP端点 |
生产经验法则:
- 80%的问题可通过日志和事件定位
- 优先使用kubectl debug避免污染生产环境
- 关键业务建议预留诊断接口
- 定期演练无Shell排障流程
掌握这些无侵入式诊断技巧,即使面对"哑巴"容器也能游刃有余。建议将常用命令封装成脚本,并纳入团队排障手册,让沉默的容器开口"说话"。
浙公网安备 33010602011771号