網際網路編程隨時代發展,現在也是開發的重中之重,沒得辦法,雖然身在傳統crud中,那也不能不學習不是,這不,最近在看K8S的一份文檔,自我感覺不錯,但是出於個人的習慣,我比較習慣整理知識圖譜和做筆記
下面和大家分享我的學習筆記和做的知識圖譜,和大家進行交流
先展示思維導圖
由於所由筆記展現較多,這裡先暫時展示一部分和大家分享,若是大家還想交流,我後期會繼續更新
註:有需要我的思維導圖以及學習參考文檔的,可以關注+轉發後,私信「資料」即可獲取
k8s是什麼: 一個開源的容器集群管理平臺,可提供容器集群的自動部署,擴縮容,維護等功能。分為管理節點Master和工作節點Node
核心組件:
分層架構:
apiVersion : v1 用來標識版本
kind : Pod/Service 類型可選Pod Service等
metadata: name: nameSpace:
靜態pod 是由kubelet進行管理創建的只存在於特定Node上的Pod,kubelet無法對其進行靜態檢查,且一般只存在於kubelet所在的節點上。
且無法通過API server進行管理,也不會和ReplicationController Deployment產生關聯。
創建方式: yml文件【配置文件】或者http請求
如何刪除: 無法通過API server進行管理,所以Master無法對靜態pod進行刪除【狀態更新為pending】。刪除只能通過所在的node節點刪除配置文件
在同一個pod內的容器可以共享pod級別的volume
pod可以通過k8s提供的集群化配置管理方案 configMap來實現配置信息和程序分離。
創建方式: yaml文件
生命周期 在系統內被定義為各種狀態。可以分為 Pending Running Succeeded Failed Unknow
重啟策略 應用於Pod內的所有容器,並由Pod所在node節點上的kubelet進行狀態判斷和重啟。當容器異常退出或者健康檢查狀態失敗的時候,kubelet會根據所設置的重啟策略重新啟動該container
重啟的間隔時間以設定的間隔時間的2n來計算,且在成功重啟的10分鐘後重置該時間。
不同的控制器對Pod的重啟策略的要求是不一樣的:
pod的健康檢查可使用2類探針: LivenessProbe 和ReadinessProbe
LivenessProbe 探針的實現方法
全自動調度,用戶配置好應用容器的副本數量後RC會自動調度+持續監控始終讓副本數量維持在規定的個數當中。
調度算法 系統內置的調度算法/NodeSelector/NodeAffinity
和RC類似,不同之處在於DaementSet控制每一臺Node上只允許一個Pod副本實例,適用於需要單個Node運行一個實例的應用:
批處理模型
這裡在項目中的具體應用待更新,現在項目所用的k8s 調度模型【後續會單獨寫篇文章更新】
手動更新 kubectl scale命令更新RC的副本實例數量
自動更新 使用HAP控制器,基於在controller-manager設置好的周期,周期性的對Pod的cup佔用率進行監控,自動的調節RC或者Deployment中副本實例進行調整來達到設定的CPU佔用率。
service可以為一組具有相同功能的容器提供一個統一的入口地址,並將請求負載進行分發到後端各個容器應用上。
因為RC配置的副本實例數量為2 所以可得2個可用的Pod EndPoint 分別為172.17.172.3:80 172.17.172.4:80 無論任何一個Pod出現問題,kubelet 會根據重啟策略對Pod進行重新啟動,再次查詢PodIP會發現PodIP發生變化
因為Pod的不可靠,重新啟動被k8s調度到其他Node上會導致實例的endpoint不一樣。且在分布式部署的情況下,多個容器對外提供服務,還需要在Pod前自己動手解決負載均衡的問題,這些問題都可通過SVC解決。
創建方式 : kubectl expose命令/配置文件
kubectl expose命令
配置文件方式啟動
定義的關鍵在於 selector 和ports
負載分發策略 RoundRobin/SessionAffinity/自定義實現
思路是把SVC或者pod的虛擬埠映射到宿主機的埠,使得客戶端應用可以通過宿主機埠訪問容器應用。
將容器應用的埠號映射到主機
1 容器級別 設置hostPort = prodNum yaml中的配置表為hostPort: 8081,指的是綁定到的宿主機埠。HostPort和containerPort可以不相等
2 Pod級別 設置hostNetWork = true 這時候設置的所有的containerPort 都會直接映射到宿主機相同的埠上。默認且必須是HostPort = containerPort,若顯示的指定HostPort和containerPort不相等則無效。
將SVC埠號映射到主機
關鍵配置為 kind = service type = NodePort nodePort = xxxxx,同時在物理機上對防火牆做對應的設置即可。
可以直接完成服務名稱到ClusterIP的解析。由以下部分組成
主要提供了各類資源對象【SVC Pod RC】等的增刪查改以及Watch等Http Rest接口,是各個模塊之間的數據交互和通訊的樞紐。
Kubernetes API Server : 提供API接口來完成各種資源對象的創建和管理,本身也是一個SVC 名稱為Kubernetes
Kubernetes Proxy API :負責把收到的請求轉到對應Node上的kubelet守護進程的埠上,kubelet負責相應,來查詢Node上的實時信息 包括node pod SVC等 多用於集群外想實時獲取Node內的信息用於狀態查詢以及管理。 【kubelet也會定時和etcd 同步自身的狀態,和直接查詢etcd存在一定的差異,這裡強調實時】
集群模塊之間的通信: 都需要通過API Server 來完成模塊之間的通信,最終會將資源對象狀態同步到etcd,各個集群模塊根據通過API Server在etcd定時同步信息,來對所管理的資源進行相應處理。
集群內部的管理中心,負責集群內部的Node Pod Endpoint Namespace 服務帳號(ServiceAccount)資源定額(ResourceQuota)等的管理。出現故障時候會嘗試自動修復,達到預期工作狀態。
一般我們把資源對象 Replication Controller 簡寫為RC 是為了區別於Controller Manager 中的Replication Controller【副本控制器】,副本控制器是通過管理資源對象RC來達到動態調控Pod的
副本控制器Replication Controller的作用:
Node節點在啟動時候,會同kubelet 主動向API Server匯報節點信息,API Server將節點信息存儲在etcd中,Node Controller通過API Server獲取到Node的相關信息對Node節點進行管理和監控。
節點狀態包括:就緒 未就緒 未知三種狀態
資源配額管理,確保指定資源對象在任一時刻不會超量佔用系統物理資源。支持以下維度的系統資源配額管理
用戶通過API server 設置的Namespace會保存在etcd中,Namespace Controller會定時的獲取namespace狀態,根據所得狀態對不同的namespace進行相應的刪除,釋放namespace下對應的物理資源。
Endpoints 表示一個svc對應的所有的pod的訪問地址,Endpoint Controller是負責維護和生成所有endpoint對象的控制器。
每個Node對應的kube-proxy獲取到svc對應的Endpoints來實現svc的負載均衡。
Scheduler 主要是接受controller Manager創建的pod為Pod選定目標Node,調度到合適的Node後,由Node中的kubelet負責接下來的管理運維。
過程中涉及三個對象 待調度的Pod列表,空閒的Node列表,調度算法和策略。
也就是根據調度算法和策略為待調度的每個Pod從空閒的Node中選擇合適的。 隨後kubelet通過API Server監聽到Pod的調度事件,獲取對應的Pod清單,下載Image鏡像,並啟動容器。
1【預選調度】遍歷所有的Node節點,選出合適的Node
2優選策略確定最優節點
每個Node節點中都會啟動一個Kubelet,該進程用於處理Master節點下發到本節點的任務,管理Pod以及Pod中的容器,每個Kubelet都會向API Server註冊自身信息,定期和Master節點匯報Node節點資源使用情況。
使用2類探針LivenessProbe 和ReadinessProbe
使用cAdvisor
總結:kubelet 作為連接K8s Master節點機和Node機器的橋梁,管理運行在Node機器上的Pod和容器,同時從cAdvisor中獲取容器使用統計信息,然後通過API Server上報資源使用信息。
SVC是對一組提供相同服務Pod的抽象,會根據訪問策略來訪問這一組Pod。在每一個Node節點上都存在一個Kube-proxy,可以在任意Node上發起對SVC的訪問請求。
SVC的ClusterIp和NodePort等概念是kube-proxy服務通過IPtables的NAT轉換實現重定向到本地埠,再均衡到後端的Pod
待補充
k8s+Docker 網絡原理常常涉及到以下問題
IP-per-Pod:每個Pod都有自己獨立的IP,無論是否處於同一個Node節點,Pod直接都可以通過IP相互訪問。同時Pod內的容器共享一個網絡堆棧【=網絡命名空間 包括IP位址,網絡設備,配置等】按照這個網絡模型抽象出來的一個Pod對應一個IP也叫IP-per-Pod
Pod內部應用程式看到的自己的IP+port和pod外部的應用程式看到的IP+port是一致的,他們都是Pod實際分配的ip地址,從docker0上分配的。這樣可以不用NAT來進行轉換,設計的原則是為了兼容以前的應用 。
K8S對網絡的要求:
由於網絡命名空間以及Veth設備對是建立在同一個linux內核的基礎上。所以Docker的跨主機通訊處理的不夠友好。
bridge模式 : 也是docker默認的網絡模型,在這個模型下Docker第一次啟動會創建一個新的網橋 大名鼎鼎的docker0,每個容器獨享一個網絡命名空間,且每一個容器具有一個Veth設備對,一端連接容器設備eth0一端連接網橋,docker0。如下圖:
同一個Pod內的容器共享同一個網絡命名空間,可以直接使用Localhost進行通訊,不同Pod之間容器的通訊可以理解為Pod到Pod OR Pod到SVC之間的通訊
可以分為同一個Node內Pod之間的通訊&不同Node內Pod之間的通訊
同一Node中Pod的默認路由都是docker0的地址,由於它們關聯在同一個docker0網橋上,地址網段相同,可以直接進行通訊。
docker0網段和宿主機的網卡是2個不同的IP段,Pod地址和docker0處於同一網段。所以為了使不同Node之間的Pod可以通訊,需要將PodIP和所在Node的IP進行關聯且保證唯一性。
SVC是對一組Pod服務的抽象,相當於一組服務的負載均衡。且對外暴露統一的clusterIP,所以Pod到SVC之間的通訊可以理解為Pod到Pod之間的通訊
集群外和內部組件之間通訊,將Pod OR SVC埠綁定到物理機埠即可。
好了,就展示到這裡,歡迎大家評論區和我交流,指出筆記中的錯誤,大家一起成長
獲取資料,關注我,私信「資料」即可