在微服務架構盛行的今日,容器技術已成為不可或缺的一環。為了有效管理容器化應用程式,Kubernetes 應運而生,提供強大的容器協調能力。本文將引導讀者從零開始,逐步建立 Kubernetes 與 Helm 的本地開發環境,並探討 Kubernetes 的核心概念與功能。首先,我們會使用 Minikube 建立本地 Kubernetes 叢集,並安裝 kubectl 命令列工具以便與叢集互動。接著,我們會安裝 Helm,這個 Kubernetes 的套件管理器,簡化應用程式的佈署和管理流程。完成環境建置後,我們將探討 Kubernetes 的核心概念,包含容器協調、高用性、水平擴充套件和垂直擴充套件等。最後,我們將介紹 Kubernetes API 的基本操作指令,例如檢視 Pods、Deployments、Services 和 Namespaces,讓讀者初步掌握 Kubernetes 的操作方法,為後續學習和應用奠定堅實基礎。
準備 Kubernetes 與 Helm 環境
準備好 Kubernetes 和 Helm 的環境是我們開始實際操作之前必須完成的一步工作。以下是詳細步驟:
安裝 Minikube
Minikube 是一種本地執行 Kubernetes 叢集的一種工具。我們可以透過 Minikube 快速建立一個本地環境進行測試。
# 安裝 Minikube
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
# 啟動 Minikube
minikube start --driver=docker
內容解密:
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64:下載 Minikube 二進位檔案到當前目錄。sudo install minikube-linux-amd64 /usr/local/bin/minikube:將下載好的二進位檔案安裝到系統目錄中(需要超級使用者許可權)。minikube start --driver=docker:使用 Docker 作為 Minikube 的驅動程式來啟動 Minikube 叢集。
安裝 kubectl
kubectl 是 Kubernetes 的命令列工具(CLI),允許我們與叢集進行互動。
# 安裝 kubectl
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x kubectl
sudo mv kubectl /usr/local/bin/
# 驗證 kubectl 是否正常工作
kubectl version --client=true
內容解密:
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl":下載最新版本的 kubectl 二進位檔案。chmod +x kubectl:使二進位檔案可執行。sudo mv kubectl /usr/local/bin/:將二進位檔案移動到系統目錄中(需要超級使用者許可權)。kubectl version --client=true:檢查客戶端版本以確保安裝成功。
安裝 Helm
Helm 是 Kubernetes 的包管理工具,允許我們更方便地佈署和管理應用程式。
# 下載 Helm 二進位檔案並移動到系統目錄中
curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash
# 驗證 Helm 是否正常工作
helm version --short
內容解密:
curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash:從 GitHub 下載並執行 Helm 安裝指令碼。helm version --short:顯示 Helm 命令列工具版本以確保安裝成功。
驗證安裝
接下來我們需要驗證 Minikube、kubectl 和 Helm 是否都成功安裝並正常工作。
# 驗證 Minikube 是否正常執行
minikube status
# 驗證 kubectl 是否能連線到叢集並取得所有節點資訊
kubectl get nodes
# 驗證 Helm 是否正常工作並取得所有已安裝 Chart 的列表
helm list --all-namespaces
內容解密:
minikube status:顯示 Minikube 叢集狀態以確保其正常執行。kubectl get nodes:取得叢集中的所有節點資訊以確保 kubectl 已連線到叢集。helm list --all-namespaces:列出所有名稱空間中的已安裝 Chart 以確保 Helm 工作正常。
透過以上步驟我們成功準備好了基礎環境後便可以開始進行真正有趣的工作──安裝第一個 Helm Chart!
從巨石應用到現代微服務架構
隨著技術的進步,軟體開發者開始將更多的功能和元件封裝到應用程式中。這使得單一應用程式可能由多個較小的元件組成,每個元件本身都可以被視為獨立的服務。最初,將元件封裝在一起帶來了許多好處,包括簡化的佈署過程。然而,隨著行業趨勢的變化和企業對快速交付功能的重視,單一可佈署應用程式的設計也帶來了一些挑戰。
每當需要變更時,整個應用程式及其所有底層元件都需要再次驗證,以確保變更沒有引入不良特性。這個過程可能需要多個團隊的協調,從而延緩了整體功能的交付速度。快速交付功能,特別是在組織內部傳統分工之間,是企業希望達成的目標之一。這種快速交付的概念是DevOps實踐的基礎,DevOps在2010年左右開始流行。DevOps鼓勵應用程式逐步進行迭代變更,而不是在開發前進行大量規劃。
為了適應這種新模式,架構從單一大型應用轉變為多個較小且能夠更快交付的應用。由於這種思維轉變,傳統的應用設計被稱為巨石架構(monolithic architecture)。這種將元件分解為獨立應用的新方法被稱為微服務(microservices)。微服務應用具有許多可取之處,包括能夠同時開發和佈署服務以及獨立擴充套件(增加例項數量)等。
理解Kubernetes與Helm
所幸,容器技術(containers)被引入並迅速普及,填補了許多缺失的功能來建立微服務執行環境。Red Hat將容器定義為「一組或多組與系統其他部分隔離的程式集合,包括所有必要的檔案來執行」。容器技術在電腦領域有著悠久的歷史,可以追溯到1970年代。許多基本容器技術,包括chroot(改變程式及其子程式的根目錄到檔案系統中的新位置)和jails,至今仍在使用。
簡單且可攜帶的封裝模型結合了在每台物理或虛擬機器上建立多個隔離沙盒的能力,導致容器在微服務領域迅速採用。2010年代中期容器普及度的提升也歸功於Docker,它透過簡化封裝和提供可在Linux、macOS和Windows上使用的執行環境將容器推向大眾。容器映像(container images)易於分配導致容器技術普及度增長。因為首次使用者不需要知道如何建立映像而可以使用他人建立的現有映像。
容器和微服務成為天作之合。應用程式具有封裝和分配機制,同時能夠分享相同計算足跡並利用彼此隔離。然而,隨著越來越多容器化微服務被佈署,管理問題也隨之而來:如何確保每個執行中的容器健康?如果容器失敗該怎麼辦?如果底層機器沒有足夠計算能力該怎麼辦?於是Kubernetes出現了,它幫助解決了容器協調需求。
在下一節中,我們將討論Kubernetes如何運作並為企業帶來價值。
Kubernetes 是什麼?
Kubernetes(常縮寫為k8s),是一個開源容器協調平台。它起源於Google的專有協調工具Borg,該專案於2015年公開並更名為Kubernetes。在2015年7月21日的v1.0版本發布後,Google與Linux基金會合作成立雲原生計算基金會(CNCF),該基金會目前是Kubernetes專案的維護者。
Kubernetes這個詞源自希臘語,「helmsman」或「pilot」意指掌舵人或領航員。掌舵人負責駕駛船隻並且船長密切合作以確保安全穩定航行以及船員總體安全。Kubernetes也有類別似責任對於容器和微服務負責協調與排程管理。Kubernetes負責「掌舵」這些容器至適合處理其工作負載的工作節點(worker nodes)。此外,Kubernetes還會透過提供高用性和健康檢查來確保這些微服務的安全。
接下來我們來探討一些Kubernetes如何簡化管理容器化工作負載的一些方式。
容器協調
Kubernetes最顯著特點是容器協調(Container Orchestration)。這個詞有些複雜且涵蓋範圍廣泛所以我們把它分解成不同部分:
#### Kubernetes 運作概述
graph TD
A[開發者] --> B[Docker]
B --> C[Docker Hub]
C --> D[Kubernetes Cluster]
D --> E[Master Node]
D --> F[Worker Nodes]
E --> G[API Server]
E --> H[Scheduler]
E --> I[Controller Manager]
E --> J[etcd]
F --> K[Pods]
內容解密:
- 開發者:開始開發應用並建立Docker映像。
- Docker:將應用封裝成Docker映像。
- Docker Hub:儲存和分發Docker映像。
- Kubernetes Cluster:Kubernetes叢集管理所有節點。
- Master Node:叢集中負責控制和管理的主節點。
- Worker Nodes:實際執行Pods的工作節點。
- API Server:處理所有API請求並協調叢集操作。
- Scheduler:根據資源需求排程Pods到合適的工作節點。
- Controller Manager:管理叢集中的各種控制器。
- etcd:儲存叢集狀態和組態資訊。
- Pods:最小且最基本單位,包含一個或多個容器,代表最基本單位佈署方式。
控制台
控制台包括多個元件:API Server、Scheduler、Controller Manager 和etcd:
- API Server:處理所有API請求並協調叢集操作。
- Scheduler:根據資源需求排程Pods到合適的工作節點。
- Controller Manager:管理叢集中的各種控制器。
- etcd:儲存叢集狀態和組態資訊。
資料平面
資料平面由Worker Nodes組成:
- Worker Nodes:實際執行Pods和負責執行計算任務。
Pods
Pods 是 Kubernetes 中最小且最基本單位,包含一個或多個容器,代表最基本單位佈署方式:
#### Kubernetes Pods
graph TD
A[Pod] --> B[Container 1]
A --> C[Container 2]
內容解密:
- Pod 是 Kubernetes 中最小且最基本單位,代表最基本單位佈署方式。
- 每個 Pod 包含一個或多個 Container.
- Pods 中的 Container 分享相同網路名稱空間以及儲存資源,可以透過本地主機名稱進行通訊.
延展資源配額
配額設定是指標對特定名稱空間中資源使用量進行限制設定,例如cpu配額、記憶體配額等.如果名稱空間中所有pod配額超過所設定值則會拒絕建立pod:
#### Kubernetes 配額管理
graph TD
A[Namespace] --> B[Quota Limit]
B --> C[cpu Limit]
B --> D[memory Limit]
內容解密:
- 配額設定主要針對名稱空間層級進行設定.
- 配額限制專案包括CPU、Memory等.
- 若名稱空間中所有pod超過設定配額則會拒絕新pod建立.
透過以上幾個關鍵技術特性,Kubernetes 能夠很好地協助進行微服務架構下的一系列管理工作.
Kubernetes 與 Helm 的理解
容器協調的核心概念
容器協調的核心在於將容器放置在特定機器上,這些機器來自一個計算資源的池,並根據容器的需求進行分配。最簡單的容器協呼叫例是將容器佈署在能夠滿足其資源需求的機器上。以下圖示展示了一個應用程式,它請求 2 Gi 的記憶體和一個 CPU 核心。這意味著該容器將從底層機器獲得 2 Gi 的記憶體和 1 個 CPU 核心。Kubernetes 會追蹤哪些節點(nodes)有足夠的資源,並將進來的容器放置在那些節點上。如果某個節點沒有足夠的資源來滿足請求,該容器將不會被排程到那個節點。如果叢集中的所有節點都沒有足夠的資源來執行工作負載,該容器將不會被佈署。當某個節點有足夠的資源可用時,該容器將被佈署到擁有足夠資源的節點上。
此圖示展示了 Kubernetes 協調與排程流程
graph TD;
A[Application Request] --> B[2 Gi Memory, 1 CPU Core];
B --> C{Kubernetes Resource Allocation};
C --> D[Check Node Resources];
D -- Not Enough Resources --> E[Do Not Schedule];
D -- Enough Resources --> F[Schedule Container];
Kubernetes 的核心功能
高用性
Kubernetes 提供了高用性(High Availability)功能,這是防止應用程式停機的一種特性。這通常透過負載平衡器來實作,它將傳入的流量分散到多個應用程式例項上。高用性的基本理念是,如果一個應用程式例項當機了,其他例項仍然可以接受傳入的流量。這樣可以避免停機,並確保終端使用者(無論是人類還是其他微服務)完全不會察覺到應用程式例項失敗。
Kubernetes 提供了一種稱為 Service 的網路機制,允許應用程式進行負載平衡。稍後我們會在「佈署 Kubernetes 應用程式」一節中更詳細地討論 Services。
蒐集
由於容器和微服務的輕量化特性,開發人員可以使用 Kubernetes 迅速地水平擴充套件(Horizontal Scaling)和垂直擴充套件(Vertical Scaling)他們的工作負載。
水平擴充套件是指佈署更多容器例項。如果一個團隊預期會增加負載,他們只需告訴 Kubernetes 佈署更多應用程式例項即可。由於 Kubernetes 是一個容器協調工具,開發人員不需要擔心這些應用程式佈署在哪些物理基礎設施上。Kubernetes 只需找到叢集內擁有可用資源的節點,並在該處佈署額外的例項即可。每個額外的例項都將加入負載平衡池,從而確保應用程式仍然具有高用性。
垂直擴充套件是指為應用程式分配更多記憶體和 CPU。開發人員可以在應用程式執行時修改其資源需求。這將促使 Kubernetes 重新佈署正在執行的例項,並將它們重新排程到可以支援新資源需求的節點上。根據組態方式,Kubernetes 可以在佈署新例項時防止停機。
強大且活躍的社群
Kubernetes 擁有一個非常活躍且充滿創造力的開源社群。由於社群成員為 Kubernetes 常常提供補丁和新功能,因此 Kubernetes 得以不斷更新和完善。社群還為 Kubernetes 提供了豐富的檔案資料,包括官方檔案和個人或專業部落格網站上的內容。除了檔案之外,社群還積極參與全球各地舉辦的會議和研討會,這有助於提升對平台的教育和創新水平。
Kubernetes 擁有大量工具來增強其能力的一大好處就是Helm這樣的工具, Helms 是由 Kubernetes 社群成員構建的一種工具, Helms 極大地簡化了應用佈署及生命週期管理,改善了開發者體驗。
快速佈署 Kubernetes 應用
在 Kubernetes 上佈署應用程式與在 Kubernetes 外部佈署應用程式基本相似。無論是否容器化,所有應用程式都必須包含以下主題的組態細節:
- 網路
- 持久儲存和檔案掛載
- 高用性和冗餘
- 應用組態
- 安全性
在 Kubernetes 上組態這些細節是透過與 Kubernetes 應用程式介面 (API) 互動來實作的。
Kubernetes API 作為一組端點, 用於檢視、修改或刪除不同 K8s 資源, 許多 K8s 資源被使用來組態應用細節. 接下來我們會討論一些基本 API, 使用者可以利用這些 API 進行安裝及組態。
小段落標題:基礎 API 控制項
對於任何想要了解如何使用 API 在 K8s 上進行佈署及組態應用程式的人來說, 接下來介紹幾個重要命令:
# 檢視所有 Pods
kubectl get pods
# 檢視所有 Deployment
kubectl get deployments
# 檢視所有 Service
kubectl get services
# 檢視所有 Namespace
kubectl get namespaces
內容解密:
# 檢視所有 Pods
kubectl get pods
這條指令會列出當前所屬 Namespace 中所有已建立之 Pods 名稱及狀態, 這是我們最常使用之基礎操作之一.
# 檢視所有 Deployment
kubectl get deployments
Deployment 是對 Pods 的控制層, 在內部管理著很多維護工作, 建立或移除 Pods 是 Deployment 最基本且核心功能.
# 檢視所有 Service
kubectl get services
Service 是 K8s 上最重要之負載平衡組態, 用於管理多個 Pods 網路連線之組態專案.
# 檢視所有 Namespace
kubectl get namespaces
Namespace 是 K8s 上物理隔離管理之基礎單位, 每個 Namespace 中都可運作獨立於其他 Namespace 的作業.