CentOS 上 Kubernetes 安装失败排查与修复
一 快速定位问题
sudo journalctl -u kubelet -fsudo kubeadm init --v=5kubectl get pods -A、kubectl get nodeskubectl describe pod <pod> -n kube-system、kubectl logs <pod> -n kube-systemsystemctl status kubelet二 环境预检与硬性要求
sudo setenforce 0;永久:修改 /etc/selinux/config 为 SELINUX=disabled)。sudo swapoff -a;永久:注释 /etc/fstab 中的 swap 行)。sudo yum install -y chrony && sudo systemctl enable --now chronyd/etc/docker/daemon.json 的 cgroup 驱动为 systemd,并重启 Docker:
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": { "max-size": "100m" },
"storage-driver": "overlay2"
}
sudo systemctl daemon-reload && sudo systemctl restart dockersudo systemctl stop firewalld && sudo systemctl disable firewalldsudo firewall-cmd --permanent --zone=public --add-port=6443/tcp && sudo firewall-cmd --reload--kubernetes-version 指定版本(如 v1.26.0)。三 常见故障与修复对照表
| 症状 | 可能原因 | 快速修复 |
|---|---|---|
| kubelet 反复重启或报 cgroup 错误 | cgroup 驱动不一致或旧内核 kmem 问题 | 将 Docker 的 cgroup 设为 systemd;升级内核至 4.x 或更高;必要时在 kubelet 参数中关闭相关特性并重启 kubelet |
| kubeadm init 卡住或失败 | 镜像拉取失败(国内网络) | 预先导入所需镜像,或使用国内镜像源/私有仓库 |
| 节点 NotReady | 未安装网络插件或内核转发未开启 | 部署 Flannel/Calico;开启 net.bridge.bridge-nf-call-iptables=1 |
| kubectl logs/exec 报 x509 证书未知 | APIServer 证书未包含节点 IP/域名 | 将控制面/节点 IP 加入证书 SAN,重新生成证书并替换,重启相关组件 |
| Pod 处于 CrashLoopBackOff/ImagePullBackOff | 镜像不存在或拉取策略不当 | 确认镜像名称与仓库可达,必要时使用国内镜像或私有仓库 |
| 端口被占用(如 6443/10250) | 已有进程占用或防火墙未放行 | 释放端口或放行端口;检查 systemctl status kubelet 与 ss -lntp |
| 节点无法加入集群 | token 过期或 kubelet 配置不一致 | 重新生成 join 命令;确保各节点 kubelet/kubeadm 版本一致 |
| 时间漂移导致证书校验失败 | 节点时间不同步 | 启用 chrony 同步时间并校时 |
以上问题及修复要点可结合日志与 kubectl describe pod 的输出进一步确认与处理。
四 标准化重装与初始化步骤
sudo kubeadm reset -f,清理 /etc/cni/net.d、/var/lib/kubelet、$HOME/.kube/configsudo systemctl enable --now docker kubeletsudo kubeadm init --pod-network-cidr=10.244.0.0/16mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.ymlkubectl get nodes、kubectl get pods -A五 需要你提供的关键信息(便于精确定位)
cat /etc/centos-releaseuname -rdocker version 或 crictl versionkubeadm version、kubelet --version、kubectl version --clientjournalctl -u kubelet -n 200 末尾 200 行、kubectl get pods -A 与 kubectl describe pod <异常Pod> -n kube-system 的输出。