一、概述
作為接替 Docker 運行時的 Containerd 在早在 Kubernetes1.7 時就能直接與 Kubelet 集成使用,只是大部分時候我們因熟悉 Docker,在部署集群時采用了默認的 dockershim。在V1.24
起的版本的 kubelet 就徹底移除了dockershim
,改為默認使用Containerd
了,當然也使用 cri-dockerd
適配器來將 Docker Engine
與 Kubernetes 集成??梢詤⒖脊俜轿臋n:
https://kubernetes.io/zh-cn/docs/setup/production-environment/container-runtimes/#docker

二、Containerd 常見命令操作
更換 Containerd 后,以往我們常用的 docker 命令也不再使用,取而代之的分別是
crictl
和ctr
兩個命令客戶端。
-
crictl
是遵循 CRI 接口規范的一個命令行工具,通常用它來檢查和管理kubelet
節點上的容器運行時和鏡像。 -
ctr
是containerd
的一個客戶端工具。 -
ctr -v
輸出的是containerd
的版本,crictl -v
輸出的是當前 k8s 的版本,從結果顯而易見你可以認為crictl
是用于k8s
的。 - 一般來說你某個主機安裝了 k8s 后,命令行才會有 crictl 命令。而 ctr 是跟 k8s 無關的,你主機安裝了 containerd 服務后就可以操作 ctr 命令。
使用crictl
命令之前,需要先配置/etc/crictl.yaml
如下:
runtime-endpoint:unix:///run/containerd/containerd.sock
image-endpoint:unix:///run/containerd/containerd.sock
timeout:10
debug:false
也可以通過命令進行設置:
crictlconfigruntime-endpointunix:///run/containerd/containerd.sock
crictlconfigimage-endpointunix:///run/containerd/containerd.sock
命令 | docker | ctr(containerd) | crictl(kubernetes) |
---|---|---|---|
查看運行的容器 | docker ps | ctr task ls/ctr container ls | crictl ps |
查看鏡像 | docker images | ctr image ls | crictl images |
查看容器日志 | docker logs | 無 | crictl logs |
查看容器數據信息 | docker inspect | ctr container info | crictl inspect |
查看容器資源 | docker stats | 無 | crictl stats |
啟動/關閉已有的容器 | docker start/stop | ctr task start/kill | crictl start/stop |
運行一個新的容器 | docker run | ctr run | 無(最小單元為 pod) |
打標簽 | docker tag | ctr image tag | 無 |
創建一個新的容器 | docker create | ctr container create | crictl create |
導入鏡像 | docker load | ctr image import | 無 |
導出鏡像 | docker save | ctr image export | 無 |
刪除容器 | docker rm | ctr container rm | crictl rm |
刪除鏡像 | docker rmi | ctr image rm | crictl rmi |
拉取鏡像 | docker pull | ctr image pull | ctictl pull |
推送鏡像 | docker push | ctr image push | 無 |
登錄或在容器內部執行命令 | docker exec | 無 | crictl exec |
清空不用的容器 | docker image prune | 無 | crictl rmi --prune |
更多命令操作,可以直接在命令行輸入命令查看幫助。
docker--help
ctr--help
crictl--help
由于 Containerd 也有 namespaces 的概念,對于上層編排系統的支持,ctr
客戶端 主要區分了 3 個命名空間分別是k8s.io
、moby
和default
,以上我們用crictl
操作的均在k8s.io
命名空間,使用ctr
看鏡像列表就需要加上-n 參數。crictl 是只有一個k8s.io
命名空間,但是沒有-n 參數。
【溫馨提示】ctr images pull 拉取的鏡像默認放在
default
,而 crictl pull 和 kubelet 默認拉取的鏡像都在 k8s.io 命名空間下。所以通過ctr
導入鏡像的時候特別注意一點,最好指定命名空間。
#注意-n不能放在命令最后面,下面幾行查看的鏡像是一樣的
ctr-n=k8s.ioimagels
ctr-nk8s.ioimagels
# crictl 沒有-n參數,操作都在`k8s.io`命名空間下。
crictlimagels
crictlimages
#crictlimagelist=ctr-n=k8s.ioimagelist
#crictlimagels=ctr-n=k8s.ioimagels
#crictlimages=ctr-n=k8s.ioimagelist
#crictlimages=ctr-n=k8s.ioimagels
#使用ctr命令指定命名空間導入鏡像
ctr-n=k8s.ioimageimportdashboard.tar
#查看鏡像,可以看到可以查詢到了
crictlimages

