↓ Skip to main content
還記得多少 Kubernetes
  1. Posts/

還記得多少 Kubernetes

·3 mins

為什麼要用 Kubernetes?

去年考了 CKAD 證照,是在官方給的環境下考實作。這篇來回顧當時畫的筆記,順便把腦中零散的記憶撿起來。

跑在 OS 上的 python 程式

古早時候,我們在自己的電腦寫好 python 程式,但當換到另一台電腦要執行時,可能就會遇到各種報錯。一開始,大家習慣用 VM 來隔離環境,不過起一台 VM 常常需要好幾分鐘,因為每台 VM 都像一台完整的電腦,有獨立的 OS。

後來 container 的概念出現,它讓程式共用主機的 OS kernel,同時彼此在隔離的環境下運行。為了免去每次都要手動裝相依套件的麻煩,我們把整個 application、dependency 與設定檔打包成一個 image。image 變成一個可攜帶的單位,就算換了環境,在別台電腦也可以順利的執行。也就是說 image 解決了環境差異的問題,而 image 跑起來的 instance 就是 container。

之後有了 Docker 提供一套完整的工具鏈,讓打包和部署程式的流程變得比較簡單,包括 build image (寫 Dockerfile)、把 image 上傳到 registry 儲存 (例如 Docker Hub)、以及 run container。相較於 VM,當系統需要 scale (水平擴展) 時,大多會用 Docker,因為起一個 container 只需要幾秒鐘。另外,由於 image 會有權限問題,registry 也會區分為 public 和 private。

當 inline 上的熱門餐廳三天前才開放訂位

隨著 container 越來越好用,它在微服務架構中也開始流行。在微服務中,服務拆得越細、數量越多,啟動快和省資源的優點就越明顯。但當運行的 container 數量一多,人工管理的成本就越高,比如部署、health check、scale、故障恢復等。

於是 Kubernetes (K8s) 這個 orchestration 出現了,它是一個開源系統,在 cluster 內提供鬆散耦合的機制,來方便管理大量的 container。

cluster 的核心元素包含 control plane 和 node。control plane 負責管理整個 cluster,預設不會被拿來跑一般的 workload,其中的元件包括 API Server (唯一的入口;cluster 裡不管是誰要做什麼操作,都只能透過這個窗口)、etcd、Scheduler、Controller Manager。而 node 則負責執行 container,並搭配 kubelet 去跟 control plane 溝通。在正式環境中,為了提高容錯與高可用性,node 通常不只一台,它們可以是實體機、地端 VM 或雲端 VM。

K8s cluster 的架構範例

在 K8s 裡,Pod 是最小的部署單位,我們的 python 程式就是在 Pod 上跑。K8s 是宣告式的操作模式,只要透過 yaml 定義好期望的樣貌,剩下的 K8s 會自己想辦法達成,比如告訴它要用哪個 image,但不用告訴它在哪台機器上跑。實際操作時,就是寫好 yaml,搭配一連串 kubectl 指令丟給 API Server,接著再確認 Pod 狀態,東西壞掉了就進去 debug。

作為使用者的角度

最前面這台 client machine (操作端),就像拿著鑰匙的訪客,上面有 kubectl 執行檔,和 kubeconfig 紀錄著要用什麼身份驗證、並連去哪個 API Server。類似的概念,CKAD 考試是在一個遠端虛擬機中操作,它的環境已經預先裝好 kubectl,我們再連去考試的 cluster。另外,因為考題會牽涉到多個 cluster,我們需要在不同 cluster 之間切換。這也是常考的小細節,先確認自己在對的 context 再動手,不然切錯 cluster 就扣分囉。

Reply by Email