K8s 都開始放棄 Docker了,Containerd 命令走起
當(dāng)前 containerd 已經(jīng)取代docker 成為默認(rèn)的容器運(yùn)行時(shí)了,我們?cè)谌粘E挪閱?wèn)題的時(shí)候,經(jīng)常會(huì)使用containerd 的客戶端去排查問(wèn)題。所以日常的命令還是需要掌握的。
containerd 目前有三個(gè)客戶端,分別是 ctr、nerdctl、crictl 下面我們逐一講解一下。
ctr
ctr 是containerd 的親兒子,containerd 的所有功能都可以通過(guò)ctr 命令去操作。
比如我們可以通過(guò)ctr 拉一個(gè)鏡像
ctr images pull docker.io/library/nginx:1.21
或者通過(guò)ctr 創(chuàng)建一個(gè)容器
ctr container create -t docker.io/library/nginx:latest nginx_1
最后通過(guò)ctr 啟動(dòng)容器,這里是 task 子命令,containerd 中只要涉及進(jìn)程相關(guān)的都使用task
ctr task start -d nginx_1
容器啟動(dòng)后,就可以通過(guò) exec 進(jìn)入容器
ctr task exec -t --exec-id bash_1 nginx_1 bash
nerdctl
nerdctl 的命令,我就不說(shuō)了,因?yàn)?nerdctl 目的就是為了做一個(gè)兼容 docker 命令的客戶端,所以使用的命令和 docker 完全保持一致。
我們就可以直接拋棄 docker + dockerd了,直接通過(guò) nerdctl + containerd 了。
crictl
crictl 在k8s里面非常常用,嚴(yán)格來(lái)說(shuō),它并不是 containerd 的客戶端,只是因?yàn)閏ontainerd 實(shí)現(xiàn)了crictl 的接口,所以可以使用 crictl 。crictl 是k8s CRI 客戶端,所以,所有實(shí)現(xiàn)CRI 接口的服務(wù),都可以使用 crictl
我們可以先通過(guò)
crictl pull xxx
拉鏡像,然后啟動(dòng) Pod(sandbox)
crictl runp pod.json
其中pod.json 內(nèi)容如下:
{
"metadata": {
"name": "nginx-sandbox",
"namespace": "default",
"attempt": 1,
"uid": "hdishd83djaidwnduwk28bcsb"
},
"log_directory": "/tmp",
"linux": {
"security_context": {
"namespace_options":{
"network": 2
}
}
}
}
然后為這個(gè)pod 添加一個(gè)容器
crictl create podID container.json pod.json
其中,container.json 內(nèi)容如下:
{
"metadata": {
"name": "busybox"
},
"image":{
"image": "busybox"
},
"command": [
"top"
],
"log_path":"busybox.log",
"linux": {
}
}
創(chuàng)建成功后,我們?cè)偻ㄟ^(guò) ctr 命令檢查一下。
# ctr -n k8s.io c ls
CONTAINER IMAGE RUNTIME
56ae054eed20d0e4dbaf2bf300406baaedaa63646a3b0dc39911daaaff4cd569 docker.io/library/busybox:latest io.containerd.runc.v2
e23205e980b40ebeef875f9489321fe67906cbe62b6b6232912aa69b58842b95 k8s.gcr.io/pause:3.2 io.containerd.runc.v2
可以看到成功的啟動(dòng)了兩個(gè)容器。