Kubernetes CKA課程筆記 2
基本的K8s系統架構有兩種Node:
- master(或稱Control Plane Node,可以有很多個)
- worker(普通的Node,通常會有超多個!)
首先針對worker Node解說:
- 每個worker Node上可以存在許多個pods
- 有三個Processes一定要跑在每一個worker Node上:
a.Kubelet
b.Kube proxy
c.Container runtime
首先Container runtime:
常見的有docker,cri-o,或container-d
課程解說現今最熱門的是使用較輕量化的container-d
講師的範例Node除了container-d外還會有docker標誌
表示其中也能跑Docker images
接著Kubelet:
- 其主要用來控制pod的排程(schedule)
- 有著container與Node(機台)間的介面
- container runtime啟動pod過程中,分配Node(機台)resource就是靠kebelet
最後Kube proxy:
- K8s的Service元件將http request轉拋給pod的,就是依靠Kube proxy
2. 依樣每個Node都應該安裝Kube proxy
3. Kube proxy內含智慧的轉拋邏輯(如下圖解說)
當其中一個Node中的APP pod要發動request通過DB Service到DB pod
DB Service後續透過Kube proxy轉拋的方式將如下圖:
如上圖,在重複一次!!!每個Node都要裝好並運行以下三樣東西:
- Kubelet
- Kube proxy
- Container runtime
接著問題可能是:
- 誰安排pod的排程,或replica pod掛了,誰建立新的pod?
- 又或說誰監控(monitor) pod?
- 誰重新設置pod排程/重新啟動pod?
- 新的機器當作Node,誰做把機器加入為K8s Node的動作?
以上這些管理的processes都是由Master Nodes(the Control Plane)決定!
master Node解說:
在master Node中必然有四個東西在運行來控制各個worker Node:
- Api Server
- Scheduler
- Controller Manager
- etcd
以下逐一解說其功能:
Api Server:
- 就好像K8s cluster的gateway一樣
- 透過K8s cluster外部的client(或UI介面,CLI,K8s API)對Api Server發動請求
- 請求可能是Update或Query
- 且Api Server也扮演關卡角色做authentication(不然隨便被Update就GG)
- 不管是做pod的排程變更,佈署新APP pod,建新Service,或控制其他K8s元件,或只是看看cluster狀態等等...都要透過請求Api Server
- 這也是唯一K8s cluster的entrypoint!
Scheduler:
考量到當發動一個Schedule請求到Api Server,要求執行Scheduler建立pod
可能的順序如下圖(右邊)及以下解說
- 請求透過API Server轉發給Scheduler
- Scheduler內會決定pod該建立在哪一個Node
- 其中Scheduler會參考Node的Resources剩餘量與請求所需的Resources
- (CPU/REM…etc)或哪個Node沒那麼忙的先決定佈署pod
- 最終要在某個Node建立pod的則是Kubelet!!!
Controller Manager:
- 隨時偵測cluster狀態(包含pod,Node狀態)
- 當發現某個pod掛了,就會發動請求給Scheduler
- 通過Scheduler考量後再決定pod要佈署在哪個Node
- 再交給Kubelet去處理啟動/建立pod
etcd:
- 是一個key value的儲存空間
- 可以當作是cluster的大腦,儲存了所有cluster的異動
- Scheduler與Controller Manager兩者運作都仰賴etcd的資料
- 例如Scheduler怎麼知道哪個worker Node的Resources比較充足可以放新的Pod? etcd提供資料!
- 任何的Pod建立或掛掉的狀態變化都會被紀錄在etcd之中
- 但是Pod內的APP本身產生的Data,etcd則不負責儲存!
- 另外etcd儲存資料的方式也是分散的(因為master Node可以多個!!)
- 並且如上圖,API Server可以做Load Balance
一般情況下最簡單的配置可能是:
2 x master Node + 3 x worker Node
並請注意經過上面解說後可以理解到
master:其運作非常重要,但所需要的Resource(CPU/REM/空間…etc)較少
worker:工作量大,需要的Resource較多
當越來越多程式改考量run在K8s cluster上時
可能就要考慮橫向擴展Node數量例如變成
3 x master Node + 6 x worker Node(之類的)
而擴展機台做法就是在空機台上...
將定義master空機台上裝好並運行:
- Api Server
- Scheduler
- Controller Manager
- etcd
將定義worker空機台上裝好並運行:
- Kubelet
- Kube proxy
- Container runtime
然後加進K8s cluster!