Kubernetes 要棄用docker了,咱們該怎麼辦?

對於開發人員

不用過分驚慌,Docker容器和映像仍然存在。不是說世界末日來了,實際上它不會改變一切。git

可是值得一讀背後的緣由:github

https://kubernetes.io/blog/2020/12/02/dont-panic-kubernetes-and-docker/web

https://kubernetes.io/blog/2020/12/02/dockershim-faq/docker


對於K8s管理員

仔細閱讀並開始考慮Docker替代方案json


是標題黨嗎

不,這是真的發生了。Docker如今在Kubernetes中已棄用。安全


參考

https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.20.md#deprecation微信


kubelet中的Docker支持現已棄用,並將在之後的版本中刪除。Kubelet使用一個名爲「 dockershim」的模塊,該模塊實現了對Docker的CRI支持,而且在Kubernetes社區中看到了維護問題。咱們鼓勵您評估在可用的容器運行時,它是CRI的完整實現(兼容v1alpha1或v1)。網絡


簡而言之,這意味着Docker不支持稱爲CRI(容器運行時接口)的Kubernetes運行時API,而且Kubernetes人們一直在使用名爲「 dockershim」的橋接服務。它轉換了Docker API和CRI,但在一些次要版本中將再也不從Kubernetes方面提供它。架構


固然,本地Docker是一個很是強大的工具,能夠用來建立開發環境,可是爲了瞭解形成這種狀況的緣由,您須要瞭解Docker在當前Kubernetes體系結構中的做用。app


Kubernetes是一種基礎架構工具,可對許多不一樣的計算資源(例如虛擬/物理機)進行分組,使它看起來像是巨大的計算資源,可以讓您的應用程序運行並與他人共享。在這種架構中,Docker(或容器運行時)僅用於經過Kubernetes控制平面進行調度,從而在實際主機中運行這些應用程序。


看一下架構圖。您能夠看到每一個Kubernetes節點都與控制平面通訊。kubelet在每一個節點上獲取元數據,並執行CRI以在該節點上運行建立/刪除容器。


可是爲何再也不使用Docker?

一樣,Kubernetes僅使用CRI進行內部通訊,而與Docker通訊則須要橋接服務。這就是緣由一。


爲了解釋下一個緣由,咱們必須稍微瞭解一下Docker架構。這是Docker的架構圖。


是的,Kubernetes實際上須要在紅色區域內運行,可是Kubernetes不使用Docker Network和Volume。


若是一個東西擁有不少用戶不用的功能,這自己可能會帶來安全隱患。您擁有的功能越少,攻擊面就越小。


所以,這是後面社區提出來考慮替代方案的地方,稱爲CRI運行時。


CRI運行時

有兩種主要的CRI運行時實現。


containerd

若是您只想從Docker遷移,這是最好的選擇,由於容器其實是在Docker內部使用的,能夠完成全部「運行時」工做,如上圖所示。他們提供了CRI,這也是Docker提供的100%。


containerd是100%開放源代碼,所以您能夠在GitHub上查看文檔,甚至也能夠爲此作出貢獻。

https://github.com/containerd/containerd/


CRI-O

CRI-O是主要由Red Hat員工開發的CRI運行時。實際上,此運行時如今已在Red Hat OpenShift中使用。是的,他們再也不依賴Docker。


有趣的是,RHEL 7也開始不正式支持Docker。相反,它們爲容器環境提供Podman,Buildah和CRI-O。

https://github.com/cri-o/cri-o


我認爲CRI-O的優點在於它的極簡風格,由於它被建立爲「 CRI」運行時。儘管容器化做爲Docker的一部分試圖變得更加開源,但它們是純CRI運行時,所以CRI-O沒有CRI不須要的任何內容。


從Docker遷移到CRI-O可能會更具挑戰性,由於它仍然能夠提供在Kubernetes上運行應用程序所需的功能。


還有一件事...

當咱們談論容器運行時時,咱們須要注意您在談論哪一種類型的運行時。咱們確實有兩種類型的運行時;CRI運行時和OCI運行時。


