標題:等等,Docker 現在在 Kubernetes 中已被棄用?我該怎麼辦?
發表:真實
描述:本文解釋了為什麼 Docker 現在在 Kubernetes 中已棄用。
標籤: Docker、 Kubernetes
封面圖:https://dev-to-uploads.s3.amazonaws.com/i/mwclzdxtfgighjrwdpfa.jpeg
不要驚慌,Docker 容器和映像仍然存在。這並不是說它會改變一切。
還值得一讀:
https://kubernetes.io/blog/2020/12/02/dont-panic-kubernetes-and-docker/
https://kubernetes.io/blog/2020/12/02/dockershim-faq/
仔細閱讀本文並開始考慮 Docker 替代方案
是的,它是真實的。 Docker 現已在 Kubernetes 中棄用。
參考號https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.20.md#deprecation
kubelet 中的 Docker 支援現已棄用,並將在未來版本中刪除。 kubelet 使用一個名為「dockershim」的模組,該模組實現了對 Docker 的 CRI 支持,並且在 Kubernetes 社群中發現了維護問題。我們鼓勵您在 CRI 可用時評估是否遷移到成熟的 CRI 實作(v1alpha1 或 v1 相容)。
簡而言之,這裡的意思是 Docker 不支援稱為 CRI(Container Runtime Interface)的 Kubernetes Runtime API,而 Kubernetes 人們一直在使用稱為「dockershim」的橋接服務。它轉換了 Docker API 和 CRI,但在幾個小版本中將不再從 Kubernetes 端提供。
本地 Docker 無疑是建立開發環境的一個非常強大的工具,但為了了解造成這種情況的原因,您需要了解 Docker 在目前 Kubernetes 架構中做了什麼。
Kubernetes 是一種基礎架構編排工具,它將許多不同的運算資源(例如虛擬機器/實體機)組合在一起,使其看起來像一個巨大的運算資源,供您的應用程式執行並與其他人共享。在此架構中,Docker(或容器執行時)僅用於透過 Kubernetes 控制平面調度在實際主機中執行這些應用程式。
看一下架構圖。您可以看到每個 Kubernetes 節點都與控制平面進行通訊。每個節點上的kubelet
取得元資料,並執行 CRI 在節點上執行建立/刪除容器。
同樣,Kubernetes 只在 CRI 中進行通信,而與 Docker 通信需要橋接服務。這就是原因1。
為了解釋下一個原因,我們必須稍微了解 Docker 架構。這是圖表。
所以是的,Kubernetes 實際上需要在紅色區域內。 Kubernetes 中不使用 Docker Network 和 Volume。
擁有更多功能但您從未使用過,這本身就可能存在安全風險。擁有的功能越少,攻擊面就越小。
所以這就是你開始考慮替代方案的地方。它稱為 CRI 執行時。
有兩種主要的 CRI 執行時實作。
如果您只想從 Docker 遷移,這是最好的選擇,因為容器實際上在 Docker 內部使用來完成所有「執行時間」作業,如上圖所示。他們提供 CRI,而且 Docker 也提供 100% 的服務。
containerd 是 100% 開源的,因此您可以在 GitHub 上查看文件,甚至也可以為其做出貢獻。
https://github.com/containerd/containerd/
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」執行時。雖然 containerd 最初是作為 Docker 的一部分嘗試變得更加開源,但它們是純 CRI 執行時,因此 CRI-O 沒有 CRI 不需要的任何內容。
從 Docker 遷移到 CRI-O 可能更具挑戰性,因為它仍然提供在 Kubernetes 上執行應用程式所需的功能。
當我們談論容器執行時,我們需要小心您談論的是哪種類型的執行時。我們確實有兩種類型的執行時; CRI 執行時和 OCI 執行時。
正如我所描述的,CRI 是 Kubernetes 提供的 API,用於與容器執行時通信,以便建立/刪除容器化應用程式。
它們透過 IPC 作為 kubelet 在 gRPC 中進行通信,執行時執行在同一主機上,CRI 執行時負責從 kubelet 獲取請求並執行 OCI 容器執行時來執行容器。等等,什麼?也許我應該用一張圖表來解釋這一點。
那麼 CRI 運作時的作用如下
從 kubelet 取得 gRPC 請求
依照規格建立 OCI json 配置
OCI 執行時負責使用 Linux 核心系統呼叫(例如 cgroup 和命名空間)產生容器。您可能聽過runc
或gVisor
。他們就是這樣。
在 CRI 透過呼叫 Linux 系統呼叫執行二進位檔案後,runC 產生容器。這表明 runC依賴Linux 電腦上執行的核心。
它還意味著,如果您發現 runC 的漏洞使您獲得主機的 root 權限,那麼容器化應用程式也可以這樣做。一個糟糕的黑客可能會奪走您主機的根並繁榮!事情肯定會變得很糟。這就是為什麼您也應該不斷更新 Docker(或任何其他容器執行時)而不僅僅是容器化應用程式的原因之一。
gVisor 是 OCI 執行時,最初由 Google 人員建立。它實際上在他們的基礎設施上執行來執行他們的雲端服務,例如 Google Cloud Run、Google App Engine(第二代)和 Google Cloud Functions(甚至更多!)
有趣的是,gVisor 有一個「來賓核心」層,這意味著容器化應用程式無法直接接觸主機核心層。即使他們認為他們這樣做了,他們也只觸及 gVisor 的客戶核心。
gVisor的安全模型其實非常有趣,值得閱讀官方文件。
與 runC 的顯著差異如下。
性能更差
Linux 核心層並非 100% 相容
預設不支援
A。 Containerd 與 Docker 相容,核心元件相同。
b.如果您希望 Kubernetes 擁有更多最小功能,CRI-O 可能是個強大的選擇
根據您的工作負載,runC 可能並不總是最好的選擇!
原文出處:https://dev.to/inductor/wait-docker-is-deprecated-in-kubernetes-now-what-do-i-do-e4m