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