我到底應(yīng)該使用哪個(gè) CRI 替換 kubernetes 集群的 Docker?
前一段時(shí)間 kubernetes 對(duì) docker 的棄用引起了不小的討論,但其實(shí) docker 并不是 kubernetes 中的 CRI 唯一實(shí)現(xiàn)。那么除了 docker 之外,我們還可以使用其他什么 CRI 呢?
下面是我已經(jīng)測(cè)試的幾個(gè) CRI,并進(jìn)行一些基準(zhǔn)測(cè)試來(lái)對(duì)他們進(jìn)行了簡(jiǎn)單的對(duì)比,希望對(duì)你有所幫助:
dockershim containerd crio
對(duì)于 cri-o,已經(jīng)測(cè)試了2個(gè)后端:runc 和 crun,以測(cè)試對(duì) cgroupsv2 的影響。
測(cè)試環(huán)境
我這里的測(cè)試環(huán)境是一個(gè) 1.19.4 版本的 kubernetes 集群,使用 ansible 進(jìn)行創(chuàng)建(https://gitlab.com/incubateur-pe)。集群運(yùn)行在 kvm 上,配置如下:
master:Centos/7, 2vcpus/2G內(nèi)存。 crio-crun 節(jié)點(diǎn):Fedora-32, 2vcpus/4G內(nèi)存。 其他節(jié)點(diǎn):Centos/7, 2vcpus/4G內(nèi)存.
底層是 i7-9700K ,64G的內(nèi)存和一個(gè) mp510 nvme 硬盤。
創(chuàng)建集群
這里我直接使用 molecule 創(chuàng)建一個(gè)集群,并配置了它在每個(gè) worker 節(jié)點(diǎn)上使用不同的 cri,對(duì)應(yīng)的 ansible 源碼位于:https://gitlab.com/incubateur-pe/kubernetes-bare-metal/-/tree/dev/molecule/criBench
使用上面的腳本,執(zhí)行 molecule converge 命令后,大概10分鐘左右,我們就可以得到一個(gè)如下所示的 kubernetes 集群。
接下來(lái)我們就可以進(jìn)行一些簡(jiǎn)單的基準(zhǔn)測(cè)試了。
測(cè)試
1. bucketbench 測(cè)試
Bucketbench (https://github.com/estesp/bucketbench) 是一個(gè)可以對(duì)容器引擎執(zhí)行一系列操作的測(cè)試工具,它非常適合于了解之前每個(gè)節(jié)點(diǎn)的性能。
這里我們的測(cè)試參數(shù)很簡(jiǎn)單:
3個(gè)線程 15次循環(huán) run/stop/delete 操作
對(duì)應(yīng)的結(jié)果如下所示(ms 為單位):
我們可以看到在性能上還是有相當(dāng)大的差異的。但是需要注意的是我們這里為什么測(cè)試了5個(gè)實(shí)例呢?上面不是只有4個(gè) worker 節(jié)點(diǎn)嗎?
這里其實(shí)是因?yàn)檫@里我們使用的 docker 客戶端并不是 kubernetes 使用的,事實(shí)上 docker 實(shí)現(xiàn)了 CRI,并提供了一個(gè) socket,這個(gè) socket 和其他 cri socket 一樣可以調(diào)用。所以這里的區(qū)別是:
docker-shim:是通過(guò) cri 的 socket 來(lái)做測(cè)試 docker-cli:是通過(guò) docker 客戶端來(lái)做測(cè)試
但是實(shí)際上 docker 并沒(méi)有想象中那么差,在這個(gè)測(cè)試中我們可以看到他比 cri-o 要快點(diǎn),當(dāng)然這個(gè)測(cè)試中很明顯 dockerd 是表現(xiàn)最好的。
2. kubernetes 測(cè)試
上面的測(cè)試并不能完整說(shuō)明這幾個(gè) cri 之間的差距,當(dāng)它們被 kubernetes 使用的時(shí)候,它們表現(xiàn)又如何呢?是否不止 run/stop/delete 這些操作?性能上的差異在真正的集群上又有什么意義嗎?
下面我們就來(lái)深入了解下,這次我們使用集群中的 Prometheus、Grafana 來(lái)可視化監(jiān)控指標(biāo),對(duì)應(yīng)的自定義 dashboard 數(shù)據(jù)可以在 https://gitlab.com/ulrich.giraud/bench-cri/-/blob/master/dashboard/dashboard_bench.json 這里獲取。由于只是測(cè)試容器運(yùn)行時(shí),不是工作負(fù)載,所以這里我們只是簡(jiǎn)單的在集群中部署的一個(gè) busybox 鏡像并一直 sleep 的 DaemonSet 應(yīng)用。
apiVersion:?apps/v1
kind:?DaemonSet
metadata:
??name:?benchds-replaceme
??namespace:?benchds
??labels:
????k8s-app:?benchds
spec:
??selector:
????matchLabels:
??????name:?benchds
??template:
????metadata:
??????labels:
????????name:?benchds
????spec:
??????containers:
??????-?name:?benchds
????????image:?busybox:latest
????????command:
??????????-?sleep
??????????-?infinity
????????resources:
??????????limits:
????????????memory:?20Mi
??????????requests:
????????????cpu:?10m
????????????memory:?20Mi
該 DamonSet 將用唯一的名稱進(jìn)行部署:
100次(兩次創(chuàng)建之間有一定延遲) 批量 100次 批量 1000次
對(duì)應(yīng)的 Grafana 展示圖表信息如下所示:
緩慢創(chuàng)建數(shù)百個(gè) DaemonSets
快速創(chuàng)建數(shù)百個(gè) DaemonSets
快速創(chuàng)建數(shù)千個(gè) DaemonSets
現(xiàn)在我們來(lái)分析下上面的測(cè)試結(jié)果。
Cri-o/runc:令人驚訝的是,在所有 create/delete 中是最慢的,但在其他方面處于中等水平。 Cri-o/crun:在 create/delete 方面不是很好,但是在其他方面表現(xiàn)是最好的。 Containerd:表現(xiàn)非常好,幾乎在所有情況下都可以快速響應(yīng)。 Docker:在 create/delete 方面比 cri-o 快,但在 status/list 請(qǐng)求方面是最慢的。
status/list 請(qǐng)求是 cri 上最頻繁的請(qǐng)求,所以這也是性能最重要的地方,cri-o 在這里似乎是更好的選擇,其次就是 containerd。
containerd 在所有指標(biāo)上的表現(xiàn)都比較好,應(yīng)該是最均衡的一個(gè)選擇了。另外一方面,docker 并沒(méi)有得到很好的測(cè)試結(jié)果,但是無(wú)論負(fù)載情況如何,它的表現(xiàn)基本上都是一致的。
總結(jié)
從純性能角度來(lái)說(shuō),確實(shí)有比 docker 更好的替代品,我們的集群也不會(huì)替換 docker 產(chǎn)生什么影響。從另外一個(gè)角度來(lái)看,kubernetes 這次廢棄 docker 的事情也算是一件好事,讓更多的人意識(shí)到 docker 并不是唯一可用的 CRI,甚至不是唯一的構(gòu)建鏡像工具。
在我看來(lái),docker 仍然是讓整個(gè)容器化向前發(fā)展的一個(gè)偉大工具。但是好像我還沒(méi)有回答我最初的問(wèn)題,那就是:我應(yīng)該為我的k8s集群使用什么CRI?
從我個(gè)人角度考慮的話,我個(gè)人的選擇是:containerd,他速度快,配置方便,相當(dāng)可靠和安全,不過(guò) cri-o 已經(jīng)支持 cgroupsv2 了,所以如果我使用 fedora 或者 centos/8 的話我會(huì)優(yōu)先選擇 cri-o。
“原文鏈接:https://ulrich-giraud.medium.com/which-cri-should-i-use-to-replace-docker-for-my-kubernetes-cluster-14a45c080004
”
進(jìn)階訓(xùn)練營(yíng)第二期
本次訓(xùn)練營(yíng)采用線上直播的形式,基于1.19.x版本,根據(jù)第1期課程的打磨,我們總結(jié)出了 Docker 基礎(chǔ) + Kubernetes 基礎(chǔ) + 原理 + 基本使用 + 進(jìn)階技能 +?完整項(xiàng)目實(shí)踐?的課程體系。加強(qiáng)系統(tǒng)知識(shí)吸收、夯實(shí)基礎(chǔ)的同時(shí),并在實(shí)際操作過(guò)程中去了解排查問(wèn)題的方式方法,更為重要的是我們的老師非常負(fù)責(zé)任,隨時(shí)幫你答疑解惑,我們認(rèn)為不只是課堂上講授知識(shí),更重要的是售后支持,完全不用擔(dān)心學(xué)習(xí)不到知識(shí)。
?點(diǎn)擊屏末?|?閱讀原文?|?即刻學(xué)習(xí)









