前景提要
Docker 技術(shù)使用 Linux 內(nèi)核和內(nèi)核功能(例如 Cgroups 和 namespaces)來分隔進(jìn)程,以便各進(jìn)程相互獨(dú)立運(yùn)行。這種獨(dú)立性正是采用容器的目的所在;它可以獨(dú)立運(yùn)行多種進(jìn)程、多個應(yīng)用,更加充分地發(fā)揮基礎(chǔ)設(shè)施的作用,同時保持各個獨(dú)立系統(tǒng)的安全性。
為了防止docker一家獨(dú)大,docker當(dāng)年的實現(xiàn)被拆分出了幾個標(biāo)準(zhǔn)化的模塊,標(biāo)準(zhǔn)化的目的是模塊是可被其他實現(xiàn)替換的,不由任何一個廠商控制。
docker由 docker-client ,dockerd,containerd,docker-shim,runc組成,所以containerd是docker的基礎(chǔ)組件之一,docker 對容器的管理和操作基本都是通過 containerd 完成的。那么,containerd 是什么呢?
Containerd 是一個工業(yè)級標(biāo)準(zhǔn)的容器運(yùn)行時(Container Runtime Interface),它強(qiáng)調(diào)簡單性、健壯性和可移植性。Containerd 可以在宿主機(jī)中管理完整的容器生命周期:容器鏡像的傳輸和存儲、容器的執(zhí)行和管理、存儲和網(wǎng)絡(luò)等。詳細(xì)點(diǎn)說,Containerd 負(fù)責(zé)干下面這些事情:
管理容器的生命周期(從創(chuàng)建容器到銷毀容器)
拉取/推送容器鏡像
存儲管理(管理鏡像及容器數(shù)據(jù)的存儲)
調(diào)用 runC 運(yùn)行容器(與 runC 等容器運(yùn)行時交互)
管理容器網(wǎng)絡(luò)接口及網(wǎng)絡(luò)
從k8s的角度看,可以選擇 containerd 或 docker 作為運(yùn)行時組件:Containerd 調(diào)用鏈更短,組件更少,更穩(wěn)定,占用節(jié)點(diǎn)資源更少調(diào)用鏈
containerd 跟 docker 調(diào)用關(guān)系
配置參數(shù)區(qū)別
日志配置
對比項 | docker | containerd |
---|---|---|
儲路徑 |
docker作為k8s容器運(yùn)行時的情況下,容器日志的落盤由docker來完成, 保存在類似/var/lib/docker/containers/CONTAINERID目錄下。 kubelet會在/var/log/pods和/var/log/containers下面建立軟鏈接, 指向/var/lib/docker/containers/CONTAINERID目錄下。 kubelet會在/var/log/pods和/var/log/containers下面建立軟鏈接, 指向/var/lib/docker/containers/CONTAINERID目錄下的容器日志文件 |
containerd作為k8s容器運(yùn)行時的情況下, 容器日志的落盤由kubelet來完成,保存到/var/log/pods/$CONTAINER_NAME目錄下,同時在/var/log/containers目錄下創(chuàng)建軟鏈接,指向日志文件 |
配置參數(shù) | 在docker配置文件中指定:"log-driver": "json-file", "log-opts": {"max-size": "100m","max-file": "5"} | 方法一:在kubelet參數(shù)中指定:--container-log-max-files=5 --container-log-max-size="100Mi" 方法二:在KubeletConfiguration中指定:"containerLogMaxSize": "100Mi","containerLogMaxFiles": 5, |
把容器日志保存到數(shù)據(jù)盤 | 把數(shù)據(jù)盤掛載到"data-root"(缺省是/var/lib/docker)即可 | 創(chuàng)建一個軟鏈接/var/log/pods指向數(shù)據(jù)盤掛載點(diǎn)下的某個目錄在TKE中選擇"將容器和鏡像存儲在數(shù)據(jù)盤",會自動創(chuàng)建軟鏈接/var/log/pods |
stream server
kubectl exec/logs等命令需要在apiserver跟容器運(yùn)行時之間建立流轉(zhuǎn)發(fā)通道。
docker API本身提供stream服務(wù),kubelet內(nèi)部的docker-shim會通過docker API做流轉(zhuǎn)發(fā)。
containerd的stream服務(wù)需要單獨(dú)配置:
[plugins.cri]
stream_server_address="127.0.0.1"
stream_server_port="0"
enable_tls_streaming=false
在k8s 1.11之前,kubelet并不會做stream proxy, 只會做redirect。也就是把containerd暴露的stream server地址告訴apiserver, 讓apiserver直接來訪問containerd的stream server。這種情況下,需要給stream server使能tle認(rèn)證來做安全防護(hù)。
從k8s1.11引入了kubelet stream proxy (https://github.com/kubernetes/kubernetes/pull/64006), 從而使得containerd stream server只需要監(jiān)聽本地地址即可。
CNI網(wǎng)絡(luò)
對比項 | docker | containerd |
---|---|---|
誰負(fù)責(zé)調(diào)用CNI | kubelet內(nèi)部的docker-shim | containerd內(nèi)置的cri-plugin(containerd 1.1以后) |
如何配置CNI | kubelet參數(shù) --cni-bin-dir 和 --cni-conf-dir | containerd配置文件(toml):plugins.cri.cni bin_dir = "/opt/cni/bin" conf_dir = "/etc/cni/net.d" |
命令對比
containerd不支持docker API和docker CLI, 但是可以通過cri-tool實現(xiàn)類似的功能。
鏡像相關(guān)功能 | docker | containerd |
---|---|---|
顯示本地鏡像列表 | docker images | crictl images |
下載鏡像 | docker pull | crictl pull |
上傳鏡像 | docker push | 無 |
刪除本地鏡像 | docker rmi | crictl rmi |
查看鏡像詳情 | docker inspect | crictl inspecti |
容器相關(guān)功能 | docker | containerd |
---|---|---|
顯示容器列表 | docker ps | crictl ps |
創(chuàng)建容器 | docker create | crictl create |
啟動容器 | docker start | crictl start |
停止容器 | docker stop | crictl stop |
刪除容器 | docker rm | crictl rm |
查看容器詳情 | docker inspect | crictl inspect |
attach | docker attach | crictl attach |
exec | docker exec | crictl exec |
logs | docker logs | crictl logs |
stats | docker stats | crictl stats |
POD相關(guān)功能 | docker | containerd |
---|---|---|
顯示POD列表 | 無 | crictl pods |
查看POD詳情 | 無 | crictl inspectp |
運(yùn)行POD | 無 | crictl runp |
停止POD | 無 | crictl stopp |
拓展閱讀
接下來就是crictl的的常見命令,其中能完全替代docker命令的參照下列表格
crictl對容器生命周期的管理基本已經(jīng)覆蓋,不過在crictl我們不能完成操作也比較多,比如對鏡像的管理就不屬于它的管理范圍。這部分還得依靠ctr來實現(xiàn),操作方式同樣可以參照下表
需注意的是,由于Containerd也有namespaces的概念,對于上層編排系統(tǒng)的支持,主要區(qū)分了3個命名空間分別是k8s.io、moby和default,以上我們用crictl操作的均在k8s.io命名空間完成如查看鏡像列表就需要加上-n參數(shù)
ctr -n k8s.io images list
鏈接:https://www.cnblogs.com/xiexun/p/18268677
-
內(nèi)核
+關(guān)注
關(guān)注
3文章
1416瀏覽量
41424 -
Linux
+關(guān)注
關(guān)注
87文章
11511瀏覽量
213777 -
容器
+關(guān)注
關(guān)注
0文章
511瀏覽量
22452 -
Docker
+關(guān)注
關(guān)注
0文章
515瀏覽量
12962
原文標(biāo)題:Containerd vs Docker:誰才是K8s集群的最佳容器運(yùn)行時
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
什么是 K8S,如何使用 K8S
全面提升,阿里云Docker/Kubernetes(K8S) 日志解決方案與選型對比
全面提升,阿里云Docker/Kubernetes(K8S) 日志解決方案與選型對比
k8s容器運(yùn)行時演進(jìn)歷史

Docker不香嗎為什么還要用K8s
簡單說明k8s和Docker之間的關(guān)系
K8S集群服務(wù)訪問失敗怎么辦 K8S故障處理集錦

k8s是什么意思?kubeadm部署k8s集群(k8s部署)|PetaExpres
K8s多集群管理:為什么需要多集群、多集群的優(yōu)勢是什么

k8s云原生開發(fā)要求

評論