從Docker到Kubernetes

Docker 發(fā)展歷程

2013 年圾叼,隨著PaaS發(fā)展壯大,這個領(lǐng)域的從業(yè)者們發(fā)現(xiàn)了 PaaS 中最為棘手也最亟待解決的一個問題:究竟如何給應(yīng)用打包转绷?無論是 Cloud Foundry撞蚕、OpenShift蛙粘,還是 Clodify随闽,面對這個問題都沒能給出一個完美的答案父丰。一個并不引人矚目的 PaaS 創(chuàng)業(yè)公司 dotCloud,卻選擇了開源自家的一個容器項目 Docker橱脸,正好提供了一種非常便利的打包機制,然后就一發(fā)不可收拾分苇,圍繞著 Docker 項目進(jìn)行集成與創(chuàng)新涌現(xiàn)出來添诉,包括Mesosphere公司的Mesos項目等等,Docker 公司也順勢推出了Docker Compose医寿、Swarm 和 Machine“三件套”栏赴,docker生態(tài)圈很快發(fā)展起來了,開啟了一個新的容器時代靖秩。

2014年6月须眷,谷歌公司正式宣告了Kubernetes項目的誕生。這個時候容器出現(xiàn)多樣化沟突,包括google公司lmctfy容器花颗,coreos的rkt容器。Google公司提出和Docker合作惠拭,與Docker公司共同推進(jìn)一個中立的容器運行時庫作為Docker項目的核心依賴扩劝。此時Docker并不擔(dān)心,因為它維護的 Docker 社區(qū)也足夠龐大职辅,Docker項目已是容器生態(tài)的標(biāo)準(zhǔn)棒呛。于是,2015 年 6 月 22 日域携,由 Docker 公司牽頭簇秒,CoreOS、Google秀鞭、RedHat 等公司共同宣布趋观,Docker 公司將 Libcontainer 捐出,并改名為 RunC 項目锋边,交由一個完全中立的基金會管理拆内,然后以 RunC 為依據(jù),大家共同制定一套容器和鏡像的標(biāo)準(zhǔn)和規(guī)范宠默,這就是OCI麸恍。明顯OCI的成立容器玩家們出于自身利益進(jìn)行干涉的一個妥協(xié)結(jié)果,所以盡管Docker 是 OCI 的發(fā)起者和創(chuàng)始成員,但并沒有很積極的去推動抹沪,Docker注重是它商業(yè)價值刻肄。

2015年12月11日,Google融欧、RedHat 等開源基礎(chǔ)設(shè)施領(lǐng)域玩家們敏弃,共同牽頭發(fā)起了一個名為 CNCF(Cloud Native Computing Foundation)的基金,主要是以kubernetes項目為基礎(chǔ)打造一個平臺級生態(tài)噪馏。由于Kubernates項目煥然一新的設(shè)計理念和號召力麦到,2016年以后kubernates社區(qū)得到了空前的發(fā)展。

2016年6月欠肾,Docker v.1.12發(fā)布瓶颠,直接內(nèi)置Docker Swarm(多主機多容器的編排解決方案)
2016年12月, Kubernetes 發(fā)布 CRI (Container Runtime Interface刺桃, 容器運行時接口)

2017年粹淋,Docker 分拆了 Containerd,支持CNI瑟慈,將這個組件分解為一個單獨的項目桃移,使得 Docker 將容器的管理功能移出 Docker 引擎,并移入一個單獨的守護進(jìn)程中葛碧,即 Containerd借杰,并將其捐贈給了CNCF社區(qū)。同時Docker公司宣布將Docker項目改名為Moby进泼,交給社區(qū)自行維護第步。

2017年10月,Docker公司將自己的主打產(chǎn)品Docker EE 內(nèi)置Kubernetes項目缘琅,預(yù)示著Kubernetes的勝出粘都,成為容器編排的標(biāo)準(zhǔn)。

2017年11月 刷袍,K8s支持containerd
2018年 k8s集成containerd翩隧,正式GA,把CRI plugin嵌入 containerd中
2019年 rkt 終止使命被CNCF歸檔
2019 年 Mirantis 收購 Docker 的企業(yè)服務(wù)

OCI

