一、环境说明(已明确预装组件及依赖关系)
二、核心概念:Docker、cri-dockerd 与 K8s 的关系(为什么需要 cri-dockerd 0.3.19)
1. 关键背景:K8s 与 Docker 的 “适配断层”
K8s 要管理容器,需要通过 容器运行时接口(CRI) 与容器运行时(如 Docker、containerd)通信。但在 K8s 1.24 及以后版本 中,官方移除了内置的 dockershim
(之前用于连接 K8s 与 Docker 的组件),导致 K8s 无法直接识别 Docker。
而 Docker 本身并不原生支持 CRI 接口,因此需要一个 “中间件” 来桥接 —— 这就是 cri-dockerd 的核心作用。
2. 为什么选择 cri-dockerd 0.3.19?
版本兼容性:cri-dockerd 0.3.19 适配 K8s 1.28 版本(用户目标版本),同时兼容 Ubuntu 24.04 系统及已预装的 Docker 版本,避免新版本适配问题;
deb 包可用性:用户已获取
cri-dockerd_0.3.19.3-0.ubuntu-bionic_amd64.deb
包,直接安装无需源码编译,简化流程;稳定性验证:0.3.19 是经过实践验证的稳定版本,无明显已知 bug,适合生产测试环境使用。
3. 三者工作流程
plaintext
K8s(kubelet) → 调用 CRI 接口 → cri-dockerd(转换接口) → Docker Engine(实际创建/管理容器)
三、全流程操作步骤(基于已装 Docker 的前提)
第一步:前置准备与环境验证
1. 验证已装 Docker 状态(核心前提)
bash
# 检查 Docker 是否正常运行
sudo systemctl status docker
正常结果:输出
active (running)
,绿色字体标注运行状态,无红色错误日志;异常处理:若 Docker 未启动,执行
sudo systemctl start docker && sudo systemctl enable docker
启动并设置开机自启。
2. 安装基础工具(编译 / 依赖支持)
bash
sudo apt update && sudo apt install -y git build-essential
正常结果:无
Error
提示,工具安装完成(已安装则提示already the newest version
);常见错误:若提示 “GPG 签名验证失败”,执行:
bash
# 替换 XXXXXXXX 为错误中的公钥编号(如 3B4FE6ACC0B21F32) sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com XXXXXXXX sudo apt clean && sudo apt update
第二步:安装 cri-dockerd 0.3.19(桥接 Docker 与 K8s)
1. 确认 deb 包存在
bash
# 检查当前目录是否有目标 deb 包
ls | grep cri-dockerd_0.3.19.3-0.ubuntu-bionic_amd64.deb
正常结果:输出
cri-dockerd_0.3.19.3-0.ubuntu-bionic_amd64.deb
,确认文件存在。
2. 安装 cri-dockerd 并修复依赖
bash
# 安装 deb 包(Ubuntu 24.04 可能需补充旧版本兼容依赖)
sudo dpkg -i cri-dockerd_0.3.19.3-0.ubuntu-bionic_amd64.deb
# 自动修复依赖缺失(关键步骤,避免安装失败)
sudo apt -f install -y
正常结果:输出
Setting up cri-dockerd (0.3.19.3-0.ubuntu-bionic)
,无dpkg: error
提示。
3. 启动并验证 cri-dockerd 服务
bash
# 重载服务配置
sudo systemctl daemon-reload
# 启动 cri-dockerd(依赖 Docker 已运行)
sudo systemctl start cri-docker
# 设置开机自启
sudo systemctl enable cri-docker
# 验证状态
sudo systemctl status cri-docker
正常结果:
status
显示active (running)
,日志无 “无法连接 Docker” 的错误。
常见错误与修正
错误 1:cri-dockerd 启动失败,提示 “cannot connect to Docker daemon”
现象:status
显示failed
,日志含Cannot connect to the Docker daemon at unix:///var/run/docker.sock
;
原因:Docker 未启动或未正常运行;
修正:bash
sudo systemctl restart docker sudo systemctl restart cri-docker
结果:cri-dockerd 成功启动,显示
active (running)
。错误 2:deb 包安装提示 “架构不匹配”
现象:dpkg: error: package architecture (amd64) does not match system (arm64)
;
原因:deb 包是 amd64 架构,与机器 arm64 架构不兼容;
修正:执行dpkg --print-architecture
确认机器架构,下载对应架构的 cri-dockerd 0.3.19 deb 包后重新安装。
第三步:安装 Kubernetes 1.28 核心组件
1. 配置 K8s 软件源(阿里云源,避免官方源访问问题)
bash
# 下载 K8s 官方密钥
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
# 添加 K8s 1.28 版本源(适配 Ubuntu 24.04)
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
正常结果:无报错,
/etc/apt/sources.list.d/kubernetes.list
文件创建成功。
2. 安装并锁定 1.28 版本组件
bash
# 更新源并安装指定版本(确保三者版本一致)
sudo apt update && sudo apt install -y kubeadm=1.28.15-00 kubelet=1.28.15-00 kubectl=1.28.15-00
# 锁定版本,防止系统自动更新导致版本不兼容
sudo apt-mark hold kubeadm kubelet kubectl
正常结果:组件安装完成,执行
apt-mark showhold
可看到 3 个组件已被锁定。
3. 配置 kubelet 指向 cri-dockerd(关键:让 K8s 找到容器运行时)
bash
# 写入 kubelet 额外参数(指定 cri-dockerd 端点)
sudo tee /etc/default/kubelet <<-'EOF'
KUBELET_EXTRA_ARGS="--container-runtime=remote --container-runtime-endpoint=unix:///var/run/cri-dockerd.sock"
EOF
# 重启 kubelet 使配置生效
sudo systemctl daemon-reload
sudo systemctl restart kubelet
正常结果:
systemctl restart kubelet
无报错,sudo systemctl status kubelet
显示active (running)
。
常见错误与修正
错误 3:安装 K8s 组件提示 “无法定位包”
现象:E: Unable to locate package kubeadm=1.28.15-00
;
原因:源未同步或配置错误;
修正:bash
sudo rm /etc/apt/sources.list.d/kubernetes.list echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list sudo apt update --fix-missing
结果:重新安装组件,正常下载完成。
第四步:初始化 Master 节点(单节点核心步骤)
1. 清理历史残留(若之前初始化失败)
bash
# 强制重置 K8s 环境
sudo kubeadm reset -f
# 删除残留配置与数据(避免“文件已存在/端口占用”错误)
sudo rm -rf /etc/kubernetes/manifests/* /etc/kubernetes/pki/* /etc/cni/net.d /var/lib/etcd /var/lib/kubelet $HOME/.kube
# 释放 K8s 核心端口(10250:kubelet 端口;6443:apiserver 端口)
sudo kill -9 $(sudo lsof -i :10250 | grep LISTEN | awk '{print $2}') 2>/dev/null
sudo kill -9 $(sudo lsof -i :6443 | grep LISTEN | awk '{print $2}') 2>/dev/null
正常结果:无报错,残留文件与占用端口清理完成。
2. 初始化 Master 节点
bash
sudo kubeadm init \
--cri-socket unix:///var/run/cri-dockerd.sock \ # 明确指向 cri-dockerd 端点
--pod-network-cidr=10.244.0.0/16 # 适配 Flannel 网络插件
正常结果:1-3 分钟后,输出
Your Kubernetes control-plane has initialized successfully!
,并附带kubeadm join
命令(复制保存,用于后续添加节点)。
3. 配置 kubectl 权限(当前用户操作集群)
bash
# 创建 kubectl 配置目录
mkdir -p $HOME/.kube
# 复制 Master 配置文件
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# 修正文件权限(避免“权限不足”错误)
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 验证 kubectl 可用性
kubectl get nodes
正常结果:
kubectl get nodes
显示节点信息,STATUS
为NotReady
(未部署网络插件),无连接错误。
常见错误与修正
错误 4:初始化提示 “[ERROR CRI] container runtime is not running”
现象:初始化中断,提示 cri-dockerd 未运行;
原因:cri-dockerd 服务未启动或端点配置错误;
修正:bash
sudo systemctl restart cri-docker # 验证 cri-dockerd 端点是否可用 sudo ctr --address unix:///var/run/cri-dockerd.sock version
结果:ctr version
输出Client/Server
信息,重新初始化成功。
第五步:部署 Flannel 网络插件(节点变 Ready 的关键)
bash
# 部署 Flannel 稳定版本(适配 10.244.0.0/16 网段)
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/v0.22.2/Documentation/kube-flannel.yml
# 验证 Flannel 状态(等待 1-2 分钟)
kubectl get pods -n kube-flannel
正常结果:Flannel Pod(名称类似
kube-flannel-ds-xxxx
)的STATUS
为Running
。
常见错误与修正
错误 5:Flannel Pod 处于 “ImagePullBackOff”
现象:拉取quay.io/coreos/flannel
镜像超时;
原因:国外镜像源访问受限;
修正:替换为国内阿里云镜像:bash
# 下载配置文件到本地 wget https://raw.githubusercontent.com/flannel-io/flannel/v0.22.2/Documentation/kube-flannel.yml # 替换镜像地址 sed -i 's/quay.io\/coreos\/flannel/registry.cn-hangzhou.aliyuncs.com\/google_containers\/flannel/g' kube-flannel.yml # 重新部署 kubectl apply -f kube-flannel.yml
结果:Flannel Pod 成功拉取镜像,STATUS
变为Running
。
第六步:允许 Master 节点调度 Pod(单节点专属配置)
默认情况下,Master 节点会添加 “污点”(Taint)禁止调度 Pod,需手动移除,让其同时承担 Worker 功能:
bash
# 移除控制平面污点(适配 K8s 1.24+)
kubectl taint nodes --all node-role.kubernetes.io/control-plane-
# 移除旧版本 master 污点(兼容低版本标签)
kubectl taint nodes --all node-role.kubernetes.io/master-
正常结果:执行
kubectl describe node | grep Taint
无输出(无调度限制)。
常见错误与修正
错误 6:创建 Pod 提示 “Pending”,无可用节点
现象:kubectl run test-nginx --image=nginx
后,Pod 状态为Pending
;
原因:污点未成功移除;
修正:bash
# 强制覆盖移除污点 kubectl taint nodes --all node-role.kubernetes.io/control-plane- --overwrite
结果:Pod 调度成功,STATUS
变为Running
。
第七步:集群最终验证
bash
# 1. 验证节点状态(需为 Ready)
kubectl get nodes
# 2. 验证 K8s 核心组件状态(均为 Running)
kubectl get pods -n kube-system
# 3. 验证容器调度功能(可选)
kubectl run test-nginx --image=nginx:alpine
kubectl get pods
正常结果:
节点
STATUS
为Ready
,ROLES
为control-plane
(Master+Worker 合一);kube-apiserver
、kube-controller-manager
、kube-scheduler
、etcd
、flannel
均为Running
;测试 Pod
test-nginx
状态为Running
。
四、单节点升级为多节点集群(添加 Master/Worker)
(一)添加 Worker 节点(扩展计算资源)
前提条件
新节点:Ubuntu 24.04.3 LTS(x86_64),与 Master 网络互通;
新节点已预装:Docker(正常运行)、cri-dockerd 0.3.19(步骤同第二步)、K8s 1.28 组件(kubeadm=1.28.15-00、kubelet=1.28.15-00)。
操作步骤
Master 节点生成加入命令(若之前的命令过期):
bash
kubeadm token create --print-join-command
输出示例:
kubeadm join 192.168.31.19:6443 --token abc123.def456 --discovery-token-ca-cert-hash sha256:xxxxxxxx
。新 Worker 节点执行加入命令:
bash
# 替换为 Master 生成的实际命令 sudo kubeadm join 192.168.31.19:6443 --token abc123.def456 --discovery-token-ca-cert-hash sha256:xxxxxxxx
正常结果:输出
This node has joined the cluster
。
Master 节点验证:
bash
kubectl get nodes
正常结果:新节点显示在列表中,
STATUS
为Ready
,ROLES
为<none>
(可手动添加标签:kubectl label node 节点名 node-role.kubernetes.io/worker=worker
)。
(二)添加 Master 节点(构建高可用集群)
前提条件
新节点配置与现有 Master 一致,网络互通;
部署负载均衡器(如 HAProxy),统一入口地址(如 192.168.31.100),指向所有 Master 的 6443 端口;
为 etcd 配置共享存储(如 NFS),确保多 Master 数据同步。
操作步骤
现有 Master 节点导出证书与配置:
bash
mkdir -p /tmp/k8s-certs # 复制核心证书(用于新 Master 接入) sudo cp /etc/kubernetes/pki/{ca.crt,ca.key,sa.pub,sa.key,front-proxy-ca.crt,front-proxy-ca.key} /tmp/k8s-certs/ sudo cp /etc/kubernetes/pki/etcd/ca.crt /tmp/k8s-certs/etcd-ca.crt sudo cp /etc/kubernetes/admin.conf /tmp/k8s-certs/
复制证书到新 Master 节点(替换
新节点IP
和用户名
):bash
scp -r /tmp/k8s-certs/* 用户名@新节点IP:/tmp/
新 Master 节点准备证书与配置:
bash
sudo mkdir -p /etc/kubernetes/pki/etcd sudo cp /tmp/{ca.crt,ca.key,sa.pub,sa.key,front-proxy-ca.crt,front-proxy-ca.key} /etc/kubernetes/pki/ sudo cp /tmp/etcd-ca.crt /etc/kubernetes/pki/etcd/ca.crt # 配置 kubectl mkdir -p $HOME/.kube sudo cp /tmp/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
新 Master 节点加入集群:
bash
# 替换为负载均衡器地址、实际 token 和 hash sudo kubeadm join 192.168.31.100:6443 \ --token abc123.def456 \ --discovery-token-ca-cert-hash sha256:xxxxxxxx \ --control-plane \ --certificate-key $(sudo kubeadm certs certificate-key)
正常结果:输出
This node has joined the cluster as a control-plane node
。
验证:
bash
kubectl get nodes
正常结果:新 Master 节点
STATUS
为Ready
,ROLES
为control-plane
。
五、关键注意事项
Docker 状态优先检查:cri-dockerd 完全依赖 Docker,所有节点必须确保 Docker 正常运行,避免 cri-dockerd 启动失败;
版本严格一致:所有节点的 kubeadm、kubelet、kubectl、cri-dockerd 版本必须与 Master 一致(如均为 1.28.15、0.3.19),否则会出现兼容性错误;
网络互通:节点间需开放 6443(apiserver)、2379/2380(etcd)、10250(kubelet)端口,或关闭防火墙(测试环境);
多 Master 高可用:必须配置负载均衡器和 etcd 共享存储,否则多 Master 无法同步数据,集群不稳定。