如何優雅地使用containerd?這裏有一份必讀的技巧攻略

前 言

Docker是咱們經常使用的容器runtime,友好的CLI,豐富的社區資料,外加研發運維人員多年的經驗積累,使用Docker幾乎是沒有任何門檻的事。而k3s爲了下降資源消耗,將默認的runtime修改成containerd,雖然containerd很早就已是Docker的一部分,可是純粹使用containerd仍是給你們帶來了諸多困擾。本文收集了一些社區常見的containerd問題,尋求到解決方案後整理成文,供你們須要時查閱。git

入門簡介

咱們都知道Kubernetes定義了本身運行時接口規範CRI,containerd雖然具有容器管理能力,可是不能被直接被Kubernetes使用。k3s做爲Kubernetes的精簡版本,也是如此,k3s自身的kubelet經過cri-containerd plugin(https://github.com/containerd/cri)來驅動containerd建立Pod。github

在這裏插入圖片描述

單純的Containerd沒有Docker CLI,對於常用Docker的用戶來講,一下就會感到不習慣。根據CRI規範,Kubernetes社區也定義了專門CLI工具crictl(https://github.com/kubernetes-sigs/cri-tools)。k3s中也內置了crictl,它被直接編譯到k3s binary中,你在安裝k3s時,會自動建立crictl的軟鏈接。crictl具有了和Docker CLI相似的功能:docker

在這裏插入圖片描述

除了crictl,k3s還內置了ctr(https://github.com/containerd/containerd/tree/master/cmd/ctr),ctr是containerd自己的CLI,更對容器和鏡像API的基本封裝:ubuntu

在這裏插入圖片描述

目前k3s的containerd使用的runc-v2版本,這個版本有個巨大的優化就是針對每一個Pod建立containerd-shim進程。以Traefik Pod爲例,pause容器和traefik容器都是containerd-shim的子進程,這種進程劃分方式更加合理,對Kubernetes更加友好。運維

在這裏插入圖片描述

經常使用技巧

containerd相關的CLI確實沒有Docker CLI方便,好比筆者在使用containerd時碰到一個場景,指望實現對鏡像從新tag的操做,這在Docker下很是容易作到,可是在containerd下很是麻煩。crictl中並不支持這種操做,社區中也有相關issue解釋:工具

https://github.com/kubernetes-sigs/cri-tools/issues/438優化

因此咱們只能使用其餘方式,一般我會這樣作:3d

# 在一臺機去上使用docker tag轉換image
# 導出鏡像,並拷貝到k3s機器上
docker tag busybox busyboxaaa
docker save -o busybox.tar busyboxaaa
scp busybox.tar ubuntu@172.31.24.12:~/
 
# 用ctr導入
ctr image import busybox.tar

k3s集成的containerd的配置文件被存放在 /var/lib/rancher/k3s/agent/etc/containerd/config.toml 中,可是若是要修改其配置不能單純修改它,你須要經過模版修改它:rest

cd /var/lib/rancher/k3s/agent/etc/containerd
cp config.toml config.toml.tmpl
 
# update config.toml.tmpl
# reboot k3s to take affect
systemctl restart k3s

一般來講,咱們都會在本地環境使用k3s,使用私有Registry也是不可避免的,Docker中配置私有registry是很是方便的,而在containerd中該如何配置?關於containerd的registry配置請參考:code

https://github.com/containerd/cri/blob/master/docs/registry.md

值得一提的是一個特殊場景,一般你會在內網在用registry鏡像啓用一個鏡像倉庫服務,爲了簡單方便,你能夠不啓用tls證書而單純使用http模式。這種狀況下,k3s有一個方便的配置方式,即編輯/etc/rancher/k3s/registries.yaml,好比:

$ cat /etc/rancher/k3s/registries.yaml
mirrors:
  "172.31.7.129:5000":
    endpoint:
      - "http://172.31.7.129:5000」
 
$ systemctl restart k3s

重啓後,containerd的配置會出現變化,直接使用crictl命令便可拉取鏡像:

在這裏插入圖片描述

後 記

從業界的技術發展趨勢上看,Docker愈來愈被Kubernetes社區所拋棄,以實現CRI接口的各類容器runtime會與Kubernetes兼容性愈加友好。Docker自己的迭代速度已經沒法知足容器的發展,k3s直接使用containerd能夠很快跟蹤各類容器技術自己的新特性,對技術人員來講,儘早適應Docker之外的runtime,才能跟上社區主流的前進方向。

相關文章
相關標籤/搜索