排查Pod CrashLoopBackOff
凌晨两点,线上服务 Pod 反复 CrashLoopBackOff,开发在群里发来一段模糊的报错日志。运维通过本工具快速查清 kubectl describe pod 与 kubectl logs --previous 的完整参数,准确拿到 Pod 退出前的最后一条日志和事件上下文。对比后发现是 ConfigMap 中数据库连接串末尾多了一个空格,导致应用初始化失败。从收到告警到定位根因,全程不到 3 分钟。
深夜排障,`kubectl get pods` 后对着几十个 YAML 字段愣神——这个资源到底支持哪些 `spec` 子命令?这个工具把 kubectl 全部命令和 Kubernetes 内置资源对象的字段结构,按层级摊开、可检索。输入一个资源类型或命令关键词,直接看到完整子命令列表、必要参数和字段路径。所有数据随页面加载,查询在本地浏览器完成,不发送任何请求到服务器。
凌晨两点,线上服务 Pod 反复 CrashLoopBackOff,开发在群里发来一段模糊的报错日志。运维通过本工具快速查清 kubectl describe pod 与 kubectl logs --previous 的完整参数,准确拿到 Pod 退出前的最后一条日志和事件上下文。对比后发现是 ConfigMap 中数据库连接串末尾多了一个空格,导致应用初始化失败。从收到告警到定位根因,全程不到 3 分钟。
公司进行多集群合并,需要把旧集群 staging 命名空间下的所有 Deployment 和 Service 迁移到新集群。手动写 YAML 容易遗漏 labels 或 selector 字段。运维用本工具查阅 kubectl get 的 -o yaml 输出格式,配合 --export 参数导出完整资源定义,再通过 kubectl apply -f 批量导入新集群。迁移 12 个服务只用了 15 分钟,且 0 遗漏。
新上线的微服务通过 ClusterIP 访问另一个服务一直超时,开发怀疑是 DNS 解析或网络策略问题。SRE 用本工具查到 kubectl run -it --rm --image=busybox --restart=Never -- nslookup <service-name> 的完整命令,启动一个临时 Pod 进入集群网络空间测试。结果发现新服务所在命名空间与目标 Service 不在同一个命名空间,补上 <service-name>.<namespace>.svc.cluster.local 全域名后连通。
灰度发布新版本后,监控发现 5xx 错误率从 0.1% 飙升到 8%。需要立即回滚到上一个稳定版本,但开发记不清上一个镜像版本号。运维用本工具查到 kubectl rollout history deployment/<name> 可以查看历史版本号,再通过 kubectl rollout undo deployment/<name> --to-revision=<N> 精确回滚到指定版本。整个回滚操作 10 秒完成,业务恢复后复盘发现是新增的缓存逻辑导致内存泄漏。
集群节点因磁盘压力触发了 Pod 驱逐,虽然节点已恢复,但留下了上百个 Evicted 状态的 Pod 残骸,导致 kubectl get pods 输出混乱,干扰日常巡检。运维用本工具查到 kubectl delete pods --field-selector=status.phase=Failed 的精准过滤语法,一条命令清理掉所有 Evicted Pod。清理后集群列表恢复整洁,后续巡检效率提升 60%。
| 输入 | 输出 | 说明 |
|---|---|---|
| get pods | NAME READY STATUS RESTARTS AGE nginx-6799fc88d8-5x7g2 1/1 Running 0 12d | 常规:最常用的 kubectl 命令,验证工具返回标准 pod 列表格式 |
| get nodes -o wide | NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION node-1 Ready <none> 45d v1.28.2 10.0.0.1 <none> Ubuntu 22.04 LTS 5.15.0-91-generic | 常规:带 -o wide 输出额外字段,验证工具支持常见输出选项 |
| get pods --all-namespaces | NAMESPACE NAME READY STATUS RESTARTS AGE kube-system coredns-5d78c9869d-6q9pz 1/1 Running 0 45d kube-system etcd-node-1 1/1 Running 0 45d default nginx-6799fc88d8-5x7g2 1/1 Running 0 12d | 边界:跨命名空间查询,验证工具正确处理 --all-namespaces 标志 |
| get pods --field-selector=status.phase=Running | NAME READY STATUS RESTARTS AGE nginx-6799fc88d8-5x7g2 1/1 Running 0 12d | 边界:字段选择器过滤,验证工具支持复杂查询语法 |
| get pods -w | NAME READY STATUS RESTARTS AGE nginx-6799fc88d8-5x7g2 1/1 Running 0 12d (持续输出新事件,按 Ctrl+C 退出) | 边界:watch 模式会阻塞,工具应提示用户该命令非一次性返回 |
| get pods nonexistent-pod | Error from server (NotFound): pods "nonexistent-pod" not found | 易错:查询不存在的资源,验证工具正确显示标准错误信息而非空结果 |
| get pods --output=json | { "apiVersion": "v1", "items": [ { "apiVersion": "v1", "kind": "Pod", "metadata": { "name": "nginx-6799fc88d8-5x7g2", "namespace": "default", ... }, ... } ], "kind": "List", "metadata": {} } | 易错:JSON 输出格式冗长,用户常误以为工具会截断;验证工具完整输出或明确提示 |
| describe pod nginx-6799fc88d8-5x7g2 | Name: nginx-6799fc88d8-5x7g2 Namespace: default Node: node-1/10.0.0.1 Start Time: Mon, 01 Jan 2024 00:00:00 +0000 Labels: app=nginx Annotations: <none> Status: Running IP: 10.1.0.5 Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 12d default-scheduler Successfully assigned default/nginx-6799fc88d8-5x7g2 to node-1 Normal Pulled 12d kubelet Container image "nginx:latest" already present on machine Normal Created 12d kubelet Created container nginx Normal Started 12d kubelet Started container nginx | 易错:describe 输出包含事件时间线,用户常混淆与 get 的区别;验证工具区分两种命令 |
1.资源类型缩写与全称混用导致命令不识别
kubectl get deploy -n my-namespacekubectl get deployments -n my-namespacekubectl 1.20+ 支持部分缩写(如 deploy→deployments),但某些旧版本或自定义资源缩写未注册时,缩写会报错。建议在脚本或跨环境场景使用全称。
2.忘记指定命名空间,操作了默认 default 空间
kubectl delete pod my-podkubectl delete pod my-pod -n productionkubectl 默认使用当前上下文命名空间(通常是 default),不指定 -n 会误删/误查其他空间的资源。生产环境应始终显式指定命名空间。
3.apply 时 YAML 缩进错误导致资源创建失败
apiVersion: v1
kind: Pod
metadata:
name: testapiVersion: v1
kind: Pod
metadata:
name: testYAML 对缩进敏感,字段名左对齐必须一致。metadata 应与 kind 同级,缩进空格数必须统一(通常 2 空格)。
4.get pods 输出中 STATUS 字段含义理解偏差
认为 CrashLoopBackOff 是 Pod 已停止CrashLoopBackOff 表示容器反复崩溃重启,kubectl describe pod 可看具体事件STATUS 显示 CrashLoopBackOff 说明 Pod 仍在运行但容器不断重启,不是终止状态。需查看 logs 或 describe 定位原因。
5.logs 命令未指定容器名,多容器 Pod 报错
kubectl logs my-podkubectl logs my-pod -c my-containerPod 内有多个容器时,kubectl logs 必须用 -c 指定容器名,否则返回错误。单容器 Pod 可省略。
6.exec 进入容器时忘记加 -it,终端无交互
kubectl exec my-pod -- /bin/shkubectl exec -it my-pod -- /bin/sh缺少 -i(stdin 保持打开)和 -t(分配伪终端)会导致无法输入命令,shell 立即退出。交互式调试必须加 -it。
7.port-forward 端口映射方向写反
kubectl port-forward my-pod 8080:80kubectl port-forward my-pod 8080:80语法是 `本地端口:容器端口`,但用户常误以为左边是容器端口。实际 8080 是本地监听,80 是容器端口。
8.describe 与 get -o yaml 输出混淆,误改只读字段
kubectl get pod my-pod -o yaml > pod.yaml; 编辑后直接 applykubectl get pod my-pod -o yaml --export > pod.yaml (或使用 kubectl edit)get -o yaml 输出包含 status、metadata.uid 等只读字段,直接 apply 会报冲突。应使用 kubectl edit 或 --export 过滤。
kubectl <command> [TYPE] [NAME] [flags]
command操作动词,如 get、describe、applyTYPE资源类型,如 pod、deployment、serviceNAME资源实例名称,可选flags可选参数,如 -n 指定命名空间查询 default 命名空间中名为 nginx-pod 的 Pod 详情:kubectl describe pod nginx-pod -n default。命令解析:describe(command)→ pod(TYPE)→ nginx-pod(NAME)→ -n default(flags)。输出包含 Pod 状态、事件、容器日志等字段。
可以。每个命令和资源对象定义都做了代码块格式化,点击右侧复制按钮就能直接粘贴到终端。但注意两点:一是如果你的 kubectl 版本低于 1.20,部分新命令(如 `kubectl debug`)可能报错;二是命令中的占位符(如 `{namespace}`)需要替换成实际值,复制后别忘了改。
kubectl 版本迭代中部分命令有过变更,比如 `kubectl run` 在旧版用来创建 Deployment,新版默认创建 Pod。本页面基于 Kubernetes 1.28 版本整理,如果你用的是更早版本(如 1.16),个别命令参数可能不兼容。建议先 `kubectl version` 确认服务端版本,再对照本页标注的版本说明使用。
页面顶部有搜索框,支持按命令名(如 `get`、`describe`)和资源对象(如 `Pod`、`Ingress`)模糊匹配。但如果你记的是类似“查看日志”这种中文描述,搜不到——因为索引是按 kubectl 实际命令建立的。建议直接用 `kubectl --help` 或本页的“按功能分类”模块定位。
支持的。`kubectl apply` 是声明式管理核心命令,本页在“资源操作”分类下有完整参数说明和 YAML 示例。如果你在页面上没找到,可能是浏览器搜索时没选中“展开所有分组”按钮——默认只展示了常用命令,需要点击分类标题展开才能看到全部条目。
大部分可以,但注意三点:一是路径分隔符要用反斜杠或双反斜杠(`C:\Users\`);二是引号要用双引号而非单引号(Windows 终端不认单引号);三是管道和重定向符号(`|`、`>`)在 cmd 中行为可能不同,建议用 PowerShell 或 WSL 获得更一致的体验。本页命令默认按 Linux/macOS 写法展示,Windows 用户需要自行调整。
最常见的原因是 namespace 不对。`kubectl get pods` 默认查当前上下文(context)设置的 namespace,如果你部署时指定了 `-n my-ns`,查询时需要加 `-n my-ns` 或改用 `--all-namespaces`。另一个可能是 Pod 刚创建还在 Pending 状态,等几秒再 `get` 就能看到。
完全离线可用。本工具是纯前端实现(FE),所有命令数据和资源对象定义都打包在页面本身,不依赖网络请求。首次加载后即使断网,刷新页面也能正常浏览和搜索。建议有网时打开一次,浏览器会自动缓存,之后离线打开即可。
本页侧重命令速查,每个资源对象只列出最常用的字段和典型值(如 `replicas: 3`),不提供 `kubectl explain Pod.spec.containers` 那种逐层展开的完整 schema。如果你需要看字段的校验规则或默认值,建议在终端直接 `kubectl explain --recursive`,本页作为快速回忆的辅助。
隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。