install-cri-docker.sh - cri-dockerd安装脚本

温馨提醒
总结摘要
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. 下载脚本

    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
  2. 赋予执行权限

    1
    
    chmod +x install-cri-docker.sh
  3. 执行安装

    1
    2
    3
    4
    5
    
    # 使用 root用户运行
    sudo ./install-cri-docker.sh
    
    # 或直接以 root身份运行
    sudo bash install-cri-docker.sh
  4. 验证安装

    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

安装流程详解

脚本执行以下步骤:

  1. 检查 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
  2. 下载 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
  3. 安装二进制文件(第 13 行):

    1
    
    install -o root -g root -m 0755 cri-dockerd /usr/local/bin/cri-dockerd
  4. 创建 systemd 服务配置(第 15-52 行):

    • 创建 /lib/systemd/system/cri-docker.service
    • 配置服务描述、依赖关系、启动参数等
  5. 创建 systemd 套接字配置(第 54-66 行):

    • 创建 /lib/systemd/system/cri-docker.socket
    • 配置套接字监听路径和权限
  6. 启用并启动服务(第 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-dockerdcontainerd
成熟度较新,社区维护成熟,CNCF项目
性能略有开销原生支持,性能优
Docker 兼容完全兼容需要迁移镜像
学习曲线低(沿用 Docker)中等(新工具链)
推荐场景过渡方案长期方案

最佳实践

  1. 评估必要性:新集群建议直接使用 containerd
  2. 版本管理:固定 cri-dockerd 版本,避免自动升级
  3. 监控告警:监控 cri-dockerd 服务状态和资源使用
  4. 备份配置:备份 systemd 配置文件和 cri-dockerd二进制
  5. 定期更新:关注 cri-dockerd安全更新和 bug修复
  6. 文档记录:记录 cri-socket路径和配置参数
  7. 回滚计划:准备回滚到 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