Kubernetes 與 Docker:差異解釋
了解 Docker 和 Kubernetes 容器解決方案,并發(fā)現 Kubernetes 和 Docker 之間的差異,以選擇最適合您需求的解決方案。
Kubernetes 與 Docker:差異解釋
容器化已經存在了幾十年,但近年來在應用程序開發(fā)和現代化方面越來越多地被采用。本文涵蓋兩種容器解決方案及其用途:
Docker,即容器引擎解決方案,它的容器編排解決方案Docker Compose,以及Docker Swarm,這是一個集群-容器編排解決方案。
Kubernetes 是另一種集群容器解決方案,將其與 Docker Swarm 進行比較,以幫助您選擇最符合您要求的解決方案。
什么是容器化?
容器化是應用程序級別的一種虛擬化形式。它旨在將應用程序及其所有依賴項、運行時、庫和配置文件打包在一個獨立的可執(zhí)行包中,稱為容器。操作系統(tǒng)(OS)不包含在容器中,這使得它與虛擬機(VM)不同,虛擬機(VM)在硬件級別虛擬化并包含操作系統(tǒng)。
雖然虛擬化背后的概念是在多個虛擬機之間共享物理資源,但容器在多個容器之間共享一個操作系統(tǒng)的內核。與虛擬機不同,容器是輕量級的,因為它們不包含操作系統(tǒng)。這就是容器需要幾秒鐘才能啟動的原因。此外,容器可以輕松部署在不同的操作系統(tǒng)(Windows、Linux、macOS)和不同的環(huán)境(云、VM、物理服務器)上,而無需進行任何更改。
2013 年,Docker Inc. 引入了 Docker,試圖標準化容器以在不同平臺上廣泛使用。一年后,谷歌推出了 Kubernetes 作為管理容器主機集群的解決方案。這兩個解決方案的定義將顯示Kubernetes 和 Docker 之間的區(qū)別。
什么是Docker ?
Docker 是一個開源平臺,用于在標準容器中打包和運行應用程序,這些容器可以以相同的行為跨不同的平臺運行。使用 Docker,容器化應用程序與主機隔離,這提供了將應用程序交付到運行任何操作系統(tǒng)的任何平臺的靈活性。此外,Docker 引擎管理容器并允許它們在同一主機上同時運行。
由于客戶端-服務器架構,Docker 由客戶端和服務器端組件(Docker 客戶端和 Docker 守護進程)組成??蛻舳撕褪刈o進程 (Dockerd) 可以在同一系統(tǒng)上運行,或者您可以將客戶端連接到遠程守護進程。除了管理其他 Docker 對象(容器、網絡、卷、圖像等)之外,守護進程還處理客戶端發(fā)送的 API 請求。
Docker Desktop 是 Docker 客戶端和守護進程的安裝程序,包括其他組件,如 Docker Compose、Docker CLI(命令行界面)等。它可以安裝在不同的平臺上:Windows、Linux 和 macOS。
開發(fā)人員可以將應用程序設計為在同一主機上的多個容器上運行,這就產生了同時管理多個容器的需要。為此,Docker Inc. 推出了 Docker Compose。Docker vs Docker Compose 可以概括為:Docker 可以管理一個容器,而 Compose 可以管理一臺主機上的多個容器。
Docker compose
在同一主機上管理多容器化應用程序是一項復雜且耗時的任務。Docker Compose 是用于單個主機的編排工具,它使用 Compose 文件格式管理在一個主機上定義的多容器化應用程序。
Docker Compose 通過創(chuàng)建一個定義所有容器的 YAML 配置文件,允許同時運行多個容器。Compose 允許您將應用程序拆分到多個容器中,而不是將其構建在一個容器中。您可以將應用程序拆分為稱為微服務的子服務,并在容器中運行每個微服務。然后,您可以通過 Compose 運行一條命令來啟動所有容器。
Docker swarm
開發(fā)人員可以將應用程序設計為在不同主機上的多個容器上運行,這就需要為跨不同主機的容器集群提供編排解決方案。為此,Docker Inc. 推出了 Docker Swarm。
Docker Swarm 或 Swarm 模式下的 Docker 是一個 Docker 引擎集群,可以在安裝 Docker 后啟用。Swarm 允許在不同主機上管理多個容器,不像 Compose 只允許在同一主機上管理多個容器。
什么是 Kubernetes?
Kubernetes (K8s) 是一種編排工具,用于管理一個或多個主機上的容器。K8s 將主機集群,無論它們是在本地、云端還是在混合環(huán)境中,并且可以與 Docker 和其他容器平臺集成。谷歌最初開發(fā)并引入了 Kubernetes 來自動化容器的部署和管理。K8s 提供了多種功能來支持彈性,例如容器容錯、跨主機負載平衡以及自動創(chuàng)建和刪除容器。
Kubernetes 管理一個由一臺或多臺主機組成的集群,這些主機要么是主節(jié)點,要么是工作節(jié)點。主節(jié)點包含 Kubernetes 的控制面板組件,而工作節(jié)點包含非控制面板組件(Kubelet 和 Kube-proxy)。建議至少擁有一個由四臺主機組成的集群:至少一個主節(jié)點和三個工作節(jié)點來運行您的測試。
控制面板組件(主節(jié)點)
主節(jié)點可以跨越多個節(jié)點,但只能在一臺計算機上運行。建議您避免在主節(jié)點上創(chuàng)建應用程序容器。master 負責管理集群。它響應集群事件,做出集群決策,使用容器調度操作,啟動一個新的 Pod(同一主機上的一組容器,是 Kubernetes 中的最小單元),運行控制循環(huán)等。
Apiserver 是控制面板前端,它向其他 Kubernetes 組件公開 API。它處理其他組件的訪問和身份驗證。
Etcd 是一個存儲所有集群鍵/值數據的數據庫。每個主節(jié)點都應該有一份 etcd 以確保高可用性。
Kube scheduler 負責為新創(chuàng)建的 Pod 分配一個節(jié)點。
Kube 控制管理器是一組控制器進程,它們在單個進程中運行以降低復雜性??刂破鬟M程是一個控制循環(huán),它通過 apiserver 監(jiān)視集群的共享狀態(tài)。當集群的狀態(tài)發(fā)生變化時,它會采取措施將其更改回所需的狀態(tài)??刂乒芾砥鞅O(jiān)控節(jié)點、作業(yè)、服務帳戶、令牌等的狀態(tài)。
云控制器管理器是一個可選組件,它允許集群與云提供商的 API 進行通信。它將與云交互的組件與與內部集群交互的組件分開。
節(jié)點組件(工作節(jié)點)
工作節(jié)點是非主節(jié)點。有兩個節(jié)點組件:kubelet 和 kube-proxy。除了像 Docker 這樣的容器運行時軟件之外,它們還應該在每個工作節(jié)點上運行。
Kubelet 是運行在工作節(jié)點上的代理,以確保每個容器都運行在一個 Pod 中。它管理由 Kubernetes 創(chuàng)建的容器,以確保它們在健康狀態(tài)下運行。
Kube-proxy 是運行在每個工作節(jié)點上的網絡代理,是 Kubernetes 網絡服務的一部分。它允許 Pod 與集群或外部網絡之間的通信。
其他組件
服務是在給定時間一起工作的一組邏輯 Pod。與 Pod 不同,服務的 IP 地址是固定的。這修復了刪除 Pod 時產生的問題,以便其他 Pod 或對象可以改為與該服務通信。一個服務的一組 Pod 是通過為服務分配一個策略來根據標簽過濾 Pod 來選擇的。
標簽是一對鍵/值屬性,可以分配給 Pod、服務或其他對象。標簽允許根據公共屬性查詢對象并將任務分配給選擇。每個對象可以有一個或多個標簽。一個鍵只能在一個對象中定義一次。
Kubernetes 與 Docker Swarm:哪個更好?
Kubernetes 和 Docker 是不同范圍的解決方案,可以相互補充以形成強大的組合。因此,Docker 與 Kubernetes 并不是一個正確的比較。Docker 允許開發(fā)人員將應用程序打包在隔離的容器中。開發(fā)人員可以將這些容器部署到其他機器上,而不必擔心與操作系統(tǒng)的兼容性問題。
開發(fā)者可以使用 Docker Compose 來管理一臺主機上的容器。但是 Docker Compose 與 Kubernetes 也不是一個準確的比較,因為解決方案適用于不同的范圍。Compose 的范圍僅限于一臺主機,而 Kubernetes 的范圍是針對一組主機。
當容器和主機數量變多時,開發(fā)者可以使用 Docker Swarm 或 Kubernetes 編排 Docker 容器,并在集群中進行管理。Kubernetes 和 Docker Swarm 都是集群設置中的容器編排解決方案。
Kubernetes 在大型環(huán)境中比 Swarm 使用更廣泛,因為它提供高可用性、負載平衡、調度和監(jiān)控,以提供永遠在線、可靠和健壯的解決方案。
以下幾點將突出顯示使 K8s 成為值得考慮的更健壯解決方案的差異。
安裝
Swarm 已經包含在 Docker 引擎中。使用某些 Docker CLI(命令行界面)標準命令,可以輕松啟用 Swarm。
不過,Kubernetes 部署更為復雜,因為您需要學習新的非標準命令才能安裝和使用它。此外,您還需要學習使用 Kubernetes 中使用的特定部署工具。集群節(jié)點應該在 Kubernetes 中手動配置,比如定義 master、controller、scheduler 等。
注意:Kubernetes 安裝的復雜性可以通過使用 Kubernetes 即服務 (KaaS) 來克服。各大云平臺都提供Kaas;其中包括谷歌云平臺 (GCP) 的一部分谷歌 Kubernetes 引擎 (GKE) 和亞馬遜彈性 Kubernetes 服務 (EKS)。
可擴展性
兩種解決方案都支持可擴展性。但是,使用 Swarm 更容易實現可擴展性,而使用 Kubernetes 則更靈活。
Swarm 使用簡單的 Docker API 以更簡單、更快速的方式按需擴展容器和服務。
另一方面,Kubernetes 支持自動縮放,這使得可伸縮性更加靈活。但由于它使用統(tǒng)一的 API,可擴展性更加復雜。
負載均衡
Swarm 具有內置的負載平衡功能,并使用內部網絡自動執(zhí)行。對集群的所有請求都在主機之間進行負載平衡。Swarm 使用 DNS 來負載平衡對服務名稱的請求。無需在 Swarm 中手動配置此功能。
應手動配置 Kubernetes 以支持負載平衡。您應該在 Pod 中定義負載均衡策略。因此 Pod 應該被定義為服務。Kubernetes 使用 Ingress 進行負載均衡,這是一個允許從外部網絡訪問 Kubernetes 服務的對象。
高可用性
這兩種解決方案本身都支持高可用性功能。
swarm 管理器監(jiān)視集群的狀態(tài)并采取措施修復實際狀態(tài)中的任何更改以滿足所需狀態(tài)。每當工作節(jié)點崩潰時,群管理器就會在另一個正在運行的節(jié)點上重新創(chuàng)建容器。
Kubernetes 還會自動檢測故障節(jié)點并無縫故障轉移到新節(jié)點。
監(jiān)控
Swarm 沒有內置的監(jiān)控和日志記錄工具。為此,它需要第三方工具,例如 Reimann 或 Elasticsearch,以及 Kibana (ELK)。
Kubernetes 內置了 ELK 監(jiān)控工具,可以原生監(jiān)控集群狀態(tài)。此外,還支持一些監(jiān)控工具來監(jiān)控其他對象,如節(jié)點、容器、Pod 等。
結論
Docker 是一個容器化平臺,用于在容器中獨立于操作系統(tǒng)構建和部署應用程序。它可以在 Windows、Linux 或 macOS 上使用 Docker Desktop 安裝,并包括其他解決方案,如 Compose 和 Swarm。當在同一主機上創(chuàng)建多個容器時,管理它們會變得更加復雜。在這種情況下,可以使用 Docker Compose 輕松管理同一主機上一個應用程序的多個容器。
在大型環(huán)境中,多個節(jié)點的集群成為確保高可用性和其他高級功能的需要。這就需要像 Docker Swarm 和 Kubernetes 這樣的容器編排解決方案。對比這兩個平臺的特性,可以看出兩者都支持可擴展性、高可用性和負載均衡。但是,Swarm 更易于安裝和使用,而 Kubernetes 支持自動擴展和內置監(jiān)控工具。這解釋了為什么大多數大型組織將 Kubernetes 與 Docker 用于主要分布在數百個容器中的應用程序。