replicaSet controller list/watch 資源變化并發(fā)起創(chuàng)建 pod 請求
scheduler 檢測到未綁定的 pod 資源,通過一系列匹配以及過濾選擇合適的 node 進行綁定
kubelet 發(fā)現(xiàn)自己 node 上需創(chuàng)建新 pod,負責 pod 的創(chuàng)建及后續(xù)生命周期管理
kube-proxy 負責初始化 service 相關(guān)的資源,包括服務(wù)發(fā)現(xiàn)、負載均衡等網(wǎng)絡(luò)規(guī)則
至此,經(jīng)過 kubenetes 各組件的分工協(xié)調(diào),完成了從創(chuàng)建一個 deployment 請求開始到具體各 pod 正常運行的全過程。
Pod
在 kubernetes 眾多的 api 資源中,pod 是最重要和基礎(chǔ)的,是最小的部署單元。首先我們要考慮的問題是,我們?yōu)槭裁葱枰?pod?pod 可以說是一種容器設(shè)計模式,它為那些”超親密”關(guān)系的容器而設(shè)計,我們可以想象 servelet 容器部署 war 包、日志收集等場景,這些容器之間往往需要共享網(wǎng)絡(luò)、共享存儲、共享配置,因此我們有了 pod 這個概念。對于 pod 來說,不同 container 之間通過 infra container 的方式統(tǒng)一識別外部網(wǎng)絡(luò)空間,而通過掛載同一份 volume 就自然可以共享存儲了,比如它對應(yīng)宿主機上的一個目錄。
簡單來說,不同 pod 之間通過 cni0/docker0 網(wǎng)橋?qū)崿F(xiàn)了通信,node 訪問 pod 也是通過 cni0/docker0 網(wǎng)橋通信即可。而不同 node 之間的 pod 通信有很多種實現(xiàn)方案,包括現(xiàn)在比較普遍的 flannel 的 vxlan/hostgw 模式等。flannel 通過 etcd 獲知其他 node 的網(wǎng)絡(luò)信息,并會為本 node 創(chuàng)建路由表,最終使得不同 node 間可以實現(xiàn)跨主機通信。
微服務(wù)—service
在了解接下來的內(nèi)容之前,我們得先了解一個很重要的資源對象:service。我們?yōu)槭裁葱枰?service 呢?在微服務(wù)中,pod 可以對應(yīng)實例,那么 service 對應(yīng)的就是一個微服務(wù)。而在服務(wù)調(diào)用過程中,service 的出現(xiàn)解決了兩個問題:
pod 的 ip 不是固定的,利用非固定 ip 進行網(wǎng)絡(luò)調(diào)用不現(xiàn)實
服務(wù)調(diào)用需要對不同 pod 進行負載均衡
service 通過 label 選擇器選取合適的 pod,構(gòu)建出一個 endpoints,即 pod 負載均衡列表。實際運用中,一般我們會為同一個微服務(wù)的 pod 實例都打上類似app=xxx的標簽,同時為該微服務(wù)創(chuàng)建一個標簽選擇器為app=xxx的 service。