在 CentOS 上运行 Kubernetes(k8s)出现卡顿,通常不是单一原因,而是多个层面叠加。下面按常见原因 → 排查方法 → 解决建议来系统说明。
一、系统资源层面(最常见)
1️⃣ CPU 资源不足
表现
- kubelet、apiserver 延迟高
- 节点 Load 高
- Pod 频繁调度或重启
排查
top
htop
kubectl top nodes
kubectl top pods -A
解决
- 限制 Pod 资源(requests/limits)
- 避免 master 节点跑业务 Pod
- 增加节点或扩容集群
2️⃣ 内存不足 / 频繁 OOM
表现
- 系统卡死
- kubelet 被杀
- Pod 处于 OOMKilled
排查
free -h
dmesg | grep -i oom
kubectl describe pod <pod>
解决
- 增加 swap(不推荐但可临时)
- 设置合理 memory limit
- 分离 etcd / apiserver 资源
3️⃣ 磁盘 IO 瓶颈(非常常见)
表现
- kubelet 无响应
- etcd 延迟极高
- 节点 NotReady
排查
iostat -x 1
df -h
journalctl -u kubelet
解决
- etcd 必须 SSD
- 分开:
- /var/lib/etcd
- /var/lib/docker 或 /var/lib/containerd
- 清理旧日志
二、CentOS 系统层面问题
4️⃣ 防火墙 / SELinux / 内核参数
表现
排查
getenforce
systemctl status firewalld
建议
setenforce 0
systemctl stop firewalld
systemctl disable firewalld
内核参数(常见优化):
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
5️⃣ CentOS 7 老内核问题
问题
建议
uname -a
升级到:
- CentOS 8 / Stream
- 或 内核 ≥ 4.18
三、Kubernetes 组件层面
6️⃣ etcd 性能问题(核心卡顿源)
表现
- apiserver 超时
- kubectl 命令慢
- 大量 Event
排查
etcdctl endpoint status --write-out=table
kubectl get events --sort-by=.lastTimestamp
解决
- 单独部署 etcd
- 使用 SSD
- 控制 object 数量(CRD / ConfigMap 不宜过多)
7️⃣ kube-proxy / CNI 网络问题
表现
排查
kubectl get pods -n kube-system
ip route
建议
- 使用 Calico / Cilium
- 避免 iptables 模式在大规模集群
四、容器运行时问题
8️⃣ Docker 太老 / containerd 配置差
现象
建议
五、快速定位 checklist(重点)
✅ 节点资源是否够
✅ etcd 是否在 SSD
✅ 是否有 OOM
✅ 内核版本
✅ 网络插件是否正常
✅ 是否 master 跑业务
六、如果你愿意,我可以更精确帮你
你可以补充:
- CentOS 版本(7 / 8 / Stream)
- k8s 版本
- 单节点 or 多节点
- 卡顿场景(kubectl?Pod?网络?)
- 是否 etcd / apiserver 报错
我可以直接帮你 定位是哪一层卡顿。