写在前面

Kubernetes在1.24版本以后就不再支持Dokcer了,默认容器运行时变成了containerd,虽然可以docker-shim让集群可以使用docker,但还是当一个过渡把docker换成containerd好一些,然而containerd的命令和docker的不太一样用起来不是很方便,不过可以使用nerdctl对containerd进行控制,nerdctl 是用于 containerd 并且兼容 docker cli习惯的管理工具,主要适用于刚从 docker 转到 containerd 的用户,操作 containerd 的命令行工具 ctr 和 crictl 不怎么好用,所以就有了 nerdctl,nerdctl 是 containerd 的非核心子项目 项目地址

安装

先下载安装包

wget https://github.com/containerd/nerdctl/releases/download/v1.3.1/nerdctl-1.3.1-linux-amd64.tar.gz
#可以去项目地址找最新的包,也可以使用这个地址下载,我这里下载的是精简包没有扩展,安装以后有些命令不可用,可以后续安装扩展

安装

#解压文件
tar -xzvf nerdctl-*-linux-amd64.tar.gz -C /usr/local/bin/
#修改默认NS
mkdir /etc/nerdctl/
cat >> /etc/nerdctl/nerdctl.toml <<'EOF'
namespace = "k8s.io"
EOF

验证安装是否成功

nerdctl --version

添加扩展,以CNI为例

wget https://github.com/containernetworking/plugins/releases/download/v1.2.0/cni-plugins-linux-amd64-v1.2.0.tgz
#安装CNI 需放在指定目录,默认目录为 /opt/cni/bin
mkdir -p /opt/cni/bin && tar -xzvf cni-plugins-linux-amd64-v*.tgz -C /opt/cni/bin

到这里nerdctl就已经基本安装完成了,但是通过nerdctl构建镜像的话还是会报错,因为nerdctl依赖buildkit进行构建镜像,所以还要安装buildkit

#下载
wget https://github.com/moby/buildkit/releases/download/v0.11.5/buildkit-v0.11.5.linux-amd64.tar.gz
#解压并安装
mkdir -p /usr/local/containerd && tar zxvf buildkit-v0.11.5.linux-amd64.tar.gz -C /usr/local/containerd
ln -s /usr/local/containerd/bin/buildkitd /usr/local/bin/buildkitd
ln -s /usr/local/containerd/bin/buildctl /usr/local/bin/buildctl
#注册服务
cat > /etc/systemd/system/buildkit.service <<EOF
[Unit]
Description=BuildKit
Documentation=https://github.com/moby/buildkit
 
[Service]
ExecStart=/usr/local/bin/buildkitd --oci-worker=false --containerd-worker=true
 
[Install]
WantedBy=multi-user.target
EOF
#重载daemon
systemctl daemon-reload
#启动服务
systemctl enable buildkit --now

安装完成后再使用nerdctl命令去构建镜像就没问题了

nerdctl的命令基本和docker命令一样,就算kubernetes容器运行时换成了containerd也不会有太大问题