containerd命令工具ctr、crictl、nerdctl#
一、背景
kubernetes 1.24版本以后Dockershim 已从 Kubernetes 项目中移除,默认使用的容器运行时为containerd。
二、相关须知
2.1 kubernetes集群在containerd节点上创建的容器和镜像都是在k8s.io命名空间下
ctr -n k8s.io container ls
ctr -n k8s.io images ls
2.2 通过命令确认镜像是否完整状态
ctr -n k8s.io images check
若镜像非完整状态无法提交、导出、推送,需要使用–all-platforms重新拉取完整镜像
ctr –n k8s.io images pull --all-platforms xxxx/xxx/xxx:latest
nerdctl –n k8s.io pull --all-platforms xxxx/xxx/xxx:latest
2.3 特性discard_unpacked_layers默认关闭,功能为保留完整的镜像包,可以关闭该特性释放节点空间
大量镜像缓存会占用节点额外空间,当空间不足时,节点镜像会面临k8s的GC机制清理
containerd节点配置discard_unpacked_layers为true,效果为
- 镜像下载解压后不保留原始文件,节省节点的容器存储空间(√)
- ctr images check查看镜像为不完整状态,不完整状态的镜像无法被push、save、commit
下图为:关闭特性开关后,kubelet拉取镜像后,镜像状态完整。(完整状态的镜像可以push、save、commit)
2.5 Containerd有namespaces的概念
ctr 、crictl 和 nerdctl 三个命令管理默认的命名空间不同,执行命令时需要指定命名空间,containerd 默认的命名空间是 k8s.io ,这里的命名空间不是k8s的命名空间。
ctr: 默认命名空间是default
crictl: 默认命令空间是k8s.io
nerdctl: 默认命名空间是default
例如如下命令指定命名空间查看镜像
ctr -n k8s.io images ls
nerdctl -n k8s.io images
批量清理镜像
按镜像名称清理:
nerdctl -n k8s.io rmi $(nerdctl -n k8s.io images | awk -F ' ' '{print $1":"$2}') --force
按镜像ID清理:
nerdctl -n k8s.io rmi $(nerdctl -n k8s.io images | awk -F ' ' '{print $3}') --force
三、安装
官网安装文档:https://github.com/containerd/containerd/blob/main/docs/getting-started.md
3.1 containerd安装
步骤1 安装容器引擎运行时containerd
添加华为开源docker源(https://mirrors.huaweicloud.com/home),不安装docker!
wget -O /etc/yum.repos.d/docker-ce.repo https://repo.huaweicloud.com/docker-ce/linux/centos/docker-ce.repo
sudo sed -i 's+download.docker.com+repo.huaweicloud.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
yum install -y containerd crictl-tools
sudo systemctl enable --now containerd
modprobe br_netfilter
echo 1 > /proc/sys/net/ipv4/ip_forward
containerd config default | sudo tee /etc/containerd/config.toml
步骤2 修改config.toml,将pause镜像地址修改为个人仓库地址
重启containerd
systemctl restart containerd
----结束
3.2 nerdctl工具安装
下载安装工具,建议下载full包,包含nerdctl依赖运行、构建等全部工具。
工具地址:https://github.com/containerd/nerdctl
wget https://github.com/containerd/nerdctl/releases/download/v1.5.0/nerdctl-full-1.5.0-linux-amd64.tar.gz
tar -zxf nerdctl-1.5.0-linux-amd64.tar.gz -C /usr/local/
运行buildkitd,可以用于构建镜像(可选)
cp /usr/local/lib/systemd/system/buildkit.service /lib/systemd/system/
systemctl enable buildkit --now
四、常见命令
命令 | docker | ctr(containerd) | crictl(kubernetes) | nerdctl |
---|---|---|---|---|
查看运行的容器 | docker ps | ctr task ls/ctr container ls | crictl ps | nerdctl ps |
查看镜像 | docker images | ctr image ls | crictl images | nerdctl images |
查看镜像详情 | docker inspect 镜像名 | 无 | crictl inspecti | nerdctl inspect |
查看容器日志 | docker logs | 无 | crictl logs | nerdctl logs |
查看容器资源 | docker stats | 无 | crictl stats | nerdctl stats |
启动/关闭已有的容器 | docker start/stop | ctr task start/kill | crictl start/stop | nerdctl start/stop |
运行一个新的容器 | docker run | ctr run | 无(最小单元为 pod) | nerdctl run |
打标签 | docker tag | ctr image tag | 无 | nerdctl tag |
创建一个新的容器 | docker create | ctr container create | crictl create | nerdctl create |
导入镜像 | docker load | ctr image import | 无 | nerdctl load |
导出镜像 | docker save | ctr image export | 无 | nerdctl save |
删除容器 | docker rm | ctr container rm | crictl rm | nerdctl rm |
删除镜像 | docker rmi | ctr image rm | crictl rmi | nerdctl rmi |
拉取镜像 | docker pull | ctr image pull | crictl pull | nerdctl pull |
推送镜像 | docker push | ctr image push | 无 | nerdctl push |
登录容器内部 | docker exec | ctr task exec --exec-id 0 -t nginx sh | crictl exec | nerdctl exec |
清空不用的镜像 | docker image prune | 无 | crictl rmi --prune | nerdctl image prune |
登录镜像仓库 | docker login | 无 | 无 | nerdctl login |
导出容器文件系统 | docker export | 无 | 无 | 无 |
镜像管理 | ctr | crictl | nerdctl | docker |
---|---|---|---|---|
命令行登录SWR | 不支持 | 不支持 | nerdctl login -u xxx -p xxx | docker login -u xxx -p xxx |
拉取SWR镜像 | ctr images pull --user username:password swr.cn-north-7.myhuaweicloud.com/mcp-test/my-ng:v1 | crictl pull --creds username:password swr.cn-north-7.myhuaweicloud.com/test-images/redis:7.0.5-alpine | nerdctl pull swr.cn-north-4.myhuaweicloud.com/ytest/nginx:latest | docker pull swr.cn-north-4.myhuaweicloud.com/ytest/nginx:latest |
推送镜像到SWR | ctr images push --user username:password swr.cn-north-7.myhuaweicloud.com/mcp-test/my-ng:v1 | 不支持 | nerdctl push swr.cn-north-4.myhuaweicloud.com/ytest/nginx:latest | docker push swr.cn-north-4.myhuaweicloud.com/ytest/nginx:latest |
五、拉取、修改、提交、保存镜像
步骤1 可选: 拉取镜像
nerdctl -n k8s.io pull --all-platforms xxxx/xxx/nginx:v1
ctr -n k8s.io images check | grep nginx:v1
步骤2 使用镜像
nerdctl -n k8s.io run -d --name=nginx --restart=always xxxx/xxx/nginx:v1
步骤3 进入容器,修改文件
nerdctl -n k8s.io exec -it $(nerdctl -n k8s.io ps -a -q -f name=nginx) bash
例如:
echo "Hello World!" > /usr/share/nginx/html/index.html
步骤4 commit为新镜像
nerdctl -n k8s.io commit -p=false $(nerdctl -n k8s.io ps -a -q -f name=nginx) swr.cn-north-7.myhuaweicloud.com/devops/nginx:v1.1
nerdctl -n k8s.io images | grep nginx
containerd commit容器成镜像时需要指定-p=false(默认为true),表示不暂停容器
步骤5 登录目标镜像仓库,推送镜像
nerdctl -n k8s.io login -u xxx -p xxx swr.cn-north-7.myhuaweicloud.com
nerdctl -n k8s.io push swr.cn-north-7.myhuaweicloud.com/devops/nginx:v1.1
步骤6 保存镜像到本地目录(可选)
nerdctl -n k8s.io save swr.cn-north-7.myhuaweicloud.com/devops/nginx:v1.1 -o nginx.tar
ls | grep nginx
步骤7 验证:以新镜像运行容器,验证修改内容项
nerdctl -n k8s.io run -it swr.cn-north-7.myhuaweicloud.com/devops/nginx:v1.1 bash
----结束
六、构建镜像
步骤1 创建临时文件夹
mkdir demo
cd demo
步骤2 编辑Dockerfile
nerdctl build 会去镜像仓库拉取镜像,不会直接使用本地镜像。构建前可以nerdctl pull 拉取测试一下镜像是否能拉取成功。
vim Dockerfile
#FROM swr.ap-southeast-3.myhuaweicloud.com/k8s-sync/nginx:latest
FROM nginx:latest
RUN echo "Hello World!" > /usr/share/nginx/html/index.html
CMD ["nginx","-g","daemon off"]
----结束
6.1 构建多平台镜像
参考官网文档:https://github.com/containerd/nerdctl/blob/main/docs/multi-platform.md
步骤1 准备环境(单平台镜像可以不用起这个准备环境)
sudo nerdctl run --privileged --rm tonistiigi/binfmt --install all
步骤2 构建镜像同时推送,也可以指定单个平台构建
nerdctl -n k8s.io build --platform="amd64,arm64" --output type=image,name=swr.ap-southeast-3.myhuaweicloud.com/k8s-sync/demo:v1.0,push=true .
步骤3 查看镜像,可以看到不同架构 镜像
nerdctl -n k8s.io images | grep demo
----结束
补充:将节点上的容器运行时从Docker Engine改为新运行时
7.1 修改为containerd
7.2 修改为cri-dockerd
- 点赞
- 收藏
- 关注作者
评论(0)