k8s 初探+簡介
從公司的轉型需求講起:為什麼會從虛擬機走到 Docker,又為什麼需要 Kubernetes 來管這些容器。這篇介紹 K8S 是什麼、它解決什麼問題、整體架構長什麼樣,以及有哪些核心元件。
30 篇 · k8s 核心物件 → EKS 上雲
2019 年的 iThome 鐵人賽,作者把 Kubernetes 從入門帶到實務,三十篇的順序刻意設計成可以照著讀:先回頭複習 Docker 與常用指令,再用 minikube 建一個本機測試環境,接著才拆解 Node、Master、Object 這些容易混淆的架構名詞。
中段依序走過基礎篇(Pod、Deployment、Service)、進階篇(Ingress、Volume、StatefulSet、DaemonSet、Affinity 與 Taints)、管理篇(Monitoring、Resource Quota、RBAC)與實務篇(EKS 上雲、Helm、HPA/CA、EBS/EFS)。系列的特色是同一組概念講兩次:先在本機叢集操作,再到 AWS EKS 上重做一遍,兩者差異之處正好是需要留意的地方。
適合正在把服務搬上叢集,或想弄清楚每個資源物件為何存在的人。
從公司的轉型需求講起:為什麼會從虛擬機走到 Docker,又為什麼需要 Kubernetes 來管這些容器。這篇介紹 K8S 是什麼、它解決什麼問題、整體架構長什麼樣,以及有哪些核心元件。
要理解 k8s 好在哪,得先回到 Docker 把觀念補齊。這篇快速複習容器、映像與相依性管理,說明單機部署的限制在哪,也為後面三十天的 Kubernetes 內容先打好底。
在正式上線之前,先在自己電腦上架一個小型的 k8s 來驗證服務,用的就是 minikube。這篇從 macOS 的虛擬化檢查、kubectl 安裝到啟動虛擬機一步步來,也說明其他系統該怎麼做。
用了 Docker 再看 k8s,最常見的困惑就是「那我原本那些指令怎麼辦」。這篇把兩邊的常用指令並排對照,說明哪些習慣可以沿用、哪些要換成 kubectl,最後附上指令速查表。
從節點角度看 k8s 架構:Node 是實際跑 Pod 的工作機器,Master 負責調度與管理,兩者分工決定叢集能不能撐住。這篇說明 Node 的角色、它有哪些狀態,並實際操作一次節點管理。
k8s 裡的 Object 與 Abstraction 常被混著講,但兩者不在同一個層次。這篇先回顧節點架構,再說明每個 Pod 為何都要有自己的 YAML,以及抽象化讓 k8s 能管住這麼多資源的關鍵。
講完 Docker 與 k8s 架構後,回頭看整個 DevOps 流程長什麼樣子。這篇用十二個要素(Codebase、Dependencies、Config 等)拆解從寫程式到部署的完整流程,說明 k8s 站在哪一段。
基礎篇第一課,從最小的部署單位開始:Pod 是什麼、為什麼要有 Label 來分類與選取、Health check 怎麼判斷容器還活著,以及流量進來時怎麼做水平擴縮。
基礎篇第二課:Deployment 與 ReplicaSet 怎麼管理副本數量、版本更新的滾動過程、出問題時怎麼 rollback,以及 Service 如何把流量導到正確的 Pod,還補上 Secrets。
進入進階篇:同一個 Pod 內的容器用 localhost 就能互通,但跨 Pod 就得靠 Service Discovery。這篇說明這機制怎麼運作、ConfigMap 怎麼把設定抽出來,並附上兩個實際範例。
這篇講兩件影響整個叢集規劃的事:Ingress 負責把外部流量導進叢集,Volume 則決定資料要放在哪裡。文中示範降低負載與完美分流兩種情境,也補上 PodPreset 的用法。
有狀態的服務不能隨便重啟,這就是 StatefulSet 存在的理由:每個 Pod 都有固定編號與身分。這篇說明它跟 Deployment 的差別、怎麼擴縮與更新,也介紹跑在每台節點的 DaemonSet。
調度器預設會自己挑節點,但真實場景常需要指定:哪些服務該靠近、哪些絕對不能放一起。這篇說明 Node 與 Pod 的親和/反親和性怎麼設定,以及 Taints 與 Tolerations 的搭配。
管理篇第一篇,從怎麼「用」叢集轉到怎麼「管」叢集。這篇介紹監控的做法(從舊版 heapster 到 Weave Scope 的安裝),以及 Job 與 CronJob 這種跑完就結束的工作怎麼定義。
Resource Quota 限制的是一個叢集能分配多少 CPU、記憶體、GPU 與磁碟空間;Namespace 則是把同一個實體叢集切成多個虛擬叢集。這篇說明兩者的設定方式,以及怎麼把配額綁在命名空間上做資源分群。
管理篇最後一篇,處理的是「誰可以做什麼」:怎麼新增一個使用者、用 Role 與 RoleBinding 給對應權限、綁定 RBAC 的實際操作,最後補上節點維護(Node Maintenance)的做法。
把前面學過的元件串起來:Pod、Deployment、Service、Job 搭配新的 PersistentVolume 與 PVC 做一次整合演練。這篇也談臨時儲存與驅逐策略在資源不足時怎麼運作。
k8s 是架在 Docker 之上的,所以不少 Docker 時代的管理工具也能沿用或改造。這篇介紹兩個關鍵套件:Harbor 當私有容器倉庫、Helm 當套件管理器,都以 Ubuntu 為例示範。
上雲端之前得先認識 CCM(Cloud Controller Manager):它讓各家雲端的實作與 k8s 核心脫鉤。這篇介紹 AWS 上會用到的元件(EC2、EBS、ELB、EFS、EKS 等),並實際操作 EC2。
實務篇上篇,把 k8s 叢集真的架到 AWS 上。內容包含 AWS 的基礎設置(IAM、網路與權限),以及建立 EKS 的控制介面;因為步驟偏多,整個流程拆成上下兩篇。
實務篇下篇,接續把叢集收尾:安裝與設定 kubectl、確認 Ubuntu 工作節點的 IP,並登入 EC2 的工作節點做驗證,讓上篇建好的控制介面真的能指揮到節點。
叢集架好之後,把基礎篇的內容搬到 EKS 上重做一次:先看多了三個計算節點後差別在哪,再實作有標籤與狀態的 Pod、探針設定、Scaling 與版本更新,對照 minikube 的差異。
進階篇延伸到 AWS,先看 minikube 與 EKS 差在哪。這篇在既有叢集上實作 traefik Ingress,目標是透過 Ingress 拿到 AWS 的 ALB,順帶把 Service 一起串起來。
排程看起來只是「丟給調度器決定」,實際上 Affinity、Taints 與 Tolerations、Cordon 等設定都會左右結果。這篇用日常維運會遇到的例子,模擬 Pod 該怎麼被安排到正確節點。
管理篇延伸到 EKS,比較同樣的操作在 AWS 與 minikube 上的差異。這篇處理服務發現、把 k8s Dashboard 架起來,以及安裝 Weave Scope 來看叢集的即時狀態。
延續管理篇上卷,這篇把鏡頭拉到 EKS:資源配額怎麼設、命名空間怎麼切、使用者與 Service Account 怎麼管,以及 RBAC 的角色與綁定規則,補齊多人共用同一個叢集時最常缺的那一塊。
應用篇上篇:用 Helm 把應用部署到叢集上,再設定 HPA(水平自動擴縮)與 Cluster Autoscaler 讓資源跟著流量調整,最後把 Istio 也部署進 k8s。
一個整合案例:把 WordPress 與 MySQL 一起跑在 k8s 上,資料要能持久化與共享。這篇分別用 EBS 與 EFS 兩種方式實作,比較它們在儲存特性與適用情境上的差別。
叢集層級的兩個題目:HA 講的是主節點備援,讓叢集不會因為單點故障倒下;Federation 則是跨叢集溝通與部署。這篇拿 minikube 與 AWS 對照說明,並實作一次 Federation。
三十天系列的最終回,把整個系列收成一張總圖:四大面向、k8s 的架構、k8s 元件之間怎麼協作、以及延伸到雲端之後的差異,另外補上幾個實務上的小技巧與參賽的心得。