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

2020-12-13 計算機java編程

對於開發人員

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

對於K8s管理員

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

是標題黨嗎

不,這是真的發生了。Docker現在在Kubernetes中已棄用?

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

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

當然,本地Docker是一個非常強大的工具,可以用來創建開發環境,但是為了了解造成這種情況的原因,您需要了解Docker在當前Kubernetes體系結構中的作用。

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上查看文檔,甚至也可以為此做出貢獻。

CRI-O

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

有趣的是,RHEL 7也開始不正式支持Docker。相反,它們為容器環境提供Podman,Buildah和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 可能並不總是最好的選擇,請酌情做出考量!

相關焦點

  • Kubernetes 將棄用 Docker
    近日,Kubernetes 官方發布公告,宣布自 v1.20 起放棄對 Docker 的支持,屆時用戶將收到 Docker 棄用警告
  • Kubernetes決定棄用Docker,到底會影響到誰?
    kubernetes 1.20 ChangeLog 中所謂要廢棄 Docker 的傳言,也是無風不起浪。換句話說,即便 Kubernetes 一直用 Docker,也不是用 Docker 的全部,多少是不一樣的。
  • 被棄用的 Docker 會被 Podman 取代嗎?
    ;Exec 探針超時處理等等(詳情可查看:https://kubernetes.io/blog/2020/12/08/kubernetes-1-20-release-announcement/)其 中,有一項更新對於開發者社區來說無疑是一枚重磅炸彈:正式宣布棄用 Docker 支持的功能。
  • Docker再體驗之Docker Compose,及它與Kubernetes的區別
    雖然Docker Swarm也是多節點管理,但基本已棄用,了解一下就好了。安裝Docker Compose接上一篇的例子,安裝Docker Compose,並進行賦權和檢驗。/local/bin/docker-composedocker-compose -v 最後能看到版本信息,就是安裝好了,有人可能會遇到一個錯誤。
  • Kubernetes竟棄用Docker?
    還沒好好的感受,Kubernetes與Docker一起使用的時候,Kubernetes已經棄用Docker了。有時候,我們都要相信,沒有什麼會永垂不朽,即使是當年一起緊密使用的Kubernetes和Docker,也最終是分道揚鑣了。那麼Docker為什麼需要Kubernetes?
  • Kubernetes ELK 日誌收集
    一般來說,這種agent用一個容器來運行,可以訪問該節點上所有應用程式容器的日誌文件所在目錄由於這種agent必須在每個節點上運行,所以需要使用DaemonSet控制器運行該應用程式。,只需要在宿主機上收集每個容器中的日誌/var/log和/var/lib/docker/containers (目錄要根據docker info中的dir進行修改)容器會將日誌轉化為JSON格式,是docker中的配置起的作用。
  • Kubernetes持續部署指南
    微服務,它暴露一些HTTP端點。最低端的機器配置和集群大小足以運行我們示例的app。我喜歡從3個節點的集群開始,但你可以只用1個節點的集群。集群準備好之後,從你的供應商中下載kubeconfig文件。有些允許你直接從其web控制臺下載,有些則需要幫助程序。我們需要此文件才能連接到集群。有了這個,我們已經可以開始了。首先要做的是fork存儲庫。在這篇文章中fork我們將使用的演示應用程式。
  • Kubernetes 1.14 二進位集群安裝
    )grub2-set-default0&& grub2-mkconfig -o /etc/grub2.cfg使用下面命令看看確認下是否啟動默認內核指向上面安裝的內核grubby --default-kernel#這裡的輸出結果應該為我們升級後的內核信息重啟加載新內核 (升級完內核順便update一下) reboot加載內核模塊首先我們要檢查是否存在所需的內核模塊
  • Kubernetes RBAC角色權限控制
    getdeletelistupdateeditwatchexec這些資源和API Group進行關聯,比如Pods屬於Core API Group,而Deployment屬於apps API Group,要在
  • Docker 的第二次死亡
    「棄用 Docker」,具體來說,是 Kubernetes 將在 1.20 版本中棄用 dockershim。它是一個橋接服務,幫助 Kubernetes 與 Docker 通信時屏蔽下層容器運行時之間的差異。 這種橋接服務帶來便利性的同時也帶來了複雜性。
  • Kind + Docker 一鍵部署K8s集群
    node-image會依次創建base-image,並加載容器中運行所需要的docker和K8S的依賴層。當前,支持兩種編譯node-image的方法。如果主機中存在K8S源,則可以使用docker或bazel來構建。如果要指定構建類型,需要使用—type參數。
  • 踢掉Docker 後,Kubernetes 還能歡快地跑 GPU?
    要想在容器裡使用 GPU,本質上就是我們要在容器裡能看到並且使用宿主機上的顯卡,所有的步驟都是圍繞這個來做的。當然,本文不會涉及如何安裝 Containerd,也不會涉及如何安裝 Kubernetes,如果這些都搞不定,建議不要往下看。
  • 中小團隊基於Docker的devops實踐
    ,通過Dockerfile打包成鏡像上傳到docker hub,然後觸發kubernetes滾動更新  鏡像包含了基礎鏡像+項目代碼,基礎鏡像就是根據項目運營環境打包的一個最小化的運行環境(不包含項目代碼),根據項目依賴的技術棧不同我們打包了很多不通類型的基礎鏡像,例如包含nginx服務的基礎鏡像,包含jdk+tomcat的基礎鏡像  如果發現程序上線出錯或有bug短時間內無法解決
  • kubernetes面試題匯總
    kubernetes是什麼?Kubernetes是什麼?kubernetes,簡稱K8s,是用8代替8個字符「ubernete」而成的縮寫。注意該圖為了強調核心概念有所簡化。這裡可以看到一個典型的Kubernetes架構圖。
  • Kubernetes學習環境難搭建?Mac筆記本上安裝一個!
    要學習Kubernetes技術,先決條件是得有一個實驗環境,雖然在之前的文章中給大家介紹過如何安裝部署一個Kubernetes
  • 雲計算核心技術Docker教程:docker Stack介紹
    docker stack和docker-compose使用方式相同,但是為什麼引入docker stack技術呢。docker stack的能力來源自docker引擎原生支持,你不需要安裝額外工具包去啟動docker 容器堆棧(docker stack 是docker swarm的一部分)。
  • 雲計算核心技術Docker教程:Docker Compose的pull和push命令詳解
    Docker-Compose pull命令可以拉取docker-compose.yml或者docker-stack.yml文件中定義的服務關聯的鏡像,Docker-Compose push命令可以將服務鏡像推送到registry/repository中。
  • K8S棄用Docker了?Docker 不能用了?別逗了!
    Docker 源於 Linux Container,可以將一臺機器的資源分成 N 份容器,做到資源的隔離,並將可運行的程序定義為標準的 docker image;Kubernetes 則可以把不同機器的每份容器進行編排、調度,組成分布式系統。
  • 三小時攻克 Kubernetes!
    現在就可以克隆這個代碼倉庫,接下來我們要做更加精彩的東西。在計算機上運行基於微服務的應用程式我們需要啟動所需的 3 個服務。讓我們從最有意思的部分——前端應用程式開始。我們可以使用 docker push 命令來推送映像:docker push $DOCKER_USER_ID/sentiment-analysis-frontend請確認映像已成功地被推送到 docker hub 代碼庫。