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