kubernetes是當今最流行的開源容器管理平台,它就是大名鼎鼎的google borg的開源版本。google在2023年推出了kubernetes,本文發布時最新的版本是1.11。
kubernetes源於希臘語,意為舵手,k8s是乙個簡稱,因為首尾字母中間正好有8個字母。基於容器技術,kubernetes可以方便的進行集群應用的部署、擴容、縮容、自癒機制、服務發現、負載均衡、日誌、監控等功能,大大減少日常運維的工作量。
kubernetes所有的操作都可以通過kubernetes api來進行,通過api來操作kubernetes中的物件,包括pod、service、volume、namespace等等。
kubernetes主要由以下幾個核心元件組成:
api物件是k8s集群中的管理操作單元。k8s集群系統每支援一項新功能,引入一項新技術,一定會新引入對應的api物件,支援對該功能的管理操作。例如副本集replica set對應的api物件是rs。
每個api物件都有3大類屬性:元資料metadata、規範spec和狀態status。元資料是用來標識api物件的,每個物件都至少有3個元資料:namespace,name和uid;除此以外還有各種各樣的標籤labels用來標識和匹配不同的物件,例如使用者可以用標籤env來標識區分不同的服務部署環境,分別用env=dev、env=testing、env=production來標識開發、測試、生產的不同服務。規範描述了使用者期望k8s集群中的分布式系統達到的理想狀態(desired state),例如使用者可以通過複製控制器replication controller設定期望的pod副本數為3;status描述了系統實際當前達到的狀態(status),例如系統當前實際的pod副本數為2;那麼複製控制器當前的程式邏輯就是自動啟動新的pod,爭取達到副本數為3。
k8s中所有的配置都是通過api物件的spec去設定的,也就是使用者通過配置系統的理想狀態來改變系統,這是k8s重要設計理念之一,即所有的操作都是宣告式(declarative)的而不是命令式(imperative)的。宣告式操作在分布式系統中的好處是穩定,不怕丟操作或執行多次,例如設定副本數為3的操作執行多次也還是乙個結果,而給副本數加1的操作就不是宣告式的,執行多次結果就錯了。
cluster 是計算、儲存和網路資源的集合,kubernetes 利用這些資源執行各種基於容器的應用。
master 是 cluster 的大腦,它的主要職責是排程,即決定將應用放在**執行。master 執行 linux 作業系統,可以是物理機或者虛擬機器。為了實現高可用,可以執行多個 master。
node 的職責是執行容器應用。node 由 master 管理,node 負責監控並匯報容器的狀態,並根據 master 的要求管理容器的生命週期。node 執行在 linux 作業系統,可以是物理機或者是虛擬機器。
pod 是 kubernetes 的最小工作單元。每個 pod 包含乙個或多個容器。pod 中的容器會作為乙個整體被 master 排程到乙個 node 上執行。
kubernetes 引入 pod 主要基於下面兩個目的:
file puller 會定期從外部的 content manager 中拉取最新的檔案,將其存放在共享的 volume 中。web server 從 volume 讀取檔案,響應 consumer 的請求。這兩個容器是緊密協作的,它們一起為 consumer 提供最新的資料;同時它們也通過 volume 共享資料。所以放到乙個 pod 是合適的。kubernetes 通常不會直接建立 pod,而是通過 controller 來管理 pod 的。controller 中定義了 pod 的部署特性,比如有幾個副本,在什麼樣的 node 上執行等。為了滿足不同的業務場景,kubernetes 提供了多種 controller,包括 deployment、replicaset、daemonset、statefuleset、job 等,我們逐一討論。
replicaset 實現了 pod 的多副本管理。使用 deployment 時會自動建立 replicaset,也就是說 deployment 是通過 replicaset 來管理 pod 的多個副本,我們通常不需要直接使用 replicaset。
daemonset 用於每個 node 最多隻執行乙個 pod 副本的場景。正如其名稱所揭示的,daemonset 通常用於執行 daemon。
statefuleset 能夠保證 pod 的每個副本在整個生命週期中名稱是不變的。而其他 controller 不提供這個功能,當某個 pod 發生故障需要刪除並重新啟動時,pod 的名稱會發生變化。同時 statefuleset 會保證副本按照固定的順序啟動、更新或者刪除。
job 用於執行結束就刪除的應用。而其他 controller 中的 pod 通常是長期持續執行。
rc、rs和deployment只是保證了支撐服務的微服務pod的數量,但是沒有解決如何訪問這些服務的問題。乙個pod只是乙個執行服務的例項,隨時可能在乙個節點上停止,在另乙個節點以乙個新的ip啟動乙個新的pod,因此不能以確定的ip和埠號提供服務。要穩定地提供服務需要服務發現和負載均衡能力。服務發現完成的工作,是針對客戶端訪問的服務,找到對應的的後端服務例項。在k8s集群中,客戶端需要訪問的服務就是service物件。每個service會對應乙個集群內部有效的虛擬ip,集群內部通過虛擬ip訪問乙個服務。在k8s集群中微服務的負載均衡是由kube-proxy實現的。kube-proxy是k8s集群內部的負載均衡器。它是乙個分布式**伺服器,在k8s的每個節點上都有乙個;這一設計體現了它的伸縮性優勢,需要訪問服務的節點越多,提供負載均衡能力的kube-proxy就越多,高可用節點也隨之增多。與之相比,我們平時在伺服器端做個反向**做負載均衡,還要進一步解決反向**的負載均衡和高可用問題。
kubernetes 執行容器(pod)與訪問容器(pod)這兩項任務分別由 controller 和 service 執行。名字空間為k8s集群提供虛擬的隔離作用,k8s集群初始有兩個名字空間,分別是預設名字空間default和系統名字空間kube-system,除此以外,管理員可以可以建立新的名字空間滿足需要。
參考文件:參考檔案:
K8s 原理架構介紹 一
kubernetes是當今最流行的開源容器管理平台,它就是大名鼎鼎的google borg的開源版本。google在2014年推出了kubernetes,本文發布時最新的版本是1.11。kubernetes源於希臘語,意為舵手,k8s是乙個簡稱,因為首尾字母中間正好有8個字母。基於容器技術,kube...
k8s 多租戶 k8s 基礎介紹
備註 1 每乙個pod裡執行著乙個特殊的容器 pause容器,其他容器都是業務容器,這些業務容器共享pause容器的網路棧和volume 邏輯卷 掛載卷。因此他們之間的通訊和資料交換更為高效。2 k8s設計了pod物件,將每個服務程序包裝到相應的pod中,使其成為pod中執行的乙個容器 contai...
k8s架構描述
架構 kubectl k8s是命令列端,用來傳送客戶端的操作指令 api server 是k8s集群的前端介面,各種客戶端工具以及k8s的其他元件可以通過他管理k8s集群的各種資源。他提供了http https restful api,即k8s api scheduler 排程 負責決定將pod放在...