containerd命令工具ctr、crictl、nerdctl#

举报
可以交个朋友 发表于 2023/12/29 19:21:09 2023/12/29
【摘要】 一、背景kubernetes 1.24版本以后Dockershim 已从 Kubernetes 项目中移除,默认使用的容器运行时为containerd。 二、相关须知 2.1 kubernetes集群在containerd节点上创建的容器和镜像都是在k8s.io命名空间下ctr -n k8s.io container lsctr -n k8s.io images ls 2.2 通过命令...

一、背景

kubernetes 1.24版本以后Dockershim 已从 Kubernetes 项目中移除,默认使用的容器运行时为containerd。
image.png

二、相关须知

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

image.png

若镜像非完整状态无法提交、导出、推送,需要使用–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,效果为
image.png

  • 镜像下载解压后不保留原始文件,节省节点的容器存储空间(√)
  • ctr images check查看镜像为不完整状态,不完整状态的镜像无法被push、save、commit

下图为:关闭特性开关后,kubelet拉取镜像后,镜像状态完整。(完整状态的镜像可以push、save、commit)
image.png

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!
image.png

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镜像地址修改为个人仓库地址

image.png

重启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

image.png

步骤2 使用镜像

nerdctl -n k8s.io run -d  --name=nginx --restart=always xxxx/xxx/nginx:v1

image.png

步骤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

image.png

步骤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

image.png

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

image.png

步骤6 保存镜像到本地目录(可选)

nerdctl -n k8s.io save swr.cn-north-7.myhuaweicloud.com/devops/nginx:v1.1 -o nginx.tar 
ls | grep nginx

image.png

步骤7 验证:以新镜像运行容器,验证修改内容项

nerdctl -n k8s.io run -it  swr.cn-north-7.myhuaweicloud.com/devops/nginx:v1.1 bash

image.png

----结束

六、构建镜像

步骤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"]

image.png

----结束

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 .

image.png

步骤3 查看镜像,可以看到不同架构 镜像

nerdctl -n k8s.io images | grep demo

image.png

----结束

补充:将节点上的容器运行时从Docker Engine改为新运行时

7.1 修改为containerd

https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/migrating-from-dockershim/change-runtime-containerd/

7.2 修改为cri-dockerd

https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/migrating-from-dockershim/migrate-dockershim-dockerd/

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。