為了能讓更多朋友可以了解 K8S 以及 GKE,我們將在本篇文章中為大家介紹 K8S 及 GKE 的相關服務。除了 Kubernetes 的重要基本觀念之外,我們也會介紹重要架構觀念、最常使用到的服務功能以及最佳實踐 (Best practice),希望讓您對 K8S 及 GKE 有更深的認識。

大家都知道 Kubernetes (K8S) 是容器 (Container) 服務資源管理調度的工具 (Orchestrator),可以統一集中調度由容器組成的微服務 (Micro-service)。一般而言,應用程式開發者可以專注於應用程式的開發,只需將服務打包成容器的格式 (ex: Docker Container),接著將容器映像檔 (Image) 提交至 Registry,由維運團隊來進行應用程式版本的更新。透過 K8S 的微服務管理框架 (Framework),維運團隊可以直接使用該映像檔布建至 Kubernetes,即可由 Kubernetes 自動地進行容器應用服務的布建及管理。

一般常見的建置方式為使用數台實體機器 (Physical Server) 或者是虛擬機 (Virtual Machine),分別安裝建置成為 K8S Master node 以及數台 K8S node。透過K8S的資源管理及調度機制,可以將多台 node 的實體運算及儲存 (Storage) 資源以叢集 (Cluster) 方式提供給系統維運管理者,用以管理服務資源以及外部使用者存取的應用服務。

 

此外,如 K8S 官網所述,K8S提供了 “Automated container deployment, scaling, and management”,大幅提升應用程式服務的可靠度及減輕系統管理的負擔,這也是為什麼近年來只要談到 CI/CD、DevOps 主題,大家就會直接聯想到 Kubernetes 的原因。其重要功能如下:

  • 容器自動部屬 (Automated deployment) : 使用者僅需指定服務所需的容器數量,K8S 便會自動將使用者的容器服務布建於叢集內的多個工作節點 (worker node) 上。
  • 服務自動擴展 (Automated scaling) : 當系統啟用 auto-scaling 功能,一但容器服務工作負載 (loading) 超過指定的門檻值,K8S 即可自動擴展容器的數量,承接外部源源不絕的連線請求。當然,前提是要有足夠可擴充加入 Cluster 的 node 資源。
  • 容器自動化管理 (Automated management) : K8S 會維持使用者配置的系統容器數量,當 K8S master node 偵測到有任何容器或是 Pod 不正常時, master node 會自動啟動新的 Pod 讓系統維持一定的服務容量 (capacity)。此外,若有服務版本的更動,K8S 也能提供相當便利的進版及退版功能,讓管理者在服務不中斷的前提下進行版本更動。

 

Kubernete 需建置於叢集式 (Cluster) 運算資源之上,運行架構圖如下所示:

接下來我們將著重在 Kubernetes 的應用程式相關元件上,架構師會逐一介紹四個主要元件,事不宜遲,就讓我們一起來看看吧!

 

K8S四個主要元件

– K8S主要元件 Master Node

Master Node 執行 Kubernetes 控制層程序 (Control Plane),包含 Kubernetes API 伺服器 (kube-apiserver)、排程器 (scheduler) 和核心資源控制器 (Core resource controllers)。系統管理者所有與 K8S Cluster 的互動都透過 Kubernetes API 呼叫來完成,且 Master Node 會執行 Kubernetes API Server 來處理這些要求。Master Node 的 API server 程序是 Cluster 中所有通訊的中樞。以下是 Master Node 內重要元件:

  • kube-apiserver:提供使用者連接管理 K8S Cluster 的前端入口。
  • etcd:存放 Cluster 配置設定以及各項工作狀態及資訊,可以視為是 Cluster 的系統資料庫。
  • kube-scheduler:負責管理 Pod 執行以及分配執行 Pod 所對應的 worker node。
  • kube-controller manager:其中包含數個 controller 模組,包含管理 Cluster 內 node 的狀態,Pod 的副本數量(Replication),服務存取節點的管理(service endpoint),account 以及 namespace 管理。

 

– K8S主要元件 Node

Node 節點是實際運行容器化應用程式和應用程式服務的工作站機器 (worker node),每個 Node 都透過 Master Node 管理,且各 Node 會自行回報最新狀態資訊給 Master Node。在 Worker Node 中,會有以下幾個主要元件:

  • kublet:與 Master Node 上的  apiserver 相互溝通且管理及及健康監控 Pod 運行狀態的工具 (agent)
  • kube-proxy:網路管理工具
  • Container runtime:執行 Container 的軟體套件 (ex: Docker, Containerd, CRI-O )

 

