記錄在過去面試中常被問到的問題,以及依據自己的理解與查找到的資料,整理對應的回覆
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)進行綁定。