温馨提示×

centos上k8s安装失败怎么解决

小樊
36
2025-12-27 13:31:39
栏目: 智能运维

CentOS 上 Kubernetes 安装失败排查与修复

一 快速定位问题

  • 查看 kubelet 实时日志,优先关注报错关键词(如 cgroup、swap、镜像拉取、证书、端口占用):
    • 命令:sudo journalctl -u kubelet -f
  • 若 kubeadm 初始化失败,开启高详细日志重跑,便于定位阶段问题:
    • 命令:sudo kubeadm init --v=5
  • 集群部分组件已起但异常,检查系统组件与节点状态:
    • 命令:kubectl get pods -Akubectl get nodes
  • 查看具体 Pod 的事件与日志(定位 CrashLoopBackOff、ImagePullBackOff 等):
    • 命令:kubectl describe pod <pod> -n kube-systemkubectl logs <pod> -n kube-system
  • 若节点未就绪或组件未启动,检查 kubelet 服务状态:
    • 命令:systemctl status kubelet

二 环境预检与硬性要求

  • 操作系统与资源:
    • 推荐 CentOS 7.6+ 或 CentOS 8.x;至少 2 核 CPU、4GB RAM、50GB 磁盘(更稳妥的起步资源)。
  • 基础环境:
    • 关闭 SELinux(临时:sudo setenforce 0;永久:修改 /etc/selinux/configSELINUX=disabled)。
    • 关闭 swap(临时:sudo swapoff -a;永久:注释 /etc/fstab 中的 swap 行)。
    • 时间同步(推荐 chrony):sudo yum install -y chrony && sudo systemctl enable --now chronyd
  • 容器运行时与 cgroup 驱动:
    • 使用 Docker 时,配置 /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 docker
  • 防火墙与端口:
    • 建议测试环境先关闭防火墙:sudo systemctl stop firewalld && sudo systemctl disable firewalld
    • 或按需放行端口(示例):sudo firewall-cmd --permanent --zone=public --add-port=6443/tcp && sudo firewall-cmd --reload
  • 版本匹配与一致性:
    • 组件版本需一致(如 kubelet/kubeadm/kubectl 同版本);必要时用 --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 kubeletss -lntp
节点无法加入集群 token 过期或 kubelet 配置不一致 重新生成 join 命令;确保各节点 kubelet/kubeadm 版本一致
时间漂移导致证书校验失败 节点时间不同步 启用 chrony 同步时间并校时

以上问题及修复要点可结合日志与 kubectl describe pod 的输出进一步确认与处理。

四 标准化重装与初始化步骤

  • 重置环境(清理旧集群与配置):
    • 命令:sudo kubeadm reset -f,清理 /etc/cni/net.d/var/lib/kubelet$HOME/.kube/config
  • 启动必备服务:
    • 命令:sudo systemctl enable --now docker kubelet
  • 初始化控制面(按需设置 Pod CIDR,示例为 Flannel 的 10.244.0.0/16):
    • 命令:sudo kubeadm init --pod-network-cidr=10.244.0.0/16
  • 配置 kubectl:
    • 命令:
      mkdir -p $HOME/.kube
      sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
      sudo chown $(id -u):$(id -g) $HOME/.kube/config
      
  • 安装网络插件(以 Flannel 为例):
    • 命令:kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
  • 验证:
    • 命令:kubectl get nodeskubectl get pods -A

五 需要你提供的关键信息(便于精确定位)

  • 操作系统版本:cat /etc/centos-release
  • 内核版本:uname -r
  • 容器运行时与版本:docker versioncrictl version
  • kubelet/kubeadm/kubectl 版本:kubeadm versionkubelet --versionkubectl version --client
  • 当前阶段与报错:执行到的命令、完整错误输出、journalctl -u kubelet -n 200 末尾 200 行、kubectl get pods -Akubectl describe pod <异常Pod> -n kube-system 的输出。

0