OCI 代表開放容器標(biāo)準(zhǔn)呻纹, 它標(biāo)準(zhǔn)化了容器工具和底層實現(xiàn)(technologies)之間的大量接口堆生。 他們維護了打包容器鏡像(OCI image-spec)和運行容器(OCI runtime-spec)的標(biāo)準(zhǔn)規(guī)范。 他們還以 runc 的形式維護了一個 runtime-spec 的真實實現(xiàn)雷酪, 這也是 containerdCRI-O 依賴的默認(rèn)運行時淑仆。 CRI 建立在這些底層規(guī)范之上,為管理容器提供端到端的標(biāo)準(zhǔn)

CRI

全稱Container Runtime Interface哥力,(容器運行時接口)是一個用來擴展容器運行時的接口蔗怠,能讓 kubelet 無需重新編譯就可以廣泛使用各種容器運行時的插件接口墩弯。CRI 由 protocol buffersgRPC API 還有 streaming 庫構(gòu)成。用戶不需要關(guān)心內(nèi)部通信邏輯寞射,而只需要實現(xiàn)定義的接口就可以渔工,包括 RuntimeService 和 ImageService。

容器就是Docker?

其實準(zhǔn)確來講桥温,Docker和容器不是一回事引矩,但Docker普及了Linux容器這種技術(shù)模式,并在開發(fā)底層技術(shù)方面發(fā)揮了重要作用侵浸。 容器的生態(tài)相比于單純的 Docker旺韭,已經(jīng)進(jìn)化到了一個更寬廣的領(lǐng)域

棄用Docker

2020年 Kubernates 宣布移除dockershim,現(xiàn)在1.20版本以后掏觉,能使用但是kubelet會打印警告日志区端。最新消息dockershim 計劃在 Kubernetes 1.24 版被移除, 請參閱移除 Kubernetes 增強方案 Dockershim

CRI發(fā)展

容器運行時

主流的容器運行時有 containerd履腋,docker engine珊燎,cri-o惭嚣,Mirantis Container Runtime(商業(yè)版)

CRI 維護者 主要特性 容器引擎 描述
dockershim Kubernetes 內(nèi)置實現(xiàn)遵湖、特性最新 Docker 后面被廢棄了
cri-o cri-o OCI 標(biāo)準(zhǔn)不需要 Docker OCI(runc、kata晚吞、gVisor…)
cri-containerd Containerd OCI 標(biāo)準(zhǔn)不需要 Docker OCI(runc延旧、kata、gVisor…) 主流的槽地,使用最廣泛
cri-dockerd Mirantis 內(nèi)置實現(xiàn) Docker EE 商業(yè)版迁沫,前身是Docker EE

Containerd

Containerd是一個工業(yè)標(biāo)準(zhǔn)的容器運行時,它強調(diào)簡單性捌蚊、健壯性和可移植性集畅。它可以在宿主機中管理完整的容器生命周期:容器鏡像的傳輸和存儲、容器的執(zhí)行和管理缅糟、存儲和網(wǎng)絡(luò)等挺智,是目前適用最廣泛。

安裝

yum install containerd.io #使用yum 直接安裝
# 也可以直接從 github 下載 containerd 包窗宦,然后解壓
# 網(wǎng)址:https://github.com/containerd/containerd/releases

#查看版本
containerd -v 
#查看幫助命令
containerd -h

配置

Containerd 的配置文件默認(rèn)為 /etc/containerd/config.toml[^ssh-copy-id]

containerd config default > /etc/containerd/config.toml #生成配置文件
#配置cgroup driver 為 systemd

