K8s 高频问题一站式排查清单
生产环境 Kubernetes 集群常见故障的快速诊断路径。10 个高频场景,每个都给出排查步骤、根因修复、风险提醒和回滚方案。 每个问题链接到对应的深度页面,这里做快速定位,详细分析去对应页面。
问题一:Pod Pending
诊断入口: kubectl describe pod → Events 段看最后几行
三大根因:
| 原因 | 排查命令 | 修复 |
|---|---|---|
| 资源不足 | kubectl top nodes → 检查 Allocatable |
扩容节点 / 降低资源请求 / 清理低优 Pod |
| 污点/容忍 | kubectl get node -o custom-columns=NAME:.metadata.name,TAINTS:.spec.taints |
添加 tolerations 或临时 kubectl taint node ... - |
| PVC 未就绪 | kubectl get pvc -n <ns> → kubectl describe pvc |
检查 StorageClass / PV 绑定 / 存储后端 |
⚠️ 风险提醒: 修改污点会影响其他 Pod 调度——确认节点属专用节点前别乱删污点。 🔙 回滚: 如果是改 YAML 解决的,直接
kubectl apply原配置;涉及污点则 taint 命令恢复。
📖 深度排查 → k8s-scheduling-strategy-guide | resource-rbac-scheduling-troubleshooting
问题二:Pod CrashLoopBackOff
诊断入口: 容器退出码 + kubectl logs --previous
排查步骤: 退出码 → 应用日志 → 启动命令 → 健康检查配置
常见退出码:
| 退出码 | 含义 | 方向 |
|---|---|---|
| 0 | 正常退出(也可能有问题) | 检查业务逻辑 |
| 1 | 通用错误 | 应用自身日志 |
| 137 (SIGKILL) | OOM 被杀死 | kubectl describe 看 OOMKilled |
| 139 (SIGSEGV) | 段错误 | 内存越界 / 依赖库问题 |
| 143 (SIGTERM) | 优雅终止超时 | 检查 preStop 和 terminationGracePeriodSeconds |
⚠️ 风险提醒:
kubectl logs --previous拿的是崩溃前的日志,是最关键的线索——别漏掉。 🔙 回滚: 如果是新版镜像导致的,快速kubectl set image deployment/<name> <container>=<old-tag>回退版本。
📖 深度排查 → pod-troubleshooting | k8s-probes-guide
问题三:Service 访问失败
诊断入口: 三步定位法——DNS 解析 / kube-proxy 转发 / Pod 监听
kubectl run test --image=busybox -it --rm -- sh
/ # nslookup <svc-name>.<namespace>.svc.cluster.local
/ # telnet <svc-name>.<namespace> 80
三个环节:
| 环节 | 排查点 | 工具 |
|---|---|---|
| DNS 解析 | CoreDNS Pod 状态、/etc/resolv.conf |
nslookup, dig, CoreDNS 日志 |
| kube-proxy 转发 | iptables/ipvs 规则、kube-proxy 日志 | iptables-save -t nat, ipvsadm -Ln |
| Pod 监听 | 容器内 netstat -tlnp、curl localhost:port |
kubectl exec, kubectl logs |
⚠️ 风险提醒:
endpointSlice或endpoints是排障关键——kubectl get endpoints <svc>看是否有 Ready 后端。 🔙 回滚: 如果是新 Service 配置导致的,检查 Annotation 和 Service Type。
📖 深度排查 → service-troubleshooting | k8s-service-access-troubleshooting
问题四:镜像拉取失败(ImagePullBackOff)
诊断入口: kubectl describe pod → Events 段看具体错误
五步排查:
| 步骤 | 命令 | 解决 |
|---|---|---|
| 确认拉取策略 | kubectl get pod ... -o yaml \| grep imagePullPolicy |
策略不当导致使用错误镜像 |
| 检查 Secret | kubectl get pod ... -o jsonpath='{.spec.imagePullSecrets}' |
私有仓缺少认证 |
| 节点上手动拉 | crictl pull <image> 或 ctr image pull |
测试节点能否拉取 |
| containerd 日志 | journalctl -u containerd --no-pager \| grep <image> |
看具体错误(超时/证书/权限) |
| 镜像仓库白名单 | 检查 Firewall / Security Group / Registry IP 限制 | 确认仓库可达 |
根因快速对照:
| 事件信息 | 根因 | 立即修复 |
|---|---|---|
manifest unknown |
镜像 tag 不存在 | kubectl set image deployment/<name> <container>=<correct-tag> |
authentication required / denied |
私有仓库未认证 | kubectl create secret docker-registry ... → 关联到 Deployment |
no such host / i/o timeout |
网络不通 | 检查节点 DNS / 安全组 / 代理配置 |
certificate signed by unknown authority |
证书不受信任 | 配置 insecure-registries 或导入 CA 证书 |
⚠️ 风险提醒:
imagePullPolicy: Always会让节点每次都拉取,私有仓库带宽不足时可能导致镜像拉取雪崩。建议稳定版本用IfNotPresent。 🔙 回滚:kubectl edit deployment <name>恢复旧镜像标签。
📖 深度排查 → pod-troubleshooting(ImagePullBackOff 章节) | docker-image-optimization
问题五:Node NotReady
诊断入口: kubectl get nodes → kubectl describe node <node-name>
四步排查:
| 步骤 | 命令 | 解决 |
|---|---|---|
| 确认状态 | kubectl get nodes |
NotReady 的原因可能在 Conditions 段 |
| kubelet 状态 | systemctl status kubelet / journalctl -u kubelet -f |
进程挂了就重启;看日志找具体原因 |
| 系统资源 | free -m / df -h / top |
磁盘满/OOM/hung_task |
| 证书/网络 | openssl x509 -in /var/lib/kubelet/pki/kubelet.crt |
证书过期 / API Server 不可达 |
⚠️ 风险提醒: Node NotReady 后,该节点上非 DaemonSet Pod 默认在
pod-eviction-timeout(默认 5 分钟)后驱逐到其他节点。别急着触发节点下线,先确认是不是短暂的网络抖动。 🔙 回滚: 如果是证书问题,更新证书后重启 kubelet;如果是资源耗尽,清理后不用操作会自动恢复 Ready。
📖 深度排查 → node-troubleshooting
问题六:存储卷挂载异常
诊断入口: kubectl get pvc -n <ns> → kubectl describe pvc <pvc-name>
故障链定位:
PVC Pending → 检查 StorageClass → 检查 PV → 检查 CSI 驱动 → 检查后端存储
常见根因:
| 表现 | 根因 | 排查 |
|---|---|---|
| PVC Pending | StorageClass 不存在或注解错误 | kubectl get sc |
| PV 无法绑定 | 容量/访问模式不匹配 | kubectl get pv 看 STATUS |
| Pod 启动后读写失败 | CSI 驱动异常或权限 | journalctl -u kubelet 看 mount 错误 |
| 挂载后无法写入 | 卷权限/fsgroup 设置 | 检查 securityContext.fsGroup |
⚠️ 风险提醒: 有状态应用的存储问题不适用简单的 Pod 重建——新 Pod 会挂载同名 PVC,如果 PVC 本身有问题则修复过程更复杂。 🔙 回滚: 如果是 PV/PVC 配置问题,先恢复原 StorageClass 和 PVC 定义,再重新创建 Pod。
📖 深度排查 → storage-troubleshooting | k8s-persistent-storage-guide | k8s-statefulset-guide
问题七:资源配额耗尽 / Pod 驱逐
诊断入口: kubectl get pod -n <ns> | grep Evicted
核心排查:
# 查看命名空间配额
kubectl get resourcequota -n <namespace>
# 查看 LimitRange
kubectl get limitrange -n <namespace>
# 查看被驱逐 Pod 的原因
kubectl get pod <evicted-pod> -n <ns> -o yaml | grep -A 5 "reason"
触发条件:
| 条件 | 触发行为 | 现象 |
|---|---|---|
| ResourceQuota 超限 | 新 Pod 创建失败 | exceeded quota |
| LimitRange 违规 | Pod 不可创建 | Invalid: <field>: forbids |
| 节点资源压力(eviction) | 现有 Pod 被终止 | The node was low on resource: memory |
⚠️ 风险提醒:
kubectl describe pod的 Status.Reason 字段区分是资源耗尽驱逐还是节点压力驱逐——处理方式完全不同。 🔙 回滚: 临时去掉 Pod 的资源限制(删除 limits 字段)可快速拉起,但治本要调整配额或优化应用。
📖 深度排查 → k8s-resource-limits-configuration | resource-rbac-scheduling-troubleshooting
问题八:etcd 集群故障
诊断入口: etcdctl endpoint health / systemctl status etcd
核心排查:
# 检查集群成员
etcdctl member list
# 检查端点健康
etcdctl endpoint health
# 检查端点状态(含 Raft 指标)
etcdctl endpoint status --write-out=table
# 检查告警(空间满会触发 alarm)
etcdctl alarm list
生产环境关键指标:
| 指标 | 正常 | 警告 |
|---|---|---|
| Raft leader | 存在 1 个 | 无 leader → 集群不可用 |
| DB 大小 | < 2GB | > 8GB → 需压缩碎片整理 |
| 磁盘 fsync 延迟 | < 10ms | > 100ms → IO 瓶颈 |
| 网络 RTT | < 10ms | 节点间延迟波动 → 脑裂风险 |
⚠️ 风险提醒: etcd 是有状态核心组件。etcd 恢复失败后不要直接替换数据目录——用
etcdctl snapshot restore从快照恢复。永远不要手工复制/替换 etcd 数据文件。 🔙 回滚: 定期etcdctl snapshot save做快照,故障时etcdctl snapshot restore恢复。
📖 深度排查 → k8s-production-incident-case-studies(etcd 故障案例) | k8s-troubleshooting-principles
问题九:DNS 解析异常
诊断入口: kubectl run test --image=busybox -it --rm -- nslookup <svc-name>
排查步骤:
| 步骤 | 命令 | 说明 |
|---|---|---|
| CoreDNS 状态 | kubectl get pod -n kube-system \| grep coredns |
Pod 是否 Running |
| CoreDNS 日志 | kubectl logs -n kube-system -l k8s-app=kube-dns |
看查询错误 |
| 解析配置 | kubectl exec <pod> -- cat /etc/resolv.conf |
search domains / nameserver 是否正确 |
| 直连测试 | telnet <cluster-ip> 53 |
绕过 DNS 直联 Service IP |
常见根因:
- CoreDNS Pod 未运行或正在重启 → 检查资源限制 / OOM
ndots:5导致额外的 DNS 查询 → 应用配置ndots:1优化- 自定义 DNS Policy 覆盖了集群 DNS → 检查 Pod
dnsPolicy字段 - 网络策略(NetworkPolicy)阻止了 DNS 流量 → 检查 UDP 53 端口规则
⚠️ 风险提醒: CoreDNS 的
resources.limits.memory不足会导致 OOM 重启,引发间歇性 DNS 超时——这是"服务一会好一会坏"的最常见原因。 🔙 回滚: 临时加一个dnsPolicy: ClusterFirstWithHostNet可以绕过部分 DNS 问题,但治本要修 CoreDNS。
📖 深度排查 → service-troubleshooting(DNS 章节) | k8s-service-access-troubleshooting
问题十:Pod 安全策略 / 权限不足
诊断入口: kubectl get pod <pod> -n <ns> -o yaml | grep -A 20 securityContext
三层安全控制:
| 层级 | 说明 | 常见问题 |
|---|---|---|
| Pod Security Standards | 命名空间级别:privileged / baseline / restricted | Pod 违反策略→无法创建 |
| SecurityContext | 容器级别 runAsUser / capabilities / allowPrivilegeEscalation | 文件无法写入 / 端口无法绑定 |
| 额外: PodSecurityPolicy(已废弃) / OPA/Gatekeeper | 第三方准入控制 | 创建被拒绝,看不到明确原因 |
定位步骤:
# 检查 Pod 安全上下文
kubectl get pod <pod> -n <ns> -o yaml | grep -A 15 securityContext
# 检查命名空间安全标签
kubectl get ns <ns> -o yaml | grep pod-security
# 检查是否有 Seccomp / AppArmor 配置
kubectl get pod <pod> -n <ns> -o yaml | grep -E "seccomp|apparmor"
# 复现问题:exec 进容器测试写入/执行权限
kubectl exec -it <pod> -n <ns> -- touch /tmp/test
kubectl exec -it <pod> -n <ns> -- id
⚠️ 风险提醒:
readOnlyRootFilesystem: true并且没有挂载 emptyDir 卷时,程序任何磁盘写入都会失败——第一次部署时极易忽略。 🔙 回滚: 如果是 securityContext 配置问题,先注释掉限制字段重启 Pod 恢复服务,再逐一收紧权限。
📖 深度排查 → resource-rbac-scheduling-troubleshooting | k8s-production-incident-case-studies
关联页面
| 页面 | 关联点 |
|---|---|
| k8s-troubleshooting-principles | K8s 生产排障基本原则与快速定位五步法(本文的方法论基础) |
| pod-troubleshooting | Pod 排障完整手册:所有 Pod 状态问题深度解析 |
| node-troubleshooting | Node 排障:NotReady 九步排查 |
| service-troubleshooting | Service 与网络排障全指南 |
| container-networking-troubleshooting | 容器网络排障 6 层模型(快速识别网络故障层级) |
| storage-troubleshooting | 存储排障:PVC / PV / CSI 完整排查 |
| k8s-production-incident-case-studies | K8s 生产 10 大故障复盘(etcd/证书/节点/PDB/配额/HPA/ConfigMap) |
| k8s-pod-pending-troubleshooting-guide | Pod Pending 排障指南 — 7 个排查方向(资源不足/污点/亲和性/存储/配额/选择器/端 |
| docker-image-optimization | Docker 镜像优化与部署(镜像拉取策略的配合参考) |