总结摘要
install-cri-docker.sh 是一个用于安装 cri-dockerd的Shell脚本,cri-dockerd是Docker容器引擎的容器运行时接口(CRI)实现,允许Kubernetes集群继续使用 Docker 作为容器运行时。
install-cri-docker.sh - cri-dockerd 安装脚本
脚本功能
install-cri-docker.sh 是一个自动化安装 cri-dockerd的Shell脚本。cri-dockerd 是 Kubernetes v1.24+版本移除 Docker 支持后的兼容性解决方案,它实现了 Kubernetes 的容器运行时接口(CRI),允许 Kubernetes 集群继续使用 Docker 作为底层容器运行时。
核心特性:
- 自动检测并安装 Docker Engine(如未安装)
- 下载并安装指定版本的 cri-dockerd二进制文件
- 自动配置 systemd服务单元
- 创建 cri-docker.socket套接字文件
- 启用并启动 cri-dockerd 服务
- 集成 kubeadm 所需的 pause 镜像
脚本依赖
系统工具依赖
curl:用于下载 Docker 安装脚本和 cri-dockerd二进制文件wget:用于下载 cri-dockerd压缩包tar:用于解压 cri-dockerd压缩包systemd:用于管理 cri-dockerd 服务git(可选):某些版本可能需要从源码编译
外部服务依赖
- Docker Engine:如未安装,脚本会自动使用官方脚本安装
- 互联网连接:用于下载 cri-dockerd二进制文件和 Docker 安装脚本
环境变量依赖
内置变量说明
脚本内部定义了以下可配置变量:
1
2
3
4
5
6
7
8
| # cri-dockerd 版本(硬编码在脚本中)
CRI_DOCKER_VERSION=v0.3.7
# 下载源(使用镜像加速)
DOWNLOAD_URL="https://github.eli1.top/https://github.com/Mirantis/cri-dockerd/releases"
# pause 镜像(使用国内镜像)
PAUSE_IMAGE="registry.aliyuncs.com/google_containers/pause:3.9"
|
系统要求
- 操作系统:支持主流 Linux发行版(CentOS、Ubuntu、Debian、RHEL等)
- 架构:amd64(x86_64)
- 权限:需要 root权限执行安装
参数用法
本脚本无命令行参数,直接执行完整安装流程:
- 无参数模式:自动完成所有安装步骤
- 版本定制:需修改脚本中的版本号(第 10 行)
使用方法
快速安装与使用
下载脚本:
1
2
3
4
5
| # 使用主下载地址
bash <(curl -sL sc.eli1.top) install-cri-docker download
# 或使用备用地址
bash <(curl -sL download.elisky.cn) install-cri-docker download
|
赋予执行权限:
1
| chmod +x install-cri-docker.sh
|
执行安装:
1
2
3
4
5
| # 使用 root用户运行
sudo ./install-cri-docker.sh
# 或直接以 root身份运行
sudo bash install-cri-docker.sh
|
验证安装:
1
2
3
4
5
6
7
8
9
| # 检查 cri-dockerd 服务状态
systemctl status cri-docker.service
systemctl status cri-docker.socket
# 查看 cri-dockerd 版本
cri-dockerd --version
# 检查套接字文件
ls -la /run/cri-dockerd.sock
|
典型使用场景示例
场景 1:全新安装 Kubernetes v1.24+ 环境
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| # 1. 先安装 Docker
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
# 2. 安装 cri-dockerd
sudo ./install-cri-docker.sh
# 3. 安装 kubeadm、kubelet、kubectl
cat > /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
yum install -y kubelet kubeadm kubectl
# 4. 初始化集群(指定 cri-dockerd 为容器运行时)
kubeadm init --pod-network-cidr=10.244.0.0/16 \
--image-repository registry.aliyuncs.com/google_containers \
--cri-socket unix:///run/cri-dockerd.sock
|
场景 2:升级现有 cri-dockerd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| # 停止现有服务
sudo systemctl stop cri-docker.service
sudo systemctl stop cri-docker.socket
# 备份旧版本
sudo mv /usr/local/bin/cri-dockerd /usr/local/bin/cri-dockerd.bak
# 重新运行安装脚本(会安装新版本)
sudo ./install-cri-docker.sh
# 重启服务
sudo systemctl daemon-reload
sudo systemctl start cri-docker.service
sudo systemctl start cri-docker.socket
# 验证版本
cri-dockerd --version
|
场景 3:自定义 cri-dockerd 版本
编辑脚本,修改第 10 行的版本号:
1
2
3
4
5
| # 修改前
wget https://github.eli1.top/https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.7/cri-dockerd-0.3.7.amd64.tgz
# 修改为其他版本(如 v0.3.4)
wget https://github.eli1.top/https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.4/cri-dockerd-0.3.4.amd64.tgz
|
场景 4:离线环境安装
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| # 1. 在有网络的机器上下载 cri-dockerd二进制文件
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.7/cri-dockerd-0.3.7.amd64.tgz
# 2. 传输到离线服务器
scp cri-dockerd-0.3.7.amd64.tgz user@offline-server:/tmp/
# 3. 手动安装
cd /tmp
tar xf cri-dockerd-0.3.7.amd64.tgz
cd cri-dockerd
sudo install -o root -g root -m 0755 cri-dockerd /usr/local/bin/cri-dockerd
# 4. 复制 systemd 配置文件(从脚本中提取或手动创建)
# 参考脚本中的 cat >> ...部分创建 service和socket文件
# 5. 启动服务
sudo systemctl daemon-reload
sudo systemctl enable cri-docker.service --now
sudo systemctl enable cri-docker.socket --now
|
场景 5:配置开机自启和验证
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| # 启用开机自启
sudo systemctl enable cri-docker.service
sudo systemctl enable cri-docker.socket
# 立即启动服务
sudo systemctl start cri-docker.service
sudo systemctl start cri-docker.socket
# 检查服务状态
systemctl is-active cri-docker.service
systemctl is-active cri-docker.socket
# 查看日志
journalctl -u cri-docker.service -f
|
安装流程详解
脚本执行以下步骤:
检查 Docker 是否已安装(第 4-8 行):
1
2
3
4
5
| if ! type docker >/dev/null 2>&1; then
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
else
echo 'docker 已安装';
fi
|
下载 cri-dockerd(第 10-12 行):
1
2
3
| cd /tmp
wget https://github.eli1.top/.../cri-dockerd-0.3.7.amd64.tgz
tar xf cri-dockerd-0.3.7.amd64.tgz
|
安装二进制文件(第 13 行):
1
| install -o root -g root -m 0755 cri-dockerd /usr/local/bin/cri-dockerd
|
创建 systemd 服务配置(第 15-52 行):
- 创建
/lib/systemd/system/cri-docker.service - 配置服务描述、依赖关系、启动参数等
创建 systemd 套接字配置(第 54-66 行):
- 创建
/lib/systemd/system/cri-docker.socket - 配置套接字监听路径和权限
启用并启动服务(第 69-70 行):
1
2
| systemctl daemon-reload
systemctl enable cri-docker.service --now
|
实际应用场景
- Kubernetes v1.24+ 迁移:从旧版本 Kubernetes 升级到 v1.24+时,保持使用 Docker 生态
- 企业环境兼容:企业已有大量 Docker 镜像和工具链,短期内无法迁移到 containerd
- 开发测试环境:开发人员熟悉 Docker,使用 cri-dockerd 降低学习成本
- 渐进式迁移:在使用 containerd 之前,通过 cri-dockerd 作为过渡方案
- 混合运行时:某些特殊场景需要同时支持 Docker 和 containerd
- 遗留应用支持:某些老旧应用依赖 Docker 特定功能,无法直接使用 containerd
注意事项
版本兼容性
Kubernetes 版本:
- Kubernetes v1.24:正式移除 Docker 支持,必须使用 cri-dockerd或其他CRI
- Kubernetes v1.23及更早版本:内置 dockershim,不需要 cri-dockerd
- 建议使用 cri-dockerd v0.3.0+ 配合 Kubernetes v1.24+
Docker 版本:
- 建议 Docker Engine 20.10+
- 确保 Docker 服务正常运行
cri-dockerd 版本选择:
1
2
3
4
5
6
| # v0.3.7 - 推荐版本,稳定性好
# v0.3.4 - 较早版本,适合旧环境
# v0.3.13 - 最新版本,修复已知 bug
# 查看版本对应关系
# https://github.com/Mirantis/cri-dockerd/releases
|
性能考虑
- 性能开销:cri-dockerd 相比 containerd有轻微的性能开销(约 5-10%)
- 生产环境建议:新建集群建议直接使用 containerd
- 资源消耗:cri-dockerd 本身占用约 50-100MB内存
配置要点
套接字路径:
- 默认:
/run/cri-dockerd.sock - kubeadm 参数:
--cri-socket unix:///run/cri-dockerd.sock
pause 镜像:
- 脚本中使用阿里云镜像:
registry.aliyuncs.com/google_containers/pause:3.9 - 可根据网络情况更换为其他镜像源
systemd 配置:
- 不要手动修改脚本生成的 service和socket文件
- 如需自定义,建议在安装后使用
systemctl edit覆盖配置
故障排查
问题 1:服务无法启动
1
2
3
4
5
6
7
| # 查看详细错误
journalctl -u cri-docker.service -n 50 --no-pager
# 常见原因:
# - Docker 服务未启动:systemctl start docker
# - 端口冲突:检查是否有其他进程占用套接字
# - 权限问题:确保 socket文件权限正确
|
问题 2:kubeadm 无法识别 cri-dockerd
1
2
3
4
5
6
7
8
| # 确保使用正确的 cri-socket参数
kubeadm init --cri-socket unix:///run/cri-dockerd.sock
# 验证 socket文件存在
ls -la /run/cri-dockerd.sock
# 检查 cri-dockerd 是否运行
ps aux | grep cri-dockerd
|
问题 3:Pod无法启动
1
2
3
4
5
6
7
8
| # 查看 kubelet日志
journalctl -u kubelet -n 100 --no-pager
# 检查 CRI配置
crictl info
# 验证 Docker 正常运行
docker run hello-world
|
与 containerd对比
| 特性 | cri-dockerd | containerd |
|---|
| 成熟度 | 较新,社区维护 | 成熟,CNCF项目 |
| 性能 | 略有开销 | 原生支持,性能优 |
| Docker 兼容 | 完全兼容 | 需要迁移镜像 |
| 学习曲线 | 低(沿用 Docker) | 中等(新工具链) |
| 推荐场景 | 过渡方案 | 长期方案 |
最佳实践
- 评估必要性:新集群建议直接使用 containerd
- 版本管理:固定 cri-dockerd 版本,避免自动升级
- 监控告警:监控 cri-dockerd 服务状态和资源使用
- 备份配置:备份 systemd 配置文件和 cri-dockerd二进制
- 定期更新:关注 cri-dockerd安全更新和 bug修复
- 文档记录:记录 cri-socket路径和配置参数
- 回滚计划:准备回滚到 dockershim或迁移到 containerd的方案
未来规划
- 短期:使用 cri-dockerd 维持现有 Docker工作流
- 中期:逐步迁移到 containerd,并行运行一段时间
- 长期:完全迁移到 containerd,移除 cri-dockerd依赖
相关资源
- 官方仓库:https://github.com/Mirantis/cri-dockerd
- Kubernetes文档:https://kubernetes.io/docs/setup/production-environment/container-runtimes/#docker
- cri-dockerd 发布页:https://github.com/Mirantis/cri-dockerd/releases