kubernetes 創建Pod 的 工作流:
step.1
kubectl 向 k8s api server 發起一個create pod 請求(即我們使用Kubectl敲一個create pod命令) 。
step.2
k8s api server接收到pod創建請求后,不會去直接創建pod;而是生成一個包含創建信息的yaml。
step.3
apiserver 將剛才的yaml信息寫入etcd數據庫。到此為止僅僅是在etcd中添加了一條記錄, 還沒有任何的實質性進展。
step.4
scheduler 查看 k8s api ,類似於通知機制。
首先判斷:pod.spec.Node == null?
若為null,表示這個Pod請求是新來的,需要創建;因此先進行調度計算,找到最“閑”的node。
然后將信息在etcd數據庫中更新分配結果:pod.spec.Node = nodeA (設置一個具體的節點)
ps:同樣上述操作的各種信息也要寫到etcd數據庫中中。
首先判斷:pod.spec.Node == null?
若為null,表示這個Pod請求是新來的,需要創建;因此先進行調度計算,找到最“閑”的node。
然后將信息在etcd數據庫中更新分配結果:pod.spec.Node = nodeA (設置一個具體的節點)
ps:同樣上述操作的各種信息也要寫到etcd數據庫中中。
step.5
kubelet 通過監測etcd數據庫(即不停地看etcd中的記錄),發現 k8s api server 中有了個新的Node;
如果這條記錄中的Node與自己的編號相同(即這個Pod由scheduler分配給自己了);
則調用node中的docker api,創建container。
如果這條記錄中的Node與自己的編號相同(即這個Pod由scheduler分配給自己了);
則調用node中的docker api,創建container。
kubernetes 創建 ReplicaSet 的 工作流:
ReplicaSet與Pod的不同,就是在流程中增加了與“備份機制”相關的步驟。
step.1
kubectl 發起 create replicaSet 請求
step.2
k8s api server 接受 replicaSet 創建請求,創建yaml。
step.3
k8s api server將yaml的信息寫入etcd數據庫。
step.4
Controller-Manager中的ReplicaSetController,在etcd數據庫中讀到了新的replicaSet 信息后,
向k8s api server發起請求,創建3個Pod(個數可以自己指定)。
向k8s api server發起請求,創建3個Pod(個數可以自己指定)。
step.5
scheduler 在etcd中讀到相應信息
若 3pod.spec.Node == null
則執行調度計算,找到最“閑”的若干個Node(如果有一個Node真的太閑,可能3個Pod都會被起在這個Node上面)
pod1.spec.Node = nodeA (更新記錄)
pod2.spec.Node = nodeB
pod3.spec.Node = nodeA (Node都是隨機分配的)
若 3pod.spec.Node == null
則執行調度計算,找到最“閑”的若干個Node(如果有一個Node真的太閑,可能3個Pod都會被起在這個Node上面)
pod1.spec.Node = nodeA (更新記錄)
pod2.spec.Node = nodeB
pod3.spec.Node = nodeA (Node都是隨機分配的)
將這些信息寫回etcd數據庫中。
step.6
nodeA 的 kubelet 讀etcd時讀到apiserver的信息,調用docker api;創建屬於自己的pod1/pod3的container
step.7
nodeB kubelet 讀到 k8s api server的信息,調用docker api,創建pod2的container。
注意:api server負責各個模塊之間的通信。集群內的各個功能模塊通過APIServer將信息存入etcd,當需要獲取和操作這些數據時,則通過APIServer提供的REST接口(用GET、LIST或WATCH)來實現。