K8s 1.18 单节点集群完整搭建排错全过程日志(2026-08-09~10)

一、环境信息

  • 操作系统:CentOS Linux 7 (Core)
  • Docker 版本:20.10.24(官方未验证兼容版本,为后续报错埋下伏笔)
  • Kubernetes 版本:v1.18.20
  • 节点 IP:192.168.1.20
  • 部署模式:单 Master 节点(允许 Master 调度业务 Pod)

二、最初问题起因

最开始尝试拉取 calico 镜像搭建网络插件,出现 docker.io 超时:

Plain Text
Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection

问题根源:国内无法正常访问 docker.io、calico 镜像源不稳定、阿里云旧 calico 镜像源已下线。

决策:放弃 calico,改用 flannel 网络插件,彻底规避镜像墙问题。

三、第一次集群初始化报错(端口残留、旧集群未清理干净)

首次执行 kubeadm init 报错:6443、2379、10257、10259 全部端口占用、etcd 目录残留、静态清单文件残留。

原因:kubeadm reset 默认清理不彻底,不会清空 etcd、iptables、cni 目录、k8s 残留容器。

执行完整强制清理命令:

Plain Text
systemctl stop kubelet
systemctl disable kubelet
rm -rf /etc/kubernetes/manifests/*
docker rm -f $(docker ps -a | grep -E 'k8s_|etcd' | awk '{print $1}') 2>/dev/null
rm -rf /var/lib/etcd
rm -rf /etc/cni/net.d/*
rm -rf $HOME/.kube
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
ipvsadm --clear 2>/dev/null
kubeadm reset -f

四、第二次 kubeadm init 初始化成功

使用阿里云官方镜像源、指定本机 IP、指定 pod 网段,初始化成功:

Plain Text
kubeadm init --apiserver-advertise-address=192.168.1.20 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.18.20 --pod-network-cidr=10.244.0.0/16

初始化成功后配置 kubeconfig、解除 master 污点:

Plain Text
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
kubectl taint nodes --all node-role.kubernetes.io/master-

五、第一波核心故障:节点 NotReady、coredns 持续 Pending

现象

  • master 节点状态:NotReady
  • etcd、apiserver、controller、scheduler、kube-proxy 全部正常 Running
  • coredns 两个 Pod 一直 Pending
  • flannel Pod 看似 Running,但网络不生效

关键报错(kubelet 日志)

Plain Text
failed to find plugin "flannel" in path [/opt/cni/bin]
Unable to update cni config: no valid networks found in /etc/cni/net.d
runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized

终极根因(全网最隐蔽坑)

/etc/cni/net.d/10-flannel.conflist 配置文件存在,但是 宿主机 /opt/cni/bin 缺少 flannel 二进制插件。

flannel 的 install-cni 初始化容器挂载异常、复制失败,导致:

有配置、无程序 → kubelet 识别配置但是无法执行插件 → 网络永远未就绪 → 节点 NotReady → coredns 无法调度。

六、手动根治修复过程(核心解决步骤)

1. 手动补齐 flannel CNI 二进制插件

Plain Text
cd /opt/cni/bin
wget https://mirror.ghproxy.com/https://github.com/flannel-io/cni-plugin/releases/download/v1.5.1/flannel
chmod +x flannel

2. 彻底废弃旧 kube-system 命名空间 flannel

旧版本 flannel 挂载有问题,替换为官方最新版独立命名空间 flannel。

Plain Text
kubectl delete daemonset kube-flannel-ds -n kube-system
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

3. 解决 ghcr.io 镜像拉取慢问题

新版 flannel 使用 ghcr.io 镜像,国内卡顿,耐心等待镜像拉取完成,最终全部容器启动成功。

4. 重启 kubelet 重新加载 CNI 网络

Plain Text
systemctl restart kubelet

七、最终集群全部就绪状态

节点状态

Plain Text
master   Ready    master   38m   v1.18.0

全部 Pod 状态(全部 Running)

Plain Text
coredns-7ff77c879f-db66s         1/1     Running
coredns-7ff77c879f-zc6xf         1/1     Running
etcd-master                      1/1     Running
kube-apiserver-master            1/1     Running
kube-controller-manager-master   1/1     Running
kube-flannel-ds-4bm99            1/1     Running
kube-proxy-7gltm                 1/1     Running
kube-scheduler-master            1/1     Running

八、收尾清理(消除双 flannel 冲突)

清理 kube-system 残留旧 flannel,避免双网络冲突:

Plain Text
kubectl delete daemonset kube-flannel-ds -n kube-system

九、本次排错核心总结(永久存档)

  1. kubeadm reset 清理不彻底,生产重建必须手动清端口、iptables、etcd、cni、残留容器
  1. flannel 最经典坑:有 CNI 配置、无二进制插件,肉眼极难排查,只能看 kubelet 日志
  1. Docker20.10 高于 k8s1.18 官方验证版本,会有隐性兼容问题
  1. ghcr.io、docker.io 国内极慢,自建集群必须换国内镜像源
  1. 节点 NotReady 90% 概率都是 CNI 网络层问题,而非控制平面问题

十、最终集群能力验证

控制平面健康、网络插件就绪、DNS 服务就绪、节点就绪,K8s v1.18 单节点集群 100% 可用,可正常调度所有业务 Pod。

更多推荐