從架構到部署,全面瞭解K3s

Kubernetes無處不在——開發者的筆記本、樹莓派、雲、數據中心、混合雲甚至多雲上都有Kubernetes。它已然成爲現代基礎設施的基礎,抽象了底層的計算、存儲和網絡服務。Kubernetes隱藏了各種基礎設施環境之間的差異,它將多雲變成了現實。

Kubernetes也成爲了編排的通用控制平面,不僅僅是容器編排,還包括虛擬機、數據庫,甚至SAP Hana實例等各種資源。

儘管Kubernetes發展迅猛,但還是給開發者和運營商拋出了許多挑戰。其中一個關鍵挑戰是在邊緣運行Kubernetes。與雲或數據中心相比,邊緣是非常不同的。它運行在一個高度受限環境中的遠程位置。與運行在數據中心的同類設備相比,邊緣設備的計算、存儲和網絡資源只有一小部分。邊緣設備與雲的連接是斷斷續續的,而且它們主要在離線環境中運行。這些因素使得很難在邊緣部署和管理Kubernetes集羣。

基於此,業界應用最爲廣泛的K8S管理平臺創建者Rancher Labs發佈了K3s,這是一個Kubernetes的發行版,它針對邊緣進行了高度優化。雖然K3s是Kubernetes的簡化版、迷你版,但API的一致性和功能並沒有受到影響。從kubectl到Helm再到Kubernetes,幾乎所有的雲原生生態系統的工具都能與K3s無縫對接。實際上,K3s是一個經過CNCF認證的、符合要求的Kubernetes發行版,可以在生產環境中部署。幾乎所有運行完整的Kubernetes集羣的工作負載都能保證在K3s集羣上工作。

Kubernetes這個10個字母的單詞,在社區裏被稱爲K8S。由於K3s正好是Kubernetes內存的一半,Rancher爲新的發行版找到了一個5個字母的單詞,並將其簡稱爲K3s。

深入瞭解K3s架構

K3s的魅力在於它的簡單性。作爲一個單一的二進制文件(約100MB)進行打包和部署,你只需幾秒鐘就可以得到一個完全成熟的Kubernetes集羣。安裝體驗就像在集羣的每個節點上運行一個腳本一樣簡單。

K3s二進制文件是一個自給自足的封裝實體,它幾乎運行了Kubernetes集羣的所有組件,包括API server、scheduler和controller。默認情況下,每個K3s的安裝都包括控制平面、kubelet和containerd運行時,這些已經足以運行Kubernetes工作負載。當然,也可以添加只運行kubelet agent和containerd運行時的專用worker節點,來調度和管理pod生命週期。

與傳統的Kubernetes集羣相比,K3s中的master節點和worker節點沒有明顯的區別。可以在任何節點上調度和管理Pod,不管它們扮演的是什麼角色。所以,master節點和worker節點的命名方式不適用於k3s集羣。

在k3s集羣中,將運行控制平面組件與kubelet的節點稱爲server,而只運行kubelet的節點稱爲agent。server和agent都有容器運行時和一個kubeproxy,管理整個集羣的tunnel和網絡流量。

在這裏插入圖片描述

在典型的k3s環境中,你運行一個server和多個agent。在安裝過程中,如果你傳遞了server的URL,節點就會變成一個agent;否則,你最終會運行另一個獨立的k3s集羣,有自己的控制平面。

那麼,Rancher是如何降低k3s的內存呢?首先,他們去除了Kubernetes的很多可選組件,這些組件對於運行一個最低限度的集羣來說並不重要。然後,它增加了一些必要的元素,包括containerd、Flannel、CoreDNS、CNI、Traefik ingress controller、本地存儲程序、一個嵌入式服務負載均衡器和一個集成的網絡策略controller。所有這些組件都被打包成一個二進制文件,並在同一個進程中運行。除了這些,該發行版還支持開箱即用的Helm chart。

上游的Kubernetes發行版是臃腫的,有很多代碼可以刪除。例如,存儲volume插件和雲提供商API,這些會極大增加發行版的內存。K3s省略了所有這些,以最大限度地減少二進制的大小。

另一個關鍵的區別是集羣狀態的管理方式。Kubernetes依靠分佈式鍵值數據庫etcd來存儲整個集羣的狀態。K3s用名爲SQLite的輕量級數據庫取代了etcd,SQLite是一個成熟的嵌入式場景數據庫。很多移動應用都會捆綁SQLite來存儲狀態。

在這裏插入圖片描述

通過在至少三個節點上運行etcd,Kubernetes控制平面變得高度可用。另一方面,SQLite並不是分佈式數據庫,它成爲爲了實現控制平面的高可用,K3s server可以指向外部數據庫端點。支持的數據庫包括etcd、MySQL和PostgreSQL。通過有效地將狀態委託給外部數據庫,K3s支持多個控制平面實例,使得集羣具有高可用性。

Rancher正在試驗一種名爲DQLite的分佈式版本的SQLite,它最終可能會成爲K3s的默認數據存儲。

在這裏插入圖片描述

K3s最大的優點是它的 “包含電池但可替換 "的方式。例如,我們可以用Docker CE運行時替換containerd運行時,用Calico替換Flannel,用Longhorn替換本地存儲等等。

關於K3s架構的詳細討論,我強烈推薦你觀看K3s的架構師Darren Shepherd在北美KubeCon 2019上的演講:

https://youtu.be/-HchRyqNtkU

K3s部署場景和拓撲結構

K3s發行版支持多種架構,包括AMD64、ARM64和ARMv7。憑藉一致的安裝體驗,K3s可以在Raspberry Pi Zero、NVIDIA Jetson Nano、Intel NUC或Amazon EC2 a1.4xlarge實例上運行。

在你需要一個單節點Kubernetes集羣來維護部署manifest的相同工作流程的環境中,請在服務器或邊緣設備上安裝K3s。這使你可以靈活地使用你現有的CI/CD流水線和容器鏡像以及Helm chart或YAML文件。

如果你需要一個在AMD64或ARM64架構上運行的高可用集羣,安裝一個3節點的etcd集羣,然後是3個K3s server和一個或多個agent。這樣就可以爲你提供一個生產級的環境,併爲控制平面提供HA。

當在雲中運行K3s集羣時,將server指向一個託管數據庫,如Amazon RDS或Google Cloud SQL,以運行一個具有多個agent的高可用控制平面。每個K3s server可以運行在不同的可用性區域,以獲得最大的正常運行時間。

如果你在具有可靠的、始終在線連接的邊緣計算環境中運行K3s,則在雲中運行server,在邊緣運行agent。這使你可以靈活地在雲中運行一個高可用和可管理的控制平面,同時在遠程環境中運行agent。

最後,你可以將K3s HA控制平面部署在5G邊緣位置,如AWS Wavelength和Azure Edge Zones環境中,agent在設備中運行。這種拓撲結構呼應了智能建築、智能工廠和智能醫療場景。

在此係列的下一篇文章中,我將介紹在邊緣環境中部署HA集羣的步驟,保持關注!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章