三、containerd 客戶端工具 nerdctl
推薦使用 nerdctl,使用效果與 docker 命令的語法一致,github 下載鏈接:
https://github.com/containerd/nerdctl/releases
- 精簡 (nerdctl--linux-amd64.tar.gz): 只包含 nerdctl
- 完整 (nerdctl-full--linux-amd64.tar.gz):包含 containerd, runc, and CNI 等依賴
nerdctl
的目標并不是單純地復制 docker 的功能,它還實現了很多 docker 不具備的功能,例如延遲拉取鏡像(lazy-pulling)、鏡像加密(imgcrypt)等。具體看 nerdctl。
延遲拉取鏡像功能可以參考這篇文章:Containerd 使用 Stargz Snapshotter 延遲拉取鏡像
https://icloudnative.io/posts/startup-containers-in-lightning-speed-with-lazy-image-distribution-on-containerd/
1)安裝 nerdctl(精簡版)
wgethttps://github.com/containerd/nerdctl/releases/download/v0.22.2/nerdctl-0.22.2-linux-amd64.tar.gz
#解壓
tar-xfnerdctl-0.22.2-linux-amd64.tar.gz
ln-s/opt/k8s/nerdctl/nerdctl/usr/local/bin/nerdctl
2)安裝 nerdctl(完整版,這里不裝)
wgethttps://github.com/containerd/nerdctl/releases/download/v0.22.2/nerdctl-full-0.22.2-linux-amd64.tar.gz
tar-xfnerdctl-full-0.16.0-linux-amd64.tar.gz-C/usr/local/
cp/usr/local/lib/systemd/system/*.service/etc/systemd/system/
啟動服務 buildkit
systemctlenablebuildkitcontainerd--now
systemctlstatusbuildkitcontainerd
3)安裝 buildkit 支持構建鏡像
buildkit GitHub 地址:
https://github.com/moby/buildkit
使用精簡版 nerdctl 無法直接通過 containerd 構建鏡像,需要與 buildkit 組全使用以實現鏡像構建。當然你也可以安裝上面的完整 nerdctl;buildkit 項目是 Docker 公司開源出來的一個構建工具包,支持 OCI 標準的鏡像構建。它主要包含以下部分:
- 服務端 buildkitd,當前支持 runc 和 containerd 作為 worker,默認是 runc;
- 客戶端 buildctl,負責解析 Dockerfile,并向服務端 buildkitd 發出構建請求。
buildkit 是典型的C/S 架構,client 和 server 可以不在一臺服務器上。而 nerdctl 在構建鏡像方面也可以作為 buildkitd 的客戶端。
#https://github.com/moby/buildkit/releases
wgethttps://github.com/moby/buildkit/releases/download/v0.10.4/buildkit-v0.10.4.linux-amd64.tar.gz
tar-xfbuildkit-v0.10.4.linux-amd64.tar.gz-C/usr/local/
配置 buildkit 的啟動文件,可以從這里下載:
https://github.com/moby/buildkit/tree/master/examples/systemd
buildkit 需要配置兩個文件
-
/usr/lib/systemd/system/buildkit.socket
cat>/usr/lib/systemd/system/buildkit.socket<
-
/usr/lib/systemd/system/buildkit.service
cat>/usr/lib/systemd/system/buildkit.service<#Replaceruncbuildswithcontainerdbuilds
ExecStart=/usr/local/bin/buildkitd--addrfd://
[Install]
WantedBy=multi-user.target
EOF
啟動 buildkit
systemctldaemon-reload
systemctlenablebuildkit--now

四、實戰操作
1)修改 containerd 配置文件
可以參考我之前的文章:
containerdconfigdefault>/etc/containerd/config.toml
配置如下:
[plugins."io.containerd.grpc.v1.cri".registry]
config_path=""
[plugins."io.containerd.grpc.v1.cri".registry.auths]
[plugins."io.containerd.grpc.v1.cri".registry.configs]
[plugins."io.containerd.grpc.v1.cri".registry.configs."myharbor-minio.com".tls]
insecure_skip_verify=true#跳過認證
ca_file="/etc/containerd/myharbor-minio.com/ca.crt"
[plugins."io.containerd.grpc.v1.cri".registry.configs."myharbor-minio.com".auth]
username="admin"
password="Harbor12345"
[plugins."io.containerd.grpc.v1.cri".registry.headers]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."myharbor-minio.com"]
endpoint=["https://myharbor-minio.com"]

重啟 containerd
#重新加載配置
systemctldaemon-reload
#重啟containerd
systemctlrestartcontainerd
注意:這個配置文件是給crictl
和kubelet
使用,ctr
是不可以用這個配置文件的,ctr 不使用 CRI,因此它不讀取 plugins."io.containerd.grpc.v1.cri"配置。
2)ctr 拉取推送鏡像
#推送鏡像到harbor
ctr--namespace=k8s.ioimagespushmyharbor-minio.com/bigdata/minio:2022.8.22-debian-11-r0--skip-verify--useradmin:Harbor12345
#--namespace=k8s.io指定命名空間,不是必須,根據環境而定
#--skip-verify跳過認證
#--user指定harbor用戶名及密碼
ctrimagespull--useradmin:Harbor12345--tlscacert=/etc/containerd/myharbor-minio.com/ca.crtmyharbor-minio.com/bigdata/minio:2022.8.22-debian-11-r0
不想-u user:password 每次必須使用 ctr pull/ctr push, 可以使用nerdctl
。
3)鏡像構建
cat>Dockerfile<echo'HelloNerdctlFromContainerd'>/usr/share/nginx/html/index.html
EOF
然后在文件所在目錄執行鏡像構建命令:
#不加-n指定命名空間,crictl看不到,kubelet也不能使用它,默認在default命名空間下
nerdctl-nk8s.iobuild-tnginx:nerctl-f./Dockerfile.
###參數解釋
#-t:指定鏡像名稱
# . :當前目錄Dockerfile
#-f:指定Dockerfile路徑
#--no-cache:不緩存

4)打標簽 tag
# crictl沒有tag命令,只能使用nerdctl和ctr,必須指定命名空間,要不然kubelet無法使用。
ctr-nk8s.ioitag
nerdctl-nk8s.iotagnginx:nerctlmyharbor-minio.com/bigdata/nginx:nerctl
#ctr-nk8s.iotagnginx:nerctlmyharbor-minio.com/bigdata/nginx:nerctl
#查看鏡像
nerdctl-nk8s.ioimagesmyharbor-minio.com/bigdata/nginx:nerctl
5)將鏡像推送到 Harbor
第一種情況:http
方式,配置如下:
#以下兩個哪個都可以
#mkdir-p/etc/docker/certs.d/myharbor-minio.com:443
mkdir-p/etc/containerd/certs.d/myharbor-minio.com:443
cat>/etc/containerd/certs.d/myharbor-minio.com:443/hosts.toml<"https://docker.io"
[host."http://myharbor-minio.com:80"]
capabilities=["pull","resolve","push"]
#skip_verify=true
#ca="ca.crt"#相對路徑
#ca="/opt/auth/ca.crt"#絕對路徑
#ca=["/opt/auth/ca.crt"]
#ca=["ca.crt"]
#client=[["/opt/auth/nginx.cclinux.cn.crt","/opt/auth/nginx.cclinux.cn.key"]]
EOF
第一種情況:https
方式,配置如下:
#以下兩個哪個都可以
#mkdir-p/etc/docker/certs.d/myharbor-minio.com:443
mkdir-p/etc/containerd/certs.d/myharbor-minio.com:443
cat>/etc/containerd/certs.d/myharbor-minio.com:443/hosts.toml<"https://docker.io"
[host."https://myharbor-minio.com:443"]
capabilities=["pull","resolve","push"]
skip_verify=true
#ca="ca.crt"#相對路徑
#ca="/opt/auth/ca.crt"#絕對路徑
#ca=["/opt/auth/ca.crt"]
ca=["/etc/containerd/myharbor-minio.com/ca.crt"]
#client=[["/opt/auth/nginx.cclinux.cn.crt","/opt/auth/nginx.cclinux.cn.key"]]
EOF
通過 nerdctl 登錄 harbor
echoHarbor12345|nerdctllogin--username"admin"--password-stdinmyharbor-minio.com:443
#nerdctllogin--username"admin"--passwordHarbor12345myharbor-minio.com:443
#登出
#nerdctllogout

開始將鏡像推送到 harbor
###推送到Harbor
#--insecure-registryskipsverifyingHTTPScerts,andallowsfallingbacktoplainHTTP
nerdctl--insecure-registry--namespace=k8s.iopushmyharbor-minio.com/bigdata/nginx:nerctl
#ctr--namespace=k8s.ioimagespushmyharbor-minio.com/bigdata/nginx:nerctl--skip-verify--useradmin:Harbor12345
#--namespace=k8s.io指定命名空間,跟-n一樣,不是必須,根據環境而定
#--skip-verify跳過認證
#--user指定harbor用戶名及密碼

Containerd ctr,crictl,nerdctl 客戶端命令介紹與實戰操作就到這里了,有疑問的小伙伴歡迎給我留言哦!
審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
容器
+關注
關注
0
文章
512
瀏覽量
22481
-
命令
+關注
關注
5
文章
741
瀏覽量
22913
-
Docker
+關注
關注
0
文章
515
瀏覽量
13018
原文標題:Containerd ctr、crictl、nerdctl 客戶端命令介紹與實戰操作
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
熱點推薦
常見的shell命令之文件操作相關命令
命令命令:cp英文全拼:copy功能:實現文件的復制操作參數:cp [選項] 源文件/目錄目的文件/目錄示例:5、mv文件改名移動命令:mv英文全拼:move功能:可以將一個目錄移到另
發表于 08-19 10:01
常見的shell命令之其他命令
用戶的信息用法:who示例:5、PS查詢進程命令命令:ps功能:顯示當前操作系統中由該用戶運行的進程列表常見參數:用法:示例1:ps示例2:ps -el查看所有進程的詳細信息示例3:使
發表于 08-21 09:49
Linux常見的命令有哪些
摘要:這是對周立功編著的《嵌入式Linux開發教程》的第7期連載。本期刊載內容有關LinuxLinux常見命令中的導航命令、目錄命令和文件命令
發表于 10-28 10:06
MongoDB常用操作命令大全
本文主要是對MongoDB常用操作命令解析。如果你想創建一個“myTest”的數據庫,先運行use myTest命令,之后就做一些操作(如:db.createCollection(‘u
重磅!阿里巴巴工程師獲得 containerd 社區席位,與社區共建云時代容器標準
重磅!阿里巴巴工程師獲得 containerd 社區席位,與社區共建云時代容器標準11 月 29 日,CNCF containerd 社區正式宣布:兩位阿里巴巴工程師正式獲得 containerd
發表于 12-11 17:25
?472次閱讀
嵌入式Linux開發教程:Linux常見命令(上篇)
摘要:這是對周立功編著的《嵌入式Linux開發教程》的第7期連載。本期刊載內容有關LinuxLinux常見命令中的導航命令、目錄命令和文件命令
發表于 10-21 13:36
?11次下載
基礎的Linux操作命令
IC設計是在linux環境下,很多操作需要在Terminal中進行,因此想要學習IC設計,就必須先需要熟悉Linux環境、掌握基礎的Linux操作命令;網上也有很多系統的教程,可以系統去學一學,當然
Containerd的Bug導致容器被重建!如何避免?
該 issue 在 2022 年 12 月 20 日被提交,RKE2 團隊在 2023 年 1 月 6 日緊急合并了 containerd 中修復該 issue 的 commit,發布了 k3s-containerd v1.6.14+k3s1 版本,并發布了新的 rke2
Containerd基礎用法
從 Docker 1.11 版本開始,Docker 容器運行就不是簡單通過 Docker Daemon 來啟動了,而是通過集成containerd、runc等多個組件來完成的。 雖然Docker
solidworks基本操作命令的技巧
在零件設計的過程中,可以隨意插入其他特征的零件與之進行操作和修改,有別于裝配體中的裝配命令,還有當一個實體又很多圓角過渡造型比較復雜的時候,可以用分割的命令將其分成兩個部分,然后分別對他們進行造型上的設計,例如,抽殼。
Linux ip命令常用操作
Linux?ip命令常用操作 在Linux系統中,ip命令是用于管理網絡接口和路由的強大工具。相比于舊的?ifconfig命令,ip命令提供
評論