Kubernetes 的日常运维、排障与抢救是一项系统性的工作。以下从 常用命令、日志排查思路、故障抢救、常见问题及注意事项、快速定位与解决 五个方面进行总结

这是一份 Kubernetes 日常运维的实用手册。涵盖了核心命令、故障排查思路,以及那些书本上不常写、却让你深夜加班的“坑”。希望可以给到你一个参考和方向。

必知必会的 kubectl 命令

kubectl 是 Kubernetes 的指令中枢。高效地使用它,是运维 K8s 的第一步。为了提升效率,建议将 kubectl 设置为别名 k,并安装 kubectl 的自动补全插件。

资源查看与定位

场景命令说明
查看节点状态kubectl get nodes
kubectl get nodes -o wide
查看所有节点状态,-o wide 显示详细信息。
查看资源 (通用)kubectl get pods
kubectl get deployments
kubectl get services -n kube-system
查看Pod、Deployment、Service等资源,支持指定命名空间 -n,或使用 -A 查看所有命名空间。
描述资源详情kubectl describe pod my-pod展示Pod的完整信息,是排查 Pod 问题的首选命令,重点关注Events字段。
监控资源变化kubectl get pods -w-w 参数可实时监控资源状态变化。
查看资源清单

kubectl get pod my-pod -o yaml

kubectl describe node 

导出资源的完整YAML定义,便于备份或深入分析。

查看节点资源压力、Pod分布、条件

资源操作与管理

场景命令说明
创建/更新资源kubectl apply -f app.yaml可创建或更新资源。
编辑运行中的资源kubectl edit deployment <name>直接编辑并实时更新运行中的资源配置。
删除资源kubectl delete -f app.yaml
kubectl delete pod <node>
通过文件或资源名称删除。
扩缩容kubectl scale deployment <name> --replicas=5调整Deployment的副本数量。

重启 Deployment


kubectl rollout restart deployment <name>

kubectl cordon <node>

kubectl uncordon <node>

滚动重启Pod,常用于应用无感知更新配置。

标记节点不可调度

恢复调度

Pod 内部交互与调试

场景命令说明
执行命令kubectl exec my-pod -- ls /
kubectl exec -it my-pod -- /bin/sh
在容器内执行命令,-it 参数可开启一个交互式 Shell。
查看日志kubectl logs my-pod
kubectl logs -f my-pod -c sidecar
查看Pod日志,-f 实时追踪,多容器时用 -c 指定。
查看崩溃日志kubectl logs my-pod --previous关键命令!可查看因重启而丢失的上一个容器的日志,用于分析 CrashLoopBackOff
端口转发kubectl port-forward pod/my-pod 8080:80将本地端口映射到Pod端口,绕过Service,直达Pod内部调试。

集群信息与资源统计

场景命令说明
查看集群信息kubectl cluster-info查看集群的控制平面和 CoreDNS 的运行地址。
查看资源使用kubectl top nodes
kubectl top pods
查看节点和Pod的实时CPU和内存使用情况,需要安装 metrics-server。
查看API资源kubectl api-resources列出所有支持的API资源类型,便于查找可用资源。
查看集群事件kubectl get events --sort-by='.lastTimestamp'列出集群事件,并按时间排序,是排查全局问题的利器。

image.png

故障排查全链路指南

日常故障排查可以遵循一条清晰的路径:Pod → 容器 → 应用 → Service → Ingress → 存储 → Node → 网络。

第一步:定位问题范围

列出所有Pod,找出非“Running”状态的Pod:

kubectl get pods -A | grep -v Running

查看Pod详细信息和事件:

kubectl describe pod <pod-name> -n <namespace>

查看Pod的日志:

# 查看当前日志
kubectl logs <pod-name> -n <namespace>
# 如果Pod在反复重启,务必查看上一个容器的日志
kubectl logs <pod-name> -n <namespace> --previous

进入Pod内部排查:

kubectl exec -it <pod-name> -n <namespace> -- /bin/sh

第二步:检查节点健康状况

如果Pod无法调度或莫名失败,往往是节点本身出了问题。可以使用以下命令检查:

# 检查节点状态
kubectl get nodes
# 查看节点的详细情况,重点关注 'Conditions' 和 'Events'
kubectl describe node <node-name>

节点常见的NotReady状态及其原因如下:

状态可能的原因排查方法
Ready节点健康,可以调度Pod。正常状态。
NotReadykubelet 进程挂掉、容器运行时故障、网络插件崩溃、磁盘空间不足、内核死锁。检查 kubelet 日志:journalctl -u kubelet -f

查看磁盘空间:df -h
DiskPressure节点磁盘空间不足(通常<10%%)。清理无用镜像和容器:docker system prune -a 或 crictl rmi --prune
MemoryPressure节点内存不足,kubelet 触发内存压力驱逐。使用 kubectl top nodes 检查内存使用,排查异常 Pod。
PIDPressure节点上的进程ID (PID) 耗尽。检查系统最大 PID 限制:sysctl kernel.pid_max

