Kubernetes,通常縮寫為 K8s,是領先的容器編排工具。該開源項目最初由 Google 開發,幫助塑造了現代編排的定義。該系統包括了部署和運行容器化系統所需的一切。
社區供應商基于 Kubernetes 創建了適用于不同用例的獨立發行版。K3s[1]是由 Rancher 創建的一種 kubernetes 流行發行版,現在作為云原生計算基金會[2](CNCF)的一部分進行維護。
K3s 的目標是成為一個輕量級的 Kubernetes 版本,適合在資源受限的硬件上使用,例如 IoT 設備。它還易于設置和使用,因此非常適合用于本地開發集群。它專注于邊緣部署,但并不排除對大規模云部署的支持:K3s 的 CNCF 認證意味著它提供了所有 Kubernetes 功能,并且可以用于生產環境。
在本文中,你將了解 K3s 與 Kubernetes 項目提供的官方發行版之間的比較,包括它們的區別、何時使用它們以及掌握它們的容易程度。
什么是 K8s
Kubernetes 是一個開源的容器編排引擎,用來對容器化應用進行自動化部署、 擴縮和管理。該項目托管在 CNCF。
Kubernetes 提供了部署容器并在多個主機上進行擴展的所有所需工具。Kubernetes 集群中的每臺主機被稱為一個節點,節點由 Kubernetes 控制平面管理。它會將你的容器調度到空閑節點上,管理網絡和存儲并提供與之交互的 API。
什么是 K3s
K3s 是由 Rancher 主導開發的 Kubernetes 發行版。它在不分叉的基礎上構建了上游項目。概念上,Kubernetes 發行版類似于 Linux 操作系統:K3s 是一種 Kubernetes 發行版,就像 Ubuntu 是一種 Linux 發行版一樣。K3s 在保留 Kubernetes 功能的基礎上,還增加了自己的功能。
K3s 經過專門設計,即使在最小的硬件環境中也能良好運行。K3s 提供了一個小于 60MB 的單個二進制文件。這個輕量級可執行文件包含了啟動完全功能的 Kubernetes 集群所需的一切。
通過放棄非必要的 Kubernetes 功能(如云服務提供商集成和非 CSI[3]存儲提供商),實現了這個小巧的二進制文件大小。利用 Go 語言的goroutines[4],將各個 Kubernetes 組件從單個入口點運行起來。
K3s 和 K8s 易于部署
通常情況下,相比 K8s,K3s 更容易部署和維護。輕量級的二進制文件讓你可以用一個命令啟動所有的 Kubernetes 控制平面組件。而要啟動官方的 Kubernetes 集群則需要更多的時間和步驟,并且可能更難維護。
部署 K3s
以下命令可以啟動并運行一個 K3s 集群:
$curl-sFLhttps://get.k3s.io|sh-
官方的安裝腳本會下載二進制文件并注冊一個系統服務,該系統服務會在進程終止或主機重新啟動時自動啟動 K3s。它還配置了 Kubernetes 實用工具,包括 kubectl CLI。在新的機器上運行腳本后,你應該能夠在幾秒鐘內與你的集群進行交互:
$kubectlrunnginx--image=nginx pod/nginxcreated
你可以通過在其他節點上運行以下命令,輕松地將節點加入到你的 K3s 集群中:
$sudok3sagent--serverhttps://:6443 --token
你可以通過從運行 K3s 控制平面的機器上讀取/var/lib/rancher/k3s/server/node-token文件來獲取
K3s 還可以通過 Rancher 開發的k3d[5]部署。k3d 將 K3s 封裝在 docker 容器內并運行。K3d 允許你在單個主機上運行多個 K3s 集群,并使用熟悉的 Docker 工具進行管理。你可以使用以下命令安裝 k3d:
$curl-shttps://raw.githubusercontent.com/k3d-io/k3d/main/install.sh| TAG=v5.4.5bash
然后創建你的第一個集群:
$k3dcreateclusterdemo-cluster
現在你可以使用 kubectl 來向 k3d/K3s 集群添加對象:
$kubectlrunnginx–imagenginx:latest pod/nginxcreated
部署 K8s
K8s 的部署過程比較復雜。Kubernetes 項目提供了各個組件的下載,比如:API server、controller manager 和 scheduler。你需要成功部署每個組件來創建你的控制平面。然后,你還需要在每個工作節點上安裝 kubelet。
通過 kubeadm 工具,可以簡化 Kubernetes 安裝。在使用 kubeadm 之前,你需要安裝一個容器運行時,比如containerd[6]。然后,你可以運行以下命令在你的主機上初始化 Kubernetes 控制平面:
$kubeadminit
初始化完成后,系統會告訴你運行下一步需要做什么:
$mkdir-p$HOME/.kube $sudocp-i/etc/kubernetes/admin.conf$HOME/.kube/config $sudochown$(id-u):$(id-g)$HOME/.kube/config
然后,你需要手動選擇并安裝一個 Pod 網絡插件,這樣你的 Pod 才能相互通信。Flannel 是一個受歡迎的選項:
$kubectlapply-fhttps://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yaml
經過所有這些步驟,你就可以向集群中添加節點了:
kubeadmjoin--token: --discovery-token-ca-cert-hashsha256:
opensslx509-pubkey-in/etc/kubernetes/pki/ca.crt|opensslrsa-pubin -outformder2>/dev/null|openssldgst-sha256-hex|sed's/^.*//'
使用 kubeadm 啟動本地 Kubernetes 集群比使用 K3s 要復雜得多。K3s 抽象了集群設置步驟,使得快速啟動和運行變得更加簡單。在本地使用 K8s 需要額外的時間和精力來學習安裝過程并配置環境。
K3s 和 K8s 之間的主要區別
K8s 和 K3s 對用戶提供了相同的功能接口。如果你有一個 Kubernetes YAML 清單,你可以在兩個集群中使用任何一個進行部署,而無需進行修改。
這兩個發行版的區別在于它們的打包方式和包含的組件。以下是一些你應該考慮的關鍵特點:
默認安裝的組件
K8s 和 K3s 打包了不同的組件來實現 Kubernetes 的架構。其中最大的變化之一就是控制平面使用的數據存儲:上游 Kubernetes 使用 etcd,而 K3s 選擇使用內置的 SQLite 數據庫。這通常提高了性能并減小了二進制文件的大小,但可能不適用于大規模集群。如果需要,K3s 也可以連接到外部的 etcd 或使用 K3s 內置的 etcd 數據存儲,以及其他基于 SQL 的數據庫,如 MySQL 和 PostgreSQL。
標準的 Kubernetes 發行版只包括控制平面所需的組件。K3s 還內置了常用的生態工具,比如:kubectl。
K3s 集成了 Helm 支持[7],可以通過將 Helm Chart 表示為集群中的HelmChart對象來部署 Helm Chart。然而,上游 Kubernetes 不理解 Helm;你需要單獨安裝 Helm CLI 并使用其命令來安裝你的 Chart。
K8s 和 K3s 都使用 containerd 作為默認的容器運行時,但這可以進行定制。K3s 還包含了其他幾個來自社區的組件,包括用于 Pod 網絡的 flannel 以及作為入口控制器和內置負載均衡器的 Traefik。Kubernetes 讓你自己選擇和安裝這些工具,而 K3s 則內置了我們常用的工具。
當你不想花太多的時間成本去學習 K8s 各個組件作用時,K3s 是更好的選擇。它可以啟動一個功能完整的集群,并且可用于生產。
資源要求
K3s 可以在 1C 512MB 的設備上運行,K3s 二進制文件大小不到 60 MB,并且不需要外部依賴。
使用 kubeadm 創建的集群具有更高的資源需求。文檔建議至少有兩個空閑的 CPU 核和 2 GB 的內存。控制平面組件的增加開銷意味著需要更多的硬件資源才能達到相同的結果。這在云上部署集群時可能會增加成本。
K3s 是資源受限環境的優先選擇。這是該項目的核心關注領域。請記住,雖然 K3s 可以運行在 512 MB 內存的設備上,但并不推薦這樣,因為你需要給應用程序預留運行空間。
升級
K3s 提供簡化的集群升級體驗。你只需再次運行安裝腳本即可下載最新版本并自動完成升級:
$curl-sfLhttps://get.k3s.io|sh-
在每個節點上重復執行此命令將使你的集群升級到最新的穩定版本,無需任何手動干預。
對于使用 kubeadm 創建的 K8s 集群進行升級需要執行幾個額外的步驟。你需要獲取最新版本的 kubeadm:
#Updatingtov1.24.1 $apt-getupdate $apt-getinstall-ykubeadm=1.24.1
接下來,使用 kubeadm 升級你的控制平面:
$kubeadmupgradeapplyv1.24.1
最后,升級每個工作節點上的 kubelet 和 kubectl:
$apt-getupdate $apt-getinstall-ykubelet=1.24.1kubectl=1.24.1 $systemctldaemon-reload $systemctlrestartkubelet
K3s 再次提供了更簡單、無需干預的體驗。Kubeadm 的升級同樣也相對簡單,但需要運行更多的命令。這增加了升級過程中出錯的可能性。而使用 K3s,你只需調用安裝腳本并等待集群更新即可。
速度
在等效硬件上部署的 K8s 集群和 K3s 集群應該可以以相似的性能運行你的容器,因為它們使用相同的 containerd 運行時。然而,K3s 非常輕巧,它安裝和啟動控制平面的速度要比 K8s 快得多。
相比之下,上游的 Kubernetes 可能需要幾分鐘才能啟動(而 K3s 通常在一分鐘內可用)。這使得 K3s 更適合于臨時的集群,例如本地開發和測試環境。你可以快速啟動一個集群,使用后再將 K3s 關閉。
安全
K3s 在設計上是安全的,并提供了一個最小的攻擊面。所有組件都打包在一個二進制文件中,減少的依賴關系使得安全漏洞的出現可能性較小。
這并不意味著 K8s 是不安全的。Kubernetes 已成為最受歡迎的開源項目之一,被全球各大公司采用。它經過定期審查,以確保集群受到攻擊的保護。
無論你使用哪種解決方案,你都應該在安裝后加強集群的安全保護。K3s 和Kubernetes 都有自己的安全建議[8],用于創建安全的集群。
K3s 和 K8s 的理想使用場景
K3s 具有最低的硬件要求,適用于資源受限的環境,這些環境無法容納標準的 K8s 集群。K3s 放棄了諸如 etcd 之類的組件,而選擇了更小的替代方案,這意味著 K3s 可以適應 IoT 和邊緣設備。
同時,K3s 也是在開發測試環境中運行本地 Kubernetes 集群的理想解決方案。工程師可以在幾秒鐘內快速啟動自己的環境,而無需安裝依賴項或在云中使用托管的 Kubernetes 服務產生成本。你甚至可以在 CI 流水線腳本中運行 K3s,以簡化測試流程。
雖然 K3s 適用于許多不同的環境,但在某些情況下,使用更大的 Kubernetes 發行版可能更合理。例如,在 大規模部署或需要使用依賴于 K8s 特定組件的場景時。如果你在這個規模上運作,你可能需要使用 kubeadm 或其他工具部署和維護 K8s。對于希望對各個控制平面組件具有完全控制權的大型集群,K3s 的簡單性可能會過于局限。
總結
Kubernetes 是部署和分發容器的領先編排工具。雖然它在推動容器進入生產技術方面發揮了重要作用,但純 Kubernetes 仍然相當復雜且難以維護。
K3s 通過提供一個經過 CNCF 認證的 Kubernetes 發行版,將其打包為一個不到 60MB 的單個二進制文件,解決了這些挑戰。它的輕量級方案讓你可以在邊緣、工作站和傳統云環境中運行相同版本的 Kubernetes。
-
開源
+關注
關注
3文章
3309瀏覽量
42471 -
容器
+關注
關注
0文章
495瀏覽量
22060 -
IOT
+關注
關注
187文章
4202瀏覽量
196688 -
go語言
+關注
關注
1文章
158瀏覽量
9047 -
kubernetes
+關注
關注
0文章
224瀏覽量
8712
原文標題:K3s vs K8s:輕量級和全功能的對決
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論