記錄在過去面試中常被問到的問題,以及依據自己的理解與查找到的資料,整理對應的回覆
Q1. K8s 有哪些 components ?
Master Node
← 管理 cluster、儲存不同 node 的資訊、規劃 containers 的去向,以及 monitor node 上的 containers
kube-apiserver
← 管理整個 K8s 的 interface。使用者可以透過下達指令給 kube-apiserver ,以達到管理 K8s resources 的目的。etcd cluster
← 儲存 K8s cluster 內,所有 node 、 containers 的資訊kube-scheduler
← 依據 containers 的需求,包含但不限於: cpu、 menory、 affinity 、 taints and tolerations 、anti-* 等等,規劃將 containers 指派給符合需求的 node。controller manager
← 管控 K8s cluster 內的 resources 。
如 node controller 管理 nodes : 加入新 node 到 cluster、處理 node 變的不可用的狀況
Work Nodes
← 託管執行應用的 containers
kubelet
← K8s cluster 在 work nodes 上的代理,偵聽 kube-apiserver 的指令,並依據需求部署或銷毀 containers。 kube-apiserver 週期性的從kubelet 獲取 work node 和 containers 的狀態。kube-proxy
← 讓 work node 之間的 containers 可以互相溝通。container runtime engine
← 執行包含應用的 containers
Q2. 部署一個應用到 K8s 時,K8s 會如何運作整個流程 ?
User
發送 deploy request 給kube-apiserver
。kube-apiserver
驗證 User 並驗證是否為有效的 request。- 將有效的 request 更新到
ETCD
。 ETCD
回覆kube-apiserver
更新已完成。kube-scheduler
會持續監測kube-apiserver
,此時發現有一個新的pod
還沒有被指派到work node
,kube-scheduler
會選擇符合條件的work node
。kube-scheduler
通知kube-apiserver
,規畫將新的pod
分配到指定的work node
。kube-apiserver
通知work node
上的kubelet
,有新的pod
需要部署到work node
上。kubelet
嘗試將新的pod
部署到work node
上,並持續監測pod
的狀態。- 新的
pod
開始部署到work node
。 - 新的
pod
部署完成。kubelet
監測到pod
已部署 (但不保證pod
上的應用執行是否成功)。 kubelet
通知kube-apiserver
新的pod
已部署到work node
。kube-apiserver
將pod
部署資訊更新到ETCD
。ETCD
回覆kube-apiserver
更新已完成。kube-apiserver
回覆User
新的pod
已部署到work node
。
Q3. 對於在 K8s 上建置正式環境 (Product) 和測試環境 (Development)的規劃
- 在 K8s 分別建立 Product 和 Development 的 namespace,並可透過指令 kubectl apply -f {YAML file} -n [ Product | Development ] ,將需要的 resources 部署到對應的 namespace 。
- 若需要權限管理,則透過 RBAC 進行設置。我常見的作法是先建立 K8s 的 service account 、建立 Role 或 ClusterRole 並設定可操作的 resources 與對應的 verbs,最後透過 RoleBinding 或 ClusterRoleBinding 將 service account 和 Role(或ClusterRole)進行綁定。