第三步:排查资源调度异常(Pod Pending)

当Pod状态为 Pending 时,说明调度器无法将其分配到任何节点。排查时可以重点关注以下几点:

集群资源不足:describe 命令通常会显示类似 0/3 nodes are available: 1 Insufficient cpu, 2 Insufficient memory 的错误,说明节点资源不足。

节点存在污点 (Taint):如果节点有污点,而Pod没有对应的容忍 (Toleration),调度器会拒绝调度。

持久卷 (PVC) 未绑定:如果Pod需要挂载存储,但PVC没有成功绑定到一个PV,Pod将无法调度。检查命令为 kubectl get pvc。

CPU/内存请求 (Request) 设置不当:Pod设置的CPU或内存请求超过了集群中任何节点的剩余资源。

第四步:排查服务无法访问(服务/网络视角)

这是应用部署好后最常见的问题,可以按以下顺序排查:

确认Pod内部的“健康”状态:

# 端口转发到本地,若能访问,则应用本身无问题
kubectl port-forward pod/<pod-name> 8080:80

检查Service是否正确关联Pod:

kubectl describe service <service-name>

进入Pod内部,测试DNS解析和Service连通性:

# 进入任意一个Pod
kubectl exec -it <any-pod> -- /bin/sh
# 尝试解析Service
nslookup <service-name>
# 测试Service能否连通
curl <service-name>.<namespace>.svc.cluster.local

检查Ingress配置:

kubectl describe ingress <ingress-name>

检查网络插件状态:

kubectl get pods -n kube-system | grep -E "calico|flannel|weave"

第五步:救火三板斧

扩容:kubectl scale deployment <deploy-name> --replicas=5

重启应用:kubectl rollout restart deployment <deploy-name>

强制删除“僵尸”Pod:kubectl delete pod <pod-name> -n <namespace> --force --grace-period=0

日常运维注意事项

避免踩坑的8个经验

镜像标签要具体,别用 latest:在生产环境使用 latest 标签就像在未知海域航行,无法确定哪个版本正在运行,也无法进行可靠的版本回滚。请始终使用明确的镜像版本号。

给所有Pod设置资源配额 (Requests & Limits):如果不设置,某个“坏邻居”Pod可能会耗尽所有节点资源,导致其他Pod“饿死”。可以同时使用 ResourceQuota 限制Namespace总用量和 LimitRange 设置每个Pod的默认值,实现双重保障。

定期备份etcd:etcd 是K8s集群的数据库,一旦损坏,集群将无法恢复。养成使用 etcdctl snapshot save 定期备份的好习惯。

安全访问,禁用 Root 用户:在容器中,应用应使用非 root 用户运行,这是最小权限原则的体现,能有效降低安全风险。

正确配置健康检查 (Probe):利用就绪探针 (Readiness) 告诉Service何时可以发送流量,利用存活探针 (Liveness) 让K8s自动重启“假死”的应用。不要将探针做得太重(如连接数据库),以免引发连锁反应。

小心 conntrack 表耗尽:在高并发场景下,节点连接跟踪表可能会被填满,导致服务间歇性无法访问。可以从节点层优化 conntrack 设置或使用 externalTrafficPolicy: Local 来规避。

妥善处理 Pod 优雅退出:Pod 收到 SIGTERM 信号后开始关闭流程。如果应用不处理该信号而直接退出,可能导致请求中断。

日志别只靠 kubectl logs:在生产环境中,应考虑部署集中式日志系统(如 EFK/ELK/Loki),避免因容器重启导致日志丢失,并方便统一检索和分析。

快速诊断的检查清单

检查项检查命令 (在Master节点执行)期望结果
节点健康状况kubectl get nodes所有节点状态为 Ready
核心组件状态kubectl get pods -n kube-system关键Pod (如 corednskube-proxycalico-node) 状态为 Running
Pod 健康状况kubectl get pods -A理想状态是所有Pod Running,无频繁重启。
kubelet 服务状态(在问题节点执行) systemctl status kubelet服务处于 active (running) 状态
容器运行时状态(在问题节点执行) systemctl status containerd服务处于 active (running) 状态
API Server 连通性kubectl cluster-info能正常输出 Master 和 CoreDNS 的地址信息。
DNS 解析kubectl exec -it deploy/debug-tool -- nslookup kubernetes.default能正确解析kubernetes.default.svc.cluster.local
控制平面证书kubeadm certs check-expiration检查证书是否即将过期。
Pod 资源使用kubectl top pods -A确认各Pod的CPU和内存使用是否正常。
节点资源使用kubectl top nodes确认各节点的CPU和内存使用是否正常。

这份手册涵盖了K8s运维的核心骨架。不过实践出真知,



本文最后更新时间 2026-06-04
文章链接地址:
https://yrajsh.cn/index.php/archives/140/
本站文章除注明[转载|引用|原文]出处外,均为本站原生内容,转载前请注明出处

文章附件
  • 暂无附件
希望可以帮助到你

留言