1--kubernetes簡介及架構圖
一、Kubernetes 入門
Kubernetes是一個可移植的、可擴充套件的開源平臺,用於管理容器化的工作負載和服務,可促進宣告式配置和自動化。Kubernetes擁有一個龐大且快速增長的生態系統。Kubernetes的服務、支援和工具廣泛可用。
二、Kubernetes簡介
Kubernetes是一個全新的基於容器技術的分散式領先方案。簡稱:k8s。它是Google開源的容器叢集管理系統,它的設計靈感來自於Google內部的一個叫做Borg的容器管理系統。繼承了Google十餘年的容器叢集使用經驗,它為容器化的應用提供了部署執行、資源排程、服務發現和動態伸縮等一系列完整功能,極大的提高了大規模容器叢集管理的便捷性。
Kubernetes是一個完備的分散式系統支撐平臺,具有完備的叢集管理能力,多擴多層次的安全防護和准入機制、多租戶應用支撐能力、透明的服務註冊和發現機制、內建智慧負載均衡器、強大的故障發現和自我修復能力、服務滾動升級和線上擴容能力、可擴充套件的資源自動排程機制以及多粒度的資源配額管理能力。
在叢集管理方面,Kubernetes將叢集中的機器劃分為一個 Master 節點和一群工作節點 Node,其中,在 Master節點執行著叢集管理相關的一組程序 kube-apiserver、kube-controller-manager 和 kube-scheduler,這些程序實現了整個叢集的資源管理、Pod 排程、彈性伸縮、安全控制、系統監控和糾錯等管理能力,並且都是全自動完成的。Node 作為叢集中的工作節點,執行真正的應用程式,在 Node 上 Kubernetes 管理的最小執行單元是 Pod。Node 上執行著 Kubernetes 的kubelet、kube-proxy 服務程序,這些服務程序負責 Pod 的建立、啟動、監控、重啟、銷燬以及實現軟體模式的負載均衡器。
在 Kubernetes 叢集中,它解決了傳統 IT 系統中服務擴容和升級的兩大難題。如果今天的軟體並不是特別複雜並且需要承載的峰值流量不是特別多,那麼後端專案的部署其實也只需要在虛擬機器上安裝一些簡單的依賴,將需要部署的專案編譯後執行就可以了。但是隨著軟體變得越來越複雜,一個完整的後端服務不再是單體服務,而是由多個職責和功能不同的服務組成,服務之間複雜的拓撲關係以及單機已經無法滿足的效能需求使得軟體的部署和運維工作變得非常複雜,這也就使得部署和運維大型叢集變成了非常迫切的需求。
Kubernetes 的出現不僅主宰了容器編排的市場,更改變了過去的運維方式,不僅將開發與運維之間邊界變得更加模糊,而且讓 DevOps 這一角色變得更加清晰,每一個軟體工程師都可以通過 Kubernetes 來定義服務之間的拓撲關係、線上的節點個數、資源使用量並且能夠快速實現水平擴容、藍綠部署等在過去複雜的運維操作
Kubernetes優勢
-
自動裝箱,水平擴充套件,自我修復
-
服務發現和負載均衡
-
自動釋出(預設滾動釋出模式)和回滾
-
集中化配置管理和金鑰管理
-
儲存編排
-
任務批處理執行
Pod
-
Pod是K8S裡能夠被執行的最小的邏輯單元(原子單元)
-
1個Pod裡面可以執行多個容器,它們共享UTS+NET +IPC名稱空間
-
可以把Pod理解成豌豆莢,而同- -Pod內的每個容器是一 顆顆豌豆
-
一個Pod裡執行多個容器,又叫:邊車(SideCar)模式
Pod控制器
-
Pod控制器是Pod啟動的一-種模板,用來保證在K8S裡啟動的Pod
-
應始終按照人們的預期執行(副本數、生命週期、健康狀態檢查... )
-
K8S內提供了眾多的Pod控制器,常用的有以下幾種:
Deployment
DaemonSet (每個節點起一份)
ReplicaSet (Deployment管 ReplicaSet,ReplicaSet管pod)
StatefulSet (管理有狀態應用的)
Job
Cronjob
Name
-
由於K8S內部,使用“資源”來定義每一種邏輯概念(功能)故每種"資源”, 都應該有自己的"名稱”
-
"資源”有api版本( apiVersion )類別( kind )、元資料( metadata)、定義清單( spec)、狀態( status )等配置資訊
-
"名稱”通常定義在"資源”的"元資料”資訊裡
Namespace
-
隨著專案增多、人員增加、叢集規模的擴大,需要- -種能夠隔離K8S內各種"資源”的方法,這就是名稱空間
-
名稱空間可以理解為K8S內部的虛擬叢集組
-
不同名稱空間內的"資源”名稱可以相同,相同名稱空間內的同種“資源”,”名稱” 不能相同
-
合理的使用K8S的名稱空間,使得叢集管理員能夠更好的對交付到K8S裡的服務進行分類管理和瀏覽
-
K8S裡預設存在的名稱空間有: default、 kube-system、 kube-public
-
查詢K8S裡特定“資源”要帶上相應的名稱空間
Label
-
標籤是k8s特色的管理方式,便於分類管理資源物件。
-
一個標籤可以對應多個資源,-個資源也可以有多個標籤,它們是多對多的關係。
-
一個資源擁有多個標籤,可以實現不同維度的管理。
-
標籤的組成: key=value(值不能多餘64個位元組字母數字開頭 中間只能是 - _ .)
-
與標籤類似的,還有一種“註解” ( annotations )
Label選擇器
-
給資源打上標籤後,可以使用標籤選擇器過濾指定的標籤
-
標籤選擇器目前有兩個:基於等值關係(等於、不等於)和基於集合關係(屬於、不屬於、存在)
-
許多資源支援內嵌標籤選擇器欄位
matchl _abels
matchExpressions
Service
-
在K8S的世界裡,雖然每個Pod都會被分配一個單獨的IP地址,但這個IP地址會隨著Pod的銷燬而消失
-
Service (服務)就是用來解決這個問題的核心概念
-
一個Service可以看作- -組提供相同服務的Pod的對外訪問介面
-
Service作用於哪些Pod是通過標籤選擇器來定義的
Ingress
-
Ingress是K8S叢集裡工作在OSI網路參考模型下,第7層的應用,對外暴露的介面
-
Service只能進行L4流量排程,表現形式是ip+port
-
Ingress則可以排程不同業務域、 不同URL訪問路徑的業務流量
三、架構
Kubernetes 遵循非常傳統的客戶端服務端架構,客戶端通過 RESTful 介面或者直接使用 kubectl 與Kubernetes 叢集進行通訊,這兩者在實際上並沒有太多的區別,後者也只是對 Kubernetes 提供的 RESTfulAPI 進行封裝並提供出來。每一個 Kubernetes 叢集都由一組 Master 節點和一系列的 Worker 節點組成,其中 Master 節點主要負責儲存叢集的狀態併為 Kubernetes 物件分配和排程資源。
1.Master(主要用來管理叢集)
它主要負責接受客戶端的請求,安排容器的執行並且執行控制迴圈,將叢集的狀態向目標狀態進行遷移,Master節點內部由7個元件構成:
#1.APIServer(kube-apiserver : 中央管理器,排程管理叢集)
負責處理來自使用者的請求,其主要作用就是對外提供RESTful的介面
包括用於檢視叢集狀態的讀請求以及改變叢集狀態的寫請求,也是唯一一個於etcd叢集通訊的元件。
#2.Controller(kube-controller-manager :控制器: 管理容器,監控容器)
管理器運行了一系列的控制器程序,這些程序會按照使用者的期望狀態在後臺不斷地調節整個叢集中的物件,需要有高可用機制
當服務的狀態發生改變,控制器就會發現這個改變並且開始向目標狀態遷移。
由一系列控制器組成,通過apiserver監控整個叢集的狀態,並確保叢集處於預期的工作狀態
Node Controller #節點控制器
Deployment Controller #pod控制器
Service Controller #服務控制器
Volume Controller #儲存卷控制器
Endpoint Controller #接入點控制器
Garbage Controller #垃圾回收控制器
Namespace Controller #名稱空間控制器
Job Controller #任務控制器
Resource quta Controller #資源配額控制器
#3.Scheduler(kube-scheduler:排程器:排程容器)
排程器其實為kubernetes中執行的Pod選擇部署的Worker節點
它會根據使用者的需要選擇最能滿足請求的節點來執行Pod,它會在每次需要排程Pod時執行。
主要功能是接收排程pod到適合的運算節點上
預選策略( predict )
優選策略( priorities )
#4.Flannel(提供叢集間網路)
#5.Etcd(資料庫)
#6.kubelet(部署容器,監控容器)
#7.kube-proxy(提供容器間的網路)
2.Node(主要用來部署應用)
#1.kube-kubelet(部署容器,監控容器)
kubelet是一個節點上的主要服務,他週期性的從APIServer接受新的或者修改的pod規範並且保證節點上的pod和其容器的正常執行
還會保證節點會向目標狀態遷移,該節點仍然會向Master節點發送宿主機的健康狀態。
簡單地說, kubelet的主要功能就是定時從某個地方獲取節點上pod的期望狀態(執行什麼容器、執行的副本數量、網路或者儲存如何配置等等) ,並呼叫對應的容器平臺介面達到這個狀態
定時彙報當前節點的狀態給apiserver,以供排程的時候使用
映象和容器的清理工作,保證節點上映象不會佔滿磁碟空間,退出的容器不會佔用太多資源
#2.kube-proxy(提供容器間的網路)
負責宿主機的子網管理,同時也能將服務暴露給外部
其原理就是在多個隔離的網路中把請求轉發給正確的Pod或者容器。
是K8S在每個節點 上執行網路代理, service資源的載體
建立了pod網路和叢集網路的關係( clusterip >podip )
常用三種流量排程模式
Userspace (廢棄)
Iptables (瀕臨廢棄)(絕大部分公司在用)
Ipvs(推薦)
負責建立和刪除包括更新排程規則、通知apiserver自己的更新,或者從apiserver哪裡獲取其他kube- proxy的排程規則變化來更新自己的
3.Kubernetes架構圖
# 在架構圖中,我們把服務分為執行在工作節點上的服務和組成在叢集級別控制板的服務
Kubernetes主要由以下幾個核心元件組成:
1. etcd儲存整個叢集的狀態
2. apiserver提供了資源的唯一入口,並提供認證、授權、訪問控制、API註冊和發現等
3. controller manager負責維護叢集的狀態,比如故障檢測、自動擴充套件、滾動更新等
4. scheduler負責資源的排程,按照預定的排程策略將Pod排程到相應的機器上
5. kubelet負責維護容器的生命週期,同時也負責Volume(CVI)和網路(CNI)的管理
6. Container runtime負責映象的管理以及Pod和容器的真正執行(CRI)
7. kube-poxy負責為Service提供cluster內部的服務發現和負載均衡
除了核心元件,還有一些推薦的元件:
8. kube-dns負責為整個叢集提供DNS服務
9. Ingress Controller 為服務提供外網入口
10. Heapster提供資源監控
11. Dashboard提供GUIFederation提供跨可用區的叢集
12. Fluentd-elasticsearch提供叢集日誌採集,儲存與查詢