K8s无Shell容器排障指南

Kubernetes无Shell容器排障指南

在云原生时代,越来越多的生产容器采用精简镜像(如Distroless、Scratch),这些"沉默的容器"虽然提升了安全性,却给故障排查带来了新挑战。本文将分享一线SRE团队的无Shell排障实战经验。


一、无Shell容器三大特征

  1. 极简主义:移除所有非必要组件(如/bin/sh)
  2. 安全加固:减少攻击面,遵循最小权限原则
  3. 只读文件系统:防止运行时篡改

二、六大战术突破"沉默防线"

战术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应用依赖缺失

  • 突破步骤
    1. 使用kubectl cp导入ldd
    2. 检查动态链接库
    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排障流程

掌握这些无侵入式诊断技巧,即使面对"哑巴"容器也能游刃有余。建议将常用命令封装成脚本,并纳入团队排障手册,让沉默的容器开口"说话"。

posted on 2025-03-08 18:11  Leo-Yide  阅读(66)  评论(0)    收藏  举报