– K8S主要元件 Pod

Pod 是 Kubernetes 中最小、最基本的可部署物件。Pod 代表叢集中一個運作中程序的單一執行個體。Pod 含有一或多個「容器」,如 Docker 容器。若 Pod 執行多個容器,系統會將這些容器視為單個實體進行管理,這些容器也共用 Pod 的資源。

一般除了有高度相關聯 (Tightly Coupled) 的容器服務為了增進應用程式的效率,才建議把一個以上的容器服務包裝進同一Pod內。以下圖為例,該單一Pod提供的服務為Web Server網頁服務,而其內部有另一個檔案管理服務,兩容器可共享Pod內的儲存資源( Shared Volume),相輔相成提供外部使用者存取網頁服務並透過網頁頁面顯示對應的檔案。

圖片來源: Kubernetes官網

– K8S主要元件 Deployment

Deployment 可以視為一組相同 Pod 所組成的服務管理單元,其中可以透過副本 (Replicas) 參數指定所需的 Pod 數量。Deployment 可協助確保應用程式可以有一或多個執行個體處理使用者要求並會自動取代失敗或已從節點中移除的 Pod。以下圖為例,該 Deployment 內指定 K8S Cluster 需建置兩組相同服務的 Pod,而此兩組 Pod 會由 Cluster 布建於 node 之中,且 K8S 會於系統內持續維持兩組運行中的 Pod 來提供服務讓用戶端存取。

 

既然大家都已經了解應用程式相關元件如何於 K8S 內組成及運行, 接下來,我們將解釋如何將應用程式服務提供給其他使用者或應用程式, 並公開提供給外部使用的重要K8S元件(Component)!

– Service

Service 的概念,就是將一組 Pod 端點 (Endpoint) 聚集成單一資源,而使用者可以設定利用多種方式來存取這組 Pod 端點 (Endpoint)。根據預設,K8S 會產生一個穩定的叢集內部 IP (Internal Cluster IP) 位址,能讓叢集中的用戶端拿來連接 Service 中的 Pod。當用戶端發起服務連線請求到 Cluster IP 位址,K8S 系統便會將該請求轉送至 Service 中的某個 Pod 來提供服務給用戶端。其中 K8S 支援 Service 種類有以下幾種: Cluster IP (預設)、NodePort、Load Balancer、ExternalName,而各種類別都各自有不同的情境,這部分我們之後再來細部介紹。

如下圖所示,使用者僅需將請求 (Request) 傳送至 Service 的端點地址,該請求便會被派發至相對應的 Pod 去執行使用者的服務請求。

至於為什麼要使用 Service?因為在 Kubernetes 叢集中,每個 Pod 都有內部 IP 位址,但部署中的 Pod 會變動,其 IP 位址也會變更,因此,直接使用 Pod IP 位址並不合理。透過 K8S Service,使用者可獲得持續存在的穩定 IP 地址,甚至在 Pod 的 IP 位址變更時仍不會改變。此外,Service 也能提供負載平衡,使用者僅需將連線請求傳送至該 Service IP 位址,使用者的請求就會平均分配到屬於服務成員的 Pod 之間。

經由以上的介紹,相信大家對於 K8S 架構及其重要元件有了初步認識。從 High Level 層面來看,下面的示意圖相信能讓各位更完整地理解 Kubernetes 的組成:

 

一般而言,自建K8S對於系統管理者會有幾項主要的工作負擔:

        1. Cluster 建置與安裝曠日廢時。
        2. 隨著業務量的增長,固定資源的 K8S 叢集不易動態且即時的彈性擴充 worker node,影響商業運營。
        3. Node 異常時,容易導致系統負載過重,造成服務不穩定,若沒有額外維持一定程度冗餘的資源,可能會導致服務不穩定,甚至是 Master node 發生異常,管理者就無法繼續維運整個系統。

正是為了採納 Kubernetes 的好處及優勢,並減輕系統管理者、維運者對於 K8S 叢集建置及運營的管理負擔,Google Cloud (GCP) 雲平台也推出 K8S 的代管服務 (Managed Service),稱之為 Google Kubernetes Engine (GKE),可以讓系統管理者及維運者省去 K8S Cluster 安裝及維護的時間,僅需幾分鐘,GKE 便能建置出一套完整的 K8S 服務,並快速布建開發者的容器化應用程式。

 

請持續鎖定 Microfusion 宏庭架構師專欄,以獲得最新專業資訊喔!

若有任何 Google Cloud (GCP) 需求,歡迎隨時與我們聯繫