最後一個服務編排工具的學習k8s。kubernetes其實源於希臘語意思(舵手,領航員)。猶豫不太好擠也不太好寫,就有了另外一個名稱叫k8s,kubernetes是谷歌在2014年開始實施的一個項目,當時google已經有了大規模服務容器管理的經驗,內部Borg系統,負責對google內部的一些服務進行調度和管理,它的目的是讓用戶沒必要操心資源管理的問題,讓他們專一本身的核心業務, 而且最大化數據中心的利用率。
什麼是k8s
咱們假設有個住戶社區,k8s就至關於這個社區的大房東,社區裏面有一棟一棟的大樓,大樓能夠看作虛擬機器,俗稱的VM,大樓裏面有不少的住戶,每一個住戶就表明一個pod,那每一個住戶如何找到他們的位置呢?每一個住戶如何找到他們的位置就是經過門牌號,咱們就理解爲IP的位置,在每一個住戶裏面有很是多的家庭成員,爸爸,媽媽,兄弟姐妹,爺爺奶奶,姥爺姥姥,女兒兒子,這些角色就能夠理解爲container,在這個pod裏面的成員,就共享了這個房間裏面的資源,水電網絡,那些資源就能夠把它理解成計算資源,ipu,內存,硬盤。對於大房東k8s,他最主要的功能就是管理,每一個住戶Pod使用多少資源,那爲了就是讓整棟大樓,會更有效率的使用不少資源,舉例來講:A棟大樓住了太多的住戶,太多的Pod,他們直接確定會相互競爭資源的問題,那它就能夠協調某一些pod,就是某一些住戶搬到B大樓去,這樣會讓變得更加的均衡使用。
官網:
kubernetes.io/ k8s是一個自動開源系統,自動化部署,擴縮容,管理容器化的應用。 相比前面的mesos 和swarm,k8s的目的很是的單純和明確,簡單的來講他的目的就是爲了服務編排,沒有別的。這麼明確的明確的目的。雖然目的簡單但專一因此專業,很是靈活的使用方式,它考慮到服務服務落地過程當中可能遇到的各類各樣的問題,各類各樣的場景,因此從簡單的入手,吃透它。瞭解它的全部組件,而後回過頭看它的架構。
這張圖簡單的描述了,k8s集羣的樣子,k8s確定也須要一個集羣,服務調度服務編排確定要有機器,因此須要集羣,中間的七邊行是Master節點,能夠理解爲安裝了核心組件的,另外的六邊形標識的是Node節點,在k8s裏面叫worker節點,而後每一個節點裏面有個kubelet服務和docker服務,
多了2個綠色部分,在master裏面Deployment。在Node中就是Containerized app就是容器化的應用。圖例就是在Master部署了一個Deployment,在三個節點選中了其中的一個部署了應用。Node中的藍色圓圈標識的是pod。
pod 是k8s中很是重要的一個概念,全部的應用和服務都是運行在pod裏面的,pod是k8s中最小的一個單元,能夠理解爲k8s的一個原子,pod裏面就是容器。
-
第一個pod有獨立的IP地址,一個容器
-
第二個pod有獨立的Ip地址,一個容器,一個磁盤存儲
-
第三個pod有獨立的Ip地址,兩個容器,一個磁盤存儲,這2個容器能夠共享IP的,共享網絡,共享磁盤的。
-
第三個pod有獨立的Ip地址,三個容器,2個的磁盤存儲,這3個容器能夠共享IP的,共享網絡,共享磁盤的。
PS:經過上邊的4個小圖,能夠明白同一個pod裏面能夠有任意多個容器和存儲。
知道了pod運行了容器,pod本身運行在哪裏啊。運行在node,經過kubelet來進行的,調度kuelet把pod運行起來。一個node上面能夠運行多個pod。只要資源足夠能夠創建多個pod。
service
-
中間是master節點
-
其他的是node節點
-
下面的這個node,裏面運行了一個pod,pod的外邊,有一層虛線,虛線標識service,pod的Ip(10.10.10.1),service(10.10.9.1),service和pod的Ip不一樣,pod是具體運行在一個node上的,若是pod或者node忽然掛掉了,編排工具確定在其餘的node節點下從新起一個pod,這個pod確定的ip也就變了。因此就須要一個serivce的概念,當pod出問題了,產生一個新的pod,新的pod就是一個新的ip,咱們就能夠經過service的方式找到pod。
-
serivce的Ip跟service的生命週期是一致的,若是service不被刪除的話,IP一直不發生變化。
-
上邊這個2個node,三個pod,其實就是從一個實例變成了3個實例,進行了擴容,對外提供想通的服務,這時這個service,ip就有了另外2個做用,除了能夠定位pod的地址,能夠對pod地址進行負載均衡,進行輪詢,
service的概念基本瞭解了,怎麼肯定哪些pod屬於一個service,提出一個service的概念,service可能有一個或者是多個pod組成,如何定義service,怎麼定義service。在k8s上經過Master的Label Selector的方式,好比s:app=A,s:app=B,有這種標籤的肯定輸入pod等於A 或者pod等於B,全部標籤同樣的都屬於個人小弟。這樣service和pod的耦合就很是鬆。
PS:(梳理概念)pod裏面包括N個容器,service裏面包括pod,Deployment可能包括service或者是pod。
deployment完成應用擴容
-
Master裏面發佈了一個Deplyment,想給service 進行擴容
-
其實內部是擴容的pod,service只是一個邏輯存在的東西
-
把一組pod造成一個邏輯組就是service,擴容完成後,其餘兩個節點就有了pod實例。
-
service就開始對外的負載均衡endpoint找到對應的pod
滾動更新,停掉了一箇舊的pod,啓動一個新的pod,這時service既有新的,也有舊的存在,直到全部的舊的都更新完畢才結束。全部的更新和擴容的過程serivce的Ip始終是保持不變的。
k8s的總體架構
首先從總體上看,上邊這塊就是Master節點,下面有兩塊都是worker節點,master裏面部署的都是k8s的核心模塊,虛線框表明的是API Server,提供了資源的核心模塊,提供了認證受權和k8s的訪問控制,能夠經過kubectl或者本身開發的userClient,restApi的形式訪問API server。從而完成整個集羣的訪問。
-
ControllerManager負責維護集羣的狀態,好比故障檢測,擴縮容,滾動更新等等。
-
Scheduler負責資源的調度,按照預約的策略把pod調度到指定的node節點
-
ETCD 用作已執行存儲,pod,service的集羣等信息,k8s須要持久化的數據都存儲在這個上邊。
-
Kubelet負責維護當前節點上的容器的生命和volumes,網絡。
-
每一個Node上能夠運行一個kube-proxy,負責service 提供內部的服務發現和負載均衡,爲service方法作個落地的功能。
-
kube-dns負責整個集羣的dns服務,這個組件不是必須的,通常經過名字訪問比較方便。
-
dashboard集羣數據的GUI界面。
-
kubectl 發起一個請求,請求通過認證。
-
scheduler的策略和評分計算獲得目標的node。
-
APIServer請求Node,經過kublet把這個Node運行pod起來。
-
APIServer把信息發送給ETCD保存起來。
-
pod運行起來以後,經過ControllerManager管理每一個pod的狀態,若是忽然掛了,就想辦法建立一個pod。給pod分個獨立的ip地址,能夠在整個集羣內使用這個ip來訪問它。可是pod的ip是易變的,異常重啓和升級的時候,不可能關注某個pod的Ip的。
-
下面虛線的部分表示的是一個service,service裏面有3個pod,不在虛線裏面的是單獨存在的pod,並無提供service的入口,完成service的具體工做的模塊就是kube-proxy,在每一個node上都有一個kube-proxy,而後給service分配一個ip,能夠訪問service裏面的pod,因此kube-proxy對應的service都會有一個ip的指向,負載均衡的訪問他們。
-
kube-proxy(service) 能夠把端口和ip直接暴露在node上。外邊的請求能夠訪問node上的ip就能夠關聯到這個service上了。
-
kube-dns 就是爲了方便名字直接訪問node節點。任何一個pod均可以經過名字來進行訪問。
k8s的設計理念
瞭解設計理念能夠更深刻的瞭解k8s,設計實在太好了,很是值得咱們學習和借鑑。
-
全部的api都是聲明式的(對於重複的操做是穩定的,全部的對象都是名詞,不是動詞,用戶很容易的指望用戶的樣子,當前的系統是否知足需求,明確用戶的目的,用系統管理的業務意圖觸發設計)
-
控制機的設計原則(假定各類可能存在錯誤的可能,並作容錯處理,出現局部錯誤和臨時錯誤是很正常的事情,錯誤可能存在於物理故障磁盤,外部系統的故障啊,系統自己的代碼問題,考慮到任何可能的錯誤,而且作容錯處理,每一個模塊出現錯誤後,恢復處理,在系統中不可能保證每一個模塊始終是鏈接的,所以任何一個模塊都要有自動修復的能力,保證鏈接不到其餘模塊而造成的自我崩潰。不少狀況下能夠作到優雅的降級,要求在設計的過程當中,有基本功能和高級功能,同時不會致使高級功能的崩潰,影響到這個模塊 的使用,更容易的引入高級功能,而會致使高級功能影響基本功能。)
-
CNI
-
Flannel,Calico,Weave
-
Pod網絡
-
NodiskConflict 掛載衝突
-
checkNodeMemMemoryPressure 內存的壓力
-
Nodeselect 節點的選擇器
-
FitRescoure CPU,內存的限制
-
Affinity 知足pod的鏈接狀態的限制
優先規則,對node進行打分,經過優先函數進行預選規則,每一個優先函數能夠返回0-10的函數,分數越高,這臺主機越適合,對應一個權重。
-
selectorSpreadPriority
-
LeastRequestedPriority
-
AffinityPriority
經過pod的Ip來進行訪問
知足pod,ip不能衝突
k8s的服務發現
每一個服務,全部的pod給虛擬Ip,虛擬Ip只能在內部訪問
服務暴露到節點,外部的能夠經過NodeIp 訪問pod
負責集羣內部的dns解析,內部之間能夠經過名稱訪問pod。
PS:k8s的理論就講這麼多,重點仍是實踐,下次開始搭建k8s集羣