一、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提供集群日志采集,存儲與查詢
