CentOS上Kubernetes常见问题的排查与修复
一、快速定位流程
- 查看节点与系统组件状态:使用kubectl get nodes、kubectl get pods -A确认是否有节点处于NotReady或Pod处于CrashLoopBackOff;对异常对象执行kubectl describe与kubectl logs获取事件与容器日志。
- 查看控制平面与节点服务日志:在master上检查kube-apiserver、kube-controller-manager、kube-scheduler的systemd日志(如:journalctl -u kube-apiserver -f);在所有节点检查kubelet、kube-proxy(如:systemctl status kubelet、journalctl -u kubelet -f)。
- 检查系统层面:使用dmesg、/var/log/messages或**/var/log/syslog排查内核与系统错误;用kubectl get events**观察集群事件。
- 资源与版本:用kubectl top nodes/pods确认是否资源不足;核对组件与插件版本兼容性。
- 必要时重置与恢复:无法恢复时先执行kubeadm reset清理后重建,或使用kubectl debug进行临时诊断。
二、初始化与加入集群失败
- 控制平面初始化超时(如“wait-control-plane”阶段):优先检查kubelet是否运行与配置是否正确(systemctl status kubelet、journalctl -xeu kubelet);若使用cri-dockerd,确认服务启动参数包含正确的**–pod-infra-container-image**(例如:registry.aliyuncs.com/google_containers/pause:3.9);用crictl --runtime-endpoint unix:///var/run/cri-dockerd.sock ps -a | grep kube定位异常容器并查看日志。
- 镜像拉取失败:先列出所需镜像(kubeadm config images list),再使用国内镜像仓库(如registry.aliyuncs.com/google_containers)拉取并重命名,或在kubeadm init时指定**–image-repository**。
- 节点加入时报“Found multiple CRI endpoints”:在kubeadm join命令中显式指定CRI套接字,例如**–cri-socket unix:///var/run/cri-dockerd.sock**。
- 重置与重试:初始化失败后执行kubeadm reset清理环境,再重新init。
三、网络连通性问题
- Pod与主机不通:确认Pod已分配Pod IP(kubectl get pods -o wide);检查宿主机与容器网络配置、CNI配置(/etc/cni/net.d/*.conf)、是否存在限制流量的NetworkPolicy、以及firewalld/iptables规则。
- 节点之间不通:检查Flannel/Calico等CNI是否正常运行(kubectl get pods -n kube-system -l app=flannel/calico);查看节点路由表(ip route)与网卡状态(ip link);节点间执行ping/traceroute定位链路问题;按需配置或临时关闭firewalld并放行相关端口(如6443、30000-32767等)。
- 应用访问被“拒绝连接”:核对应用监听端口与Service端口映射是否正确;检查NetworkPolicy是否阻断;确认firewall未拦截;必要时用临时allow-all策略验证是否为策略问题。
四、存储与持久化问题
- 持久卷挂载失败(如“MountVolume.SetUp failed”):核对PV/PVC状态与StorageClass配置是否匹配;检查NFS/Ceph等后端是否可用与权限正确;必要时升级内核或调整挂载选项。
- 快速核查命令:kubectl get pv,pvc,storageclass查看资源状态;对异常PVC执行**kubectl describe pvc **定位事件与原因。
五、系统环境与资源问题
- 基础环境:Kubernetes要求禁用Swap(swapoff -a并注释/etc/fstab对应行);按需关闭firewalld与SELinux或配置放行规则;设置主机名与**/etc/hosts**解析;配置内核参数:
- net.bridge.bridge-nf-call-ip6tables = 1
- net.bridge.bridge-nf-call-iptables = 1
- net.ipv4.ip_forward = 1
执行sysctl -p使配置生效。
- 容器运行时与kubelet:确保容器运行时(如Docker/containerd/cri-dockerd)已启动且与kubelet的cgroup驱动一致(常见为systemd);检查kubelet服务状态与日志。
- 资源与版本:用kubectl top观察节点与Pod资源使用,排查OOM或CPU节流;核对组件与插件版本兼容性;必要时更新并重启相关服务。