环境说明:CentOS 7.9,K8s‑1.18.20;规避 Docker24 + 移除 dockershim 的 CRI 报错问题;使用稳定版本
docker‑20.10.24(自带 dockershim,原生兼容 k8s1.18)。 故障背景:Docker26 版本过高,dockershim 被移除,kubeadm 报connection closed before server preface received;包冲突、残留导致安装失败。
前置:彻底清理所有 docker /containerd 残留
bash
systemctl stop docker 2>/dev/null
systemctl disable docker 2>/dev/null
#强制卸载,跳过预卸载脚本
rpm -e --nodeps --noscripts docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin 2>/dev/null
#删除旧版冲突插件包
rpm -e --nodeps docker-buildx-plugin
rpm -e --nodeps docker-ce-rootless-extras-26.1.4-1.el7.x86_64
rpm -e --nodeps docker-compose-plugin-2.27.1-1.el7.x86_64
#清理目录残留
rm -rf /var/lib/docker
rm -rf /var/lib/containerd
rm -rf /etc/docker
rm -rf /etc/containerd
rm -rf /usr/lib/systemd/system/containerd.service
rm -f /var/run/docker.sock
systemctl daemon-reload
校验包是否清理干净,输出为空才算成功:
bash
rpm -qa | grep -E "docker|containerd"
步骤 1:安装稳定版本 docker‑20.10.24 + containerd.io‑1.4.13
不要安装最新 docker 版本,高版本移除 dockershim,K8s1.18 无法对接 CRI 接口。
bash
yum install -y yum-utils
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#指定版本安装
yum install -y docker-ce-20.10.24 docker-ce-cli-20.10.24 containerd.io-1.4.13-3.1.el7
安装后验证:
bash
docker --version
#预期输出:Docker version 20.10.24
which containerd
#预期输出:/usr/bin/containerd
ls -l /usr/lib/systemd/system/containerd.service
步骤 2:配置 Docker 镜像加速器并启动服务
bash
mkdir -p /etc/docker
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
EOF
systemctl enable --now docker
systemctl status docker
校验 docker socket:
bash
ls -l /var/run/docker.sock
✅ docker‑20.10.24 内置 dockershim,原生 CRI 接口,k8s1.18 直接对接
/var/run/docker.sock,无需独立部署 containerd。
步骤 3:kubeadm‑config.yaml 配置文件(k8s1.18 专用 v1beta2)
⚠️注意:k8s1.18 仅支持 apiVersion:
kubeadm.k8s.io/v1beta2,禁止使用 v1beta3;不要写kubeadmVersion字段。
yaml
apiVersion: kubeadm.k8s.io/v1beta2
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.1.10 # 修改为你的master静态IP
bindPort: 6443
nodeRegistration:
criSocket: /var/run/docker.sock
name: k8s-master01
---
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v1.18.20
imageRepository: registry.aliyuncs.com/google_containers
controlPlaneEndpoint: ""
networking:
dnsDomain: cluster.local
serviceSubnet: 10.96.0.0/12
podSubnet: 10.244.0.0/16
步骤 4:配置 /etc/hosts,修复主机名解析警告
bash
vi /etc/hosts
写入(IP 替换为你本机真实静态 IP):
plaintext
192.168.1.10 k8s-master01
测试解析是否正常:
bash
ping k8s-master01
步骤 5:清理 kubeadm 旧环境残留(初始化前必做)
bash
kubeadm reset -f
rm -rf $HOME/.kube
rm -rf /etc/cni/net.d/*
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
ipvsadm --clear
步骤 6:执行 kubeadm 初始化
bash
kubeadm init --config=kubeadm-config.yaml
docker‑20.10.24 属于 k8s1.18 官方校验版本,不再报 SystemVerification 警告,无需加忽略参数。
步骤 7:初始化成功后执行后续操作
bash
#配置管理员kubeconfig
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
#部署适配k8s1.18的calico v3.21,高版本calico不兼容1.18
kubectl apply -f https://docs.projectcalico.org/v3.21/manifests/calico.yaml
#查看节点状态
kubectl get nodes
验证检查命令(安装完成后执行)
bash
rpm -qa | grep -E "docker-ce|containerd.io"
docker --version
ls -l /var/run/docker.sock