七張圖了解Kubernetes內部的架構
Kubernetes是用于管理容器化應用程序集群的工具。在計算機領域中,此過程通常稱為編排。
用管弦樂編排比喻上面的服務編排是很恰當的,就像樂隊指揮一樣,Kubernetes協調地將許多微服務組合在一起構成了應用程序。Kubernetes會自動且持續(xù)地監(jiān)視集群并對其組成進行調整。
了解Kubernetes架構對于部署和維護容器化的應用程序至關重要。
什么是Kubernetes
Kubernetes或簡稱k8s,是一個用于自動執(zhí)行應用程序部署的系統(tǒng)。現代應用程序分散在云,虛擬機和服務器之間。手動管理應用程序不再是可行的選擇。
K8s將虛擬機和物理機轉換為統(tǒng)一的API切面。然后,開發(fā)人員可以使用Kubernetes API來部署,擴展和管理容器化的應用程序。
它的體系結構還為分布式系統(tǒng)提供了一個靈活的框架。K8s為應用程序自動協調擴展和故障轉移,并提供部署模式。
它有助于管理運行應用程序的容器,并確保生產環(huán)境中沒有停機時間。例如,如果某個容器發(fā)生故障,則另一個容器會自動取代其位置,而最終用戶根本不會注意到這些的發(fā)生。
Kubernetes不僅是一個編排系統(tǒng)。它是一組獨立的,相互關聯的控制過程。它的作用是在當前狀態(tài)下連續(xù)工作,并朝著期望的方向移動過程。
Kubernetes架構和組成
Kubernetes具有去中心化的架構,不會線性處理任務。它基于聲明性模型運行并實現"所需狀態(tài)"的概念。下面這些步驟說明了Kubernetes的基本過程:
- 管理員創(chuàng)建應用程序的所需狀態(tài)并將其放入清單文件
manifest.yml中。 - 使用CLI或提供的用戶界面將清單文件提供給
Kubernetes API Server。Kubernetes的默認命令行工具稱為kubectl。 Kubernetes將清單文件(描述了應用程序的期望狀態(tài))存儲在稱為鍵值存儲(etcd)的數據庫中。Kubernetes隨后在集群內的所有相關應用程序上實現所需的狀態(tài)。Kubernetes持續(xù)監(jiān)控集群的元素,以確保應用程序的當前狀態(tài)不會與所需狀態(tài)有所不同。
現在,我們將探索標準Kubernetes集群的各個組成部分,以更詳細地了解該過程。
主節(jié)點
Kubernetes的主節(jié)點通過API從CLI(命令行界面)或UI(用戶界面)接收輸入。這些是你提供給Kubernetes的命令。
你可以定義想要讓Kubernetes維護的Pod,副本集和Service。例如,要使用的容器鏡像,要公開的端口以及要運行的Pod副本數量。還可以為該集群中運行的應用程序提供"所需狀態(tài)"的參數。
API Server
API Server是Kubernetes控制程序的前端,也是用戶唯一可以直接進行交互的Kubernetes組件,內部系統(tǒng)組件以及外部用戶組件均通過相同的API進行通信。
鍵值存儲etcd
鍵值存儲(也稱為etcd)是Kubernetes用來備份所有集群數據的數據庫。它存儲集群的整個配置和狀態(tài)。主節(jié)點查詢etcd以檢索節(jié)點,容器和容器的狀態(tài)參數。
Controller
控制器的作用是從API Server獲得所需狀態(tài)。它檢查要控制的節(jié)點的當前狀態(tài),確定是否與所需狀態(tài)存在任何差異,并解決它們(如果有)。
Scheduler
調度程序會監(jiān)視來自API Server的新請求,并將其分配給運行狀況良好的節(jié)點。它對節(jié)點的質量進行排名,并將Pod部署到最適合的節(jié)點。如果沒有合適的節(jié)點,則將Pod置于掛起狀態(tài),直到出現合適的節(jié)點。
注意:最好不要在主節(jié)點上運行用戶應用程序。讓
Kubernetes主節(jié)點可以完全專注于管理集群。
工作節(jié)點
工作節(jié)點監(jiān)聽API Server發(fā)送過來的新的工作分配;他們會執(zhí)行分配給他們的工作,然后將結果報告給Kubernetes主節(jié)點。
Kubelet
kubelet在群集中的每個節(jié)點上運行。它是Kubernetes內部的主要代理。通過安裝kubelet,節(jié)點的CPU,RAM和存儲成為所處集群的一部分。它監(jiān)視從API ?Server發(fā)送來的任務,執(zhí)行任務,并報告給主節(jié)點。它還會監(jiān)視Pod,如果Pod不能完全正常運行,則會向控制程序報告。然后,基于該信息,主服務器可以決定如何分配任務和資源以達到所需狀態(tài)。
Container Runtime
容器運行時從容器鏡像庫中拉取鏡像,然后啟動和停止容器。容器運行時由第三方軟件或插件(例如Docker)擔當。
Kube-proxy
kube-proxy確保每個節(jié)點都獲得其IP地址,實現本地iptables和規(guī)則以處理路由和流量負載均衡。
Pod
在Kubernetes中,Pod是調度的最小元素。沒有它,容器就不能成為集群的一部分。如果你需要擴展應用程序,則只能通過添加或刪除Pod來實現。
Pod是Kubernetes中一個抽象化概念,由一個或多個容器組合在一起的共享資源。根據資源的可用性,主節(jié)點會把Pod調度到特定工作節(jié)點上,并與容器運行時協調以啟動容器。
在Pod意外無法執(zhí)行任務的情況下,Kubernetes不會嘗試修復它們。相反,它會在其位置創(chuàng)建并啟動一個新Pod。這個新Pod是原來的副本,除了DNS和IP地址都和以前的Pod一樣。此功能對開發(fā)人員設計應用程序的方式產生了深遠的影響。
由于Kubernetes架構的靈活性,不再需要將應用程序綁定到Pod的特定實例。取而代之的是,需要對應用程序進行設計,以便在集群內任何位置創(chuàng)建的全新Pod可以無縫取代舊Pod。Kubernetes會使用Service來協助此過程。
Kubernetes Service
Pod不是恒定的。Kubernetes提供的最佳功能之一是無法正常運行的Pod會自動被新的Pod取代。
但是,這些新的Pod具有一組不同的IP。這可能導致處理問題,并且由于IP不再匹配,IP流失。如果無人看管,此屬性將使吊艙高度不可靠。
為了將穩(wěn)定的IP地址和DNS名稱引入到不穩(wěn)定的Pod世界中,Kubernetes引入了Service來提供可靠的網絡連接。
通過控制進出Pod的流量,Service提供了穩(wěn)定的網絡終結點-固定的IP,DNS和端口。有了Service,可以添加或刪除任何Pod,而不必擔心基本網絡信息會改變。
Service是怎么工作的
Pod通過稱為標簽(Label)和選擇器(Selector)的鍵值對與Service相關聯。Service會自動發(fā)現帶有與選擇器匹配的標簽的新Pod。
此過程無縫地將新的Pod添加到Service,同時,從群集中刪除已終止的Pod。
例如,如果所需狀態(tài)定義了需要一個Pod的三個副本,而運行一個副本的節(jié)點發(fā)生故障,則當前狀態(tài)將減少為兩個Pod。Kubernetes觀察到所需的狀態(tài)是三個Pod。然后,它會調度一個新副本來代替發(fā)生故障的Pod,并將其分配給集群中的另一個節(jié)點。
通過添加或刪除容器來更新或縮放應用程序時,同樣適用。一旦我們更新了所需狀態(tài)的定義,Kubernetes就會注意到差異并添加或刪除Pod以匹配清單文件manifest.yml里定義的所需狀態(tài)。Kubernetes控制面板記錄,實現和運行后臺協調循環(huán),該循環(huán)會不斷檢查環(huán)境是否符合用戶定義的環(huán)境要求。
Container Deployment
為了充分了解Kubernetes的編排方式和內容,我們需要了解一下容器部署的概念。
傳統(tǒng)部署
最初,開發(fā)人員在單個物理服務器上部署應用程序。這種部署帶來的問題是。物理資源的共享意味著一個應用程序可以占用服務器的大部分處理能力,從而限制了同一臺服務器上其他應用程序的性能。
傳統(tǒng)的部署方式擴展硬件容量需要花費很長時間,增加很多成本。為了解決硬件限制,組織開始虛擬化物理機。
虛擬化部署
虛擬化部署允許在單個物理服務器上創(chuàng)建隔離的虛擬環(huán)境,即虛擬機(VM)。該解決方案隔離了VM中的應用程序,限制了資源的使用并提高了安全性。一個應用程序不能再自由訪問另一個應用程序處理的信息。
通過虛擬化部署,您可以快速擴展并分散單個物理服務器的資源,隨意更新并控制硬件成本。每個VM都有其操作系統(tǒng),并且可以在虛擬化硬件之上運行所有必要的系統(tǒng)。
容器化部署
容器部署是創(chuàng)建更加靈活和高效的模型的下一步。就像虛擬機一樣,容器具有單獨的內存,系統(tǒng)文件和處理空間。但是,嚴格隔離不再是限制因素。
現在,多個應用程序可以共享相同的基礎操作系統(tǒng)。此功能使容器比成熟的VM效率更高。它們可跨越云,不同的設備以及幾乎所有OS發(fā)行版進行移植。
容器的結構還允許應用程序作為較小的獨立部分運行。然后可以在多臺計算機上動態(tài)部署和管理這些部分。復雜的結構和任務劃分太復雜,無法手動管理。需要一個像Kubernetes這樣的自動化解決方案,以有效管理此過程中涉及的所有活動部件。
總結
Kubernetes使用非常簡單的模型進行操作。我們輸入希望系統(tǒng)運行的方式–所需狀態(tài),Kubernetes將所需狀態(tài)與集群中的當前狀態(tài)進行比較。然后,它的服務將兩個狀態(tài)對齊,并實現和維持所需狀態(tài)。
你現在應該對Kubernetes架構有了更好的了解,可以繼續(xù)學習執(zhí)行創(chuàng)建和維護集群的實際任務。
文章來源:phoenixnap.com
原文鏈接:點擊閱讀原文訪問
推薦閱讀
喜歡本文的朋友,歡迎關注“Go語言中文網”:
Go語言中文網啟用微信學習交流群,歡迎加微信:274768166,投稿亦歡迎