CRI運行時

正如我所描述的,CRI是Kubernetes提供的API,用於與容器運行時進行對話,以建立/刪除容器化的應用程序。


它們經過IPC在gRPC中做爲kubelet進行通訊,而且運行時在同一主機上運行,而且CRI運行時負責從kubelet獲取請求並執行OCI容器運行時以運行容器。等一下 也許我應該用一張圖表來解釋。

所以,CRI運行時將執行如下操做

  • 從kubelet獲取gRPC請求

  • 按照規範建立OCI json配置


OCI運行時

OCI運行時負責使用Linux內核系統調用(例如cgroups和命名空間)生成容器。您可能據說過runc或gVisor。


附錄1:runC如何工做

CRI經過調用Linux系統調用執行二進制文件後,runC生成容器。這代表runC依賴Linux計算機上運行的內核。


這也意味着,若是您發現runC的漏洞得到了主機的root特權,那麼容器化的應用程序也能夠這樣作。一個厲害的黑客可能會使您的主機完全報廢!事情確定會變糟。這就是爲何您也應該不斷更新Docker(或任何其餘容器運行時)的緣由之一,而不只僅是容器化的應用程序。


附錄2:gVisor的工做方式


gVisor最初由Google員工建立的OCI運行時。它實際上在其基礎結構上運行,以運行其雲服務,例如Google Cloud Run,Google App Engine(第二代)和Google Cloud Functions(甚至更多!)。


這裏有趣的是gVisor具備「guest 內核」層,這意味着容器化的應用程序沒法直接接觸主機內核層。即便他們認爲這樣作,也只能接觸gVisor的guest內核。


gVisor的安全模型實際上很是有趣,值得閱讀官方文檔,與runC的顯着區別以下。

  • 性能較差

  • Linux內核層不是100%兼容的

    • 查看官方文檔的兼容性部分

  • 默認不支持


總結

  • Docker 確被棄用,你們應該開始考慮使用 CRI 運行時,例如 containerd 與 CRI-O。

    • containerd 與 Docker 相兼容,兩者共享相同的核心組件。

    • 若是您主要使用 Kubernetes 的最低功能選項,CRI-O 可能更爲適合。

  • 明確理解 CRI 運行時與 OCI 運行時之間的功能與做用範圍差別。


根據您的實際工做負載與業務需求,runC 可能並不老是最好的選擇,請酌情作出考量!

原文連接:

https://dev.to/inductor/wait-docker-is-deprecated-in-kubernetes-now-what-do-i-do-e4m


最後,你們若是想加羣和各路大拿交流,能夠識別下面的二維碼加入:


後臺回覆「加羣」,帶你進入高手如雲交流羣


推薦閱讀:

QUIC也不是萬能的

MPLS基礎和工做原理,看這一篇就夠了!

2020 最好的Linux網絡監控工具

超詳乾貨!Linux環境變量配置全攻略

爲何要選擇智能網卡?

60,000毫秒內對Linux進行性能診斷

爲何Linux須要Swapping

Linux系統經常使用命令速查手冊

一文讀懂容器網絡發展

一文搞懂CDN加速原理

Linux used 內存到底哪裏去了?

免費下載!《阿里工程師的自我修養》

阿里雲深刻淺出K8s與CDN排坑指南免費領取

8 個問題完全搞透 DNS 協議

三張圖完全搞懂iptables和netfilter

故障排查:K8s中Pod沒法正常解析域名

網絡排錯大講解~

OVS 和 OVS-DPDK 對比

微軟出品的最新K8S學習指南3.0下載



喜歡,就給我一個「在看」



10T 技術資源大放送!包括但不限於:雲計算、虛擬化、微服務、大數據、網絡、Linux、Docker、Kubernetes、Python、Go、C/C++、Shell、PPT 等。在公衆號內回覆「1024,便可免費獲取!!

本文分享自微信公衆號 - Linux雲計算網絡(cloud_dev)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索