1. 程式人生 > 其它 >面試答案-簡單回答k8s容器啟動的過程

面試答案-簡單回答k8s容器啟動的過程

技術標籤:面試

kubernetes 核心元件:

  1. master元件

kube-apiserver 提供了資源操作的唯一入口,任何資源的請求/呼叫操作都是通過它,並提供認證,授權,訪問控制,API 註冊和發現機制
kube -controller-manager 叢集控制器,負責維護叢集的狀態,比如故障檢測,自動擴充套件,滾動更新等
kube- scheduler 負責資源的排程,按照預定的排程策略將pod排程到相應的機器上,為pod選擇一個node
etcd 儲存了整個叢集的狀態資訊,分散式鍵值對(k/v)儲存服務
core DNS 第三方外掛,提供叢集的dns服務,實現服務註冊和服務發現,為service提供dns記錄

  1. Node 元件

kubelet 負責維護容器的生命週期,同時也負責volume(CVI )和網路(CNI )的管理
kube- proxy 負責為service提供cluster內部的服務發現和負載均衡(負責將後端pod訪問規則具體為節點上的iptables/ipvs規則)
container runtime (docker)負責映象管理以及pod和容器的真正執行(CRI)

建立replicaset工作流程:

a. 首先通過kubectl命令或api介面方式向apiserver發起建立replicaset的請求,api響應命令,通過一系列認證授權,比如通過kubectl apply -f xx.yaml或kubectl create等方式。

b. apiserver將要建立replicaset的資訊儲存為yaml,再寫入etcd。截至目前,僅僅在ectd中加入一條資訊,沒有實際的進展。

c. Control manager通過list watch監控到apiserver資料變化,apiserver在etcd中讀取到需要建立rs的需求,然後control manager呼叫apiserver介面獲取建立多少個pod的資訊,apiserver將資訊同步更新儲存在etcd中。

d. scheduler檢測到未繫結 Node 的 Pod,通過list watch呼叫apiserver介面在etcd中獲取到相應資訊,執行排程策略,先經過過濾不滿足的node預選策略,再通過pod優選策略最終決定將pod排程到哪個node上,apiserver將資訊同步更新儲存在etcd中。

e. 被選中node的kubelet將通過list watch 實時監控apiserver讀取etd資料,檢測到有新的 Pod 排程過來,通過 Container Runtime 執行該 Pod,Kubelet 通過 Container Runtime 取到 Pod 狀態,並更新到 API Server 中,並同步更新寫入到etcd中。

建立pod工作流程:

建立pod的工作流程大體和建立rs工作流程差不多,具體差異是pod不再受rs的管理。

a. 使用者通過 REST API 建立一個 Pod

b. API Server 將其寫入 etcd

c. Scheduluer 檢測到未繫結 Node 的 Pod,開始排程並更新 Pod 的 Node 繫結

d. Kubelet 檢測到有新的 Pod 排程過來,通過 Container Runtime 執行該 Pod

e. Kubelet 通過 Container Runtime 取到 Pod 狀態,並更新到 API Server 中,並同步更新寫入到etcd中。

建立deployment工作流程:

k8s 用yaml建立Deployment的流程:

1. 使用者通過 kubectl 建立 Deployment。
2. Deployment 建立 ReplicaSet。
3. ReplicaSet 建立 Pod。

k8s api建立deployment流程
api server -> etcd -> controller manager -> etcd -> scheduler -> etcd -> kubelet


1.kubectl提交建立pod命令,api響應命令,通過一系列認證授權,把pod資料儲存到etcd,建立deployment資源並初始化.

2.controller通過list-watch機制,監測發現新的deployment,將該資源加入到內部工作佇列,發現該資源沒有關聯的pod和replicaset,啟用deployment controller建立replicaset資源,再啟用replicaset controller建立pod.

3.所有controller正常後.將deployment,replicaset,pod資源更新儲存到etcd.
4.scheduler通過list-watch機制,監測發現新的pod,經過主機過濾主機打分規則,將pod繫結 (binding)到合適的主機.

5.將繫結結果儲存到etcd.
6.kubelet每隔 20s(可以自定義)向kube-apiserver通過NodeName 獲取自身Node上所要執行的pod清單.通過與自己的內部快取進行比較,新增加pod.

7.啟動pod啟動容器.

8.把本節點的容器資訊pod資訊同步到etcd.