K8S
容器編排系統
容器編排系統需要滿足的條件:
- 服務注冊,服務發現
- 負載均衡
- 配置、存儲管理
- 健康檢查
- 自動擴縮容
- 零宕機
K8S整體架構圖
K8S整體架構
Kubernetes采用主從分布式架構,包括Master(主節點)、Worker(從節點或工作節點),以及客戶端命令行工具kubectl和其它附加項。
K8S Master
Master架構圖
etcd保存了整個集群的狀態,CoreOS提供(用戶期望狀態)。K/V存儲,只能存儲Api Server中支持的數據范式存儲;
Api Server提供了資源操作的唯一入口,并提供認證、授權、訪問控制、API注冊和發現等機制;
controller負責維護集群的狀態,比如故障檢測、自動擴展、滾動更新等(確保用戶期望狀態與實際運行狀態一致);
scheduler負責資源的調度,按照預定的調度策略將Pod調度到相應的機器上,pod是調度的最小單位;
K8S Node
Node架構圖
kubelet:會監控Api Server上的資源變動,若變動與自己有關系,kublet就去執行任務;定期向master會報節點資源使用情況。
kube-proxy:實現service的抽象,為一組pod抽象的服務提供統一接口并提供負載均衡。
POD創建過程
POD創建時序圖
1、用戶提交創建POD請求
2、API Server 處理用戶請求,存儲Pod數據到Etcd
3、Schedule通過和 API Server的監聽機制,查看到新的pod,嘗試為Pod綁定Node
4、過濾主機:調度器用一組規則過濾掉不符合要求的主機,比如Pod指定了所需要的資源,那么就要過濾掉資源不夠的主機
5、主機打分:對第一步篩選出的符合要求的主機進行打分,在此階段,調度器會考慮一些整體優化策略,比如把一個Replication Controller的副本分布到不同的主機上,使用最低負載的主機等
6、選擇主機:選擇得分最高的主機,進行binding操作,結果存儲到Etcd中
7、kubelet根據調度結果執行Pod創建操作:綁定成功后,會啟動container, Docker run, scheduler會調用API Server的API在etcd中創建一個bound pod對象,描述在一個工作節點上綁定運行的所有pod信息。運行在每個工作節點上的kubelet也會定期與etcd同步bound pod信息,一旦發現應該在該工作節點上運行的bound pod對象沒有更新,則調用Docker API創建并啟動pod內的容器
8、POD創建完成
K8S各組件工作流程
工作流程
①運維人員向kube-apiserver發出指令(我想干什么,我期望事情是什么狀態)
②api響應命令,通過一系列認證授權,把pod數據存儲到etcd,創建deployment資源并初始化。(期望狀態)
③controller通過list-watch機制,監測發現新的deployment,將該資源加入到內部工作隊列,發現該資源沒有關聯的pod和replicaset,啟用deployment controller創建replicaset資源,再啟用replicaset controller創建pod。
④所有controller被創建完成后.將deployment,replicaset,pod資源更新存儲到etcd。
⑤scheduler通過list-watch機制,監測發現新的pod,經過主機過濾、主機打分規則,將pod綁定(binding)到合適的主機。
⑥將綁定結果存儲到etcd。
⑦kubelet每隔 20s(可以自定義)向apiserver通過NodeName 獲取自身Node上所要運行的pod清單.通過與自己的內部緩存進行比較,新增加pod。
⑧kubelet創建pod。
⑨kube-proxy為新創建的pod注冊動態DNS到CoreOS。給pod的service添加iptables/ipvs規則,用于服務發現和負載均衡。
⑩controller通過control loop(控制循環)將當前pod狀態與用戶所期望的狀態做對比,如果當前狀態與用戶期望狀態不同,則controller會將pod修改為用戶期望狀態,實在不行會將此pod刪掉,然后重新創建pod。
后記
本文是對K8S架構原理及其工作流程的一個匯總,可能會不好理解,但是在學習K8S過程中,這個是跳不過去的,讓我們一起努力吧!