[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
  ...
  [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
    SystemdCgroup = true
#配置鏡像倉庫
[plugins."io.containerd.grpc.v1.cri".registry]
     [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
           endpoint = ["https://registry-1.docker.io"]
     [plugins."io.containerd.grpc.v1.cri".registry.configs]
        [plugins."io.containerd.grpc.v1.cri".registry.configs."docker.io".tls]
           insecure_skip_verify = true
         [plugins."io.containerd.grpc.v1.cri".registry.configs."docker.io".auth]
           username = "xxxx"
           password = "xxxx"

#把docker.io 換成內(nèi)部鏡像倉庫

每一個頂級配置塊的命名都是 plugins."io.containerd.xxx.vx.xxx" 這種形式赦颇,表示一個插件,其中 io.containerd.xxx.vx 表示插件的類型赴涵,vx 后面的 xxx 表示插件的 ID媒怯,我們可以通過 ctr plugin ls 查看插件列表

#設(shè)置開啟啟動
systemctl enable cotnainerd
#啟動
systemctl start containerd
#查看狀態(tài)
systemctl status containerd

存儲

containerd 將容器相關(guān)的數(shù)據(jù)持久化在 /var/lib/containerd/中(docker 默認(rèn)在 /var/lib/docker/)

如何使用

containerd 提供ctr CLI。
containerd 相比docker, 多了namespace概念, 每個image和container 都會在各自的namespace下可見, 目前k8s會使用k8s.io 作為命名空間髓窜。

命名空間管里

ctr ns ls #查看命名空間列表扇苞,ctr ns -h 查看管理命名空間的相關(guān)命令
export CONTAINERD_NAMESPACE=k8s.io #修改默認(rèn)命名空間

鏡像管理

不支持build,commit 鏡像

ctr i ls #查看鏡像列表,ctr i -h查看管理鏡像的相關(guān)命令
#拉取鏡像
ctr -n k8s.io i pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2 # 
#鏡像標(biāo)記tag
ctr -n k8s.io i tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2 k8s.gcr.io/pause:3.2 # tag鏡像

#鏡像導(dǎo)入
ctr -n k8s.io i import kube-apiserver.tar #從tar 文件導(dǎo)入鏡像杨拐,tar可以由docker save 
#鏡像導(dǎo)出
ctr -n k8s.io i export pause.tar k8s.gcr.io/pause:3.2 # 

#鏡像推送
ctr -n k8s.io i push -k k8s.gcr.io/pause:3.2

容器管理

容器時依賴task祈餐,task 管理容器,刪除容器哄陶,得先終止task

ctr c ls # 查看容器列表帆阳, ctr c -h 查看管理容器 的相關(guān)命令

#運行容器
ctr  run -d nginx:1.21 nginx1 #運行容器,有下面兩步組成
#創(chuàng)建容器
ctr c create nginx:1.21 nginx1
#創(chuàng)建任務(wù)指定容器
ctr task start -d nginx1

#進(jìn)入容器
ctr task exec --exec-id $RANDOM -t nginx1 sh #相當(dāng)于docker exec

#刪除容器
ctr task kill nginx1 #終止任務(wù) 相當(dāng)于 docker stop
ctr c rm nginx1 #刪除容器 相當(dāng)于 docker rm

#容器暫停/繼續(xù)
ctr task pause nginx1 #暫停任務(wù)  相當(dāng)于docker pause
ctr task resume nginx1 #恢復(fù)任務(wù) 

#日志查看
ctr event nginx1

#復(fù)制容器文件
ctr  snapshot mounts /usr/share/nginx/html

CRI Tools

CRI Tools是社區(qū)針對 CRI 接口開發(fā)的CLI及驗證工具屋吨。

它包括兩個工具:crictl 和 critest蜒谤。crictl 是一個容器運行時命令行接口,適用所有CRI兼容的容器運行時至扰,與Docker cli類似功能鳍徽,但是docker cli只適用于Docker運行時。由于Kubernetes 是支持所有CRI兼容的容器運行時敢课,所以推薦crictl用于 Kubernetes 節(jié)點上 pod阶祭、容器以及鏡像的除錯工具。

#查看命令詳細(xì)幫助
crictl -h 
vim /etc/crictl.yaml #編輯文件直秆,修改默認(rèn)配置
runtime-endpoint: unix:///var/run/containerd/containerd.sock
image-endpoint: unix:///var/run/containerd/containerd.sock
timeout: 10
debug: true

針對pod操作如下:

#打印所有pod清單
crictl pods

#根據(jù)標(biāo)簽打印pod
crictl pods --label run=nginx

#詳細(xì)幫助命令
crictl pods -h

critest 則是一個容器運行時的驗證測試工具濒募,用于驗證容器運行時是否符合 Kubelet CRI 的要求。除了驗證測試圾结,critest 還提供了 CRI 接口的性能測試瑰剃,比如 critest -benchmark

常用命令對比

crictl(kubernetes) ctr(containerd) docker 說明
crictl ps ctr task ls/ctr container ls docker ps 查看運行容器
crictl exec ctr task exec --exec-id docker exec 進(jìn)入容器
crictl images ctr i ls docker images 查看鏡像
crictl logs docker logs 查看日志
crictl inspect/inspecti ctr container info docker inspect 查看容器/鏡像信息
crictl stats docker stats 查看容器資源
crictl start/stop ctr task start/kill docker start/stop 啟動/關(guān)閉已有的容器
ctr image tag docker tag 修改鏡像標(biāo)簽
ctr image import/export docker load/save 鏡像導(dǎo)入導(dǎo)出
crictl pull ctr image pull docker pull 拉取鏡像
ctr image push docker push 推送鏡像

crictl 命令行工具基本與docker 命令行工具保持一致,只是docker關(guān)鍵換成crictl筝野,對于之前使用docker的人員來說晌姚,可以說是無縫切換

運行時Docker切成Containerd

  • 先隔離要切換的docker節(jié)點,置成不可以調(diào)度狀態(tài)(unschedulable )
kubectl cordon test1
  • .再驅(qū)逐節(jié)點上pod歇竟,保留DaemonSet控制管理的pod,因為這些pods不用驅(qū)逐到其它節(jié)點挥唠。
kubectl drain test1 --ignore-daemonsets
  • 切換containerd
    停止kubelet和docker
systemctl stop kubelet
systemctl stop docker
systemctl stop containerd

根據(jù)上文內(nèi)容知道Docker也是依賴Containerd,因此安裝Docker同時也安裝Containerd焕议,那么切Containerd就可以不用再安裝宝磨,當(dāng)然你也可以將 Docker 和 containerd 完全卸載掉,然后重新安裝号坡。

Containerd 中默認(rèn)已經(jīng)實現(xiàn)了 CRI懊烤,但是是以 plugin 的形式配置的,之前 Docker 中自帶的 containerd 默認(rèn)是將 CRI 這個插件禁用掉了的(使用配置 disabled_plugins = ["cri"])宽堆,所以這里我們重新生成默認(rèn)的配置文件來覆蓋掉, 具體查看上面Containerd 配置

接下來配置kubelet腌紧,修改/etc/sysconfig/kubelet,container-runtime指定容器運行時畜隶,默認(rèn)值是docker壁肋, --container-runtime-endpoint指定運行時套接字地址号胚,containerd套接字unix:///run/containerd/containerd.sock

KUBELET_EXTRA_ARGS="--container-runtime=remote --container-runtime-endpoint=unix:///run/containerd/containerd.sock"

配置完成后啟動containerd和kubelet

systemctl daemon-reload
systemctl start containerd
systemctl start kubelet

重啟完成后查看節(jié)點狀態(tài)

kubectl get node -o wide
image.png
  • 節(jié)點恢復(fù)使用
kubectl uncordon test1

節(jié)點要維護端盆, 比如我們需要變更節(jié)點配置襟铭、升級內(nèi)核等操作的時候都可以先將節(jié)點進(jìn)行驅(qū)逐禀崖,然后再進(jìn)行維護曹傀,再恢復(fù)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市端辱,隨后出現(xiàn)的幾起案子癌蓖,更是在濱河造成了極大的恐慌入桂,老刑警劉巖髓帽,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件菠赚,死亡現(xiàn)場離奇詭異,居然都是意外死亡郑藏,警方通過查閱死者的電腦和手機衡查,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來必盖,“玉大人拌牲,你說我怎么就攤上這事「柚啵” “怎么了塌忽?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長阁吝。 經(jīng)常有香客問我砚婆,道長械拍,這世上最難降的妖魔是什么突勇? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮坷虑,結(jié)果婚禮上甲馋,老公的妹妹穿的比我還像新娘。我一直安慰自己迄损,他們只是感情好定躏,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著芹敌,像睡著了一般痊远。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上氏捞,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天碧聪,我揣著相機與錄音,去河邊找鬼液茎。 笑死逞姿,一個胖子當(dāng)著我的面吹牛辞嗡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播滞造,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼续室,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了谒养?” 一聲冷哼從身側(cè)響起挺狰,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎买窟,沒想到半個月后她渴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡蔑祟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年趁耗,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疆虚。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡苛败,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出径簿,到底是詐尸還是另有隱情罢屈,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布篇亭,位于F島的核電站缠捌,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏译蒂。R本人自食惡果不足惜曼月,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望柔昼。 院中可真熱鬧哑芹,春花似錦、人聲如沸捕透。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽乙嘀。三九已至末购,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間虎谢,已是汗流浹背盟榴。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留嘉冒,地道東北人曹货。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓咆繁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親顶籽。 傳聞我的和親對象是個殘疾皇子玩般,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容