記錄在過去面試中常被問到的問題,以及依據自己的理解與查找到的資料,整理對應的回覆

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 會如何運作整個流程 ?

  1. User 發送 deploy request 給 kube-apiserverkube-apiserver 驗證 User 並驗證是否為有效的 request。
  2. 將有效的 request 更新到 ETCD
  3. ETCD 回覆 kube-apiserver 更新已完成。
  4. kube-scheduler 會持續監測 kube-apiserver,此時發現有一個新的 pod 還沒有被指派到 work nodekube-scheduler 會選擇符合條件的 work node
  5. kube-scheduler 通知 kube-apiserver ,規畫將新的 pod 分配到指定的 work node
  6. kube-apiserver 通知 work node 上的 kubelet,有新的 pod 需要部署到 work node 上。
  7. kubelet 嘗試將新的 pod 部署到 work node 上,並持續監測 pod 的狀態。
  8. 新的 pod 開始部署到 work node
  9. 新的 pod 部署完成。 kubelet 監測到 pod 已部署 (但不保證 pod 上的應用執行是否成功)。
  10. kubelet 通知 kube-apiserver 新的 pod 已部署到 work node
  11. kube-apiserverpod 部署資訊更新到 ETCD
  12. ETCD 回覆 kube-apiserver 更新已完成。
  13. 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)進行綁定。