Kubernetes 叢集管理容器化應用程式,將容器映像檔封裝成 Pod 單位進行佈署。本文從指令式和宣告式 YAML 檔案兩種方式建立 Pod,解析 YAML 檔案的關鍵欄位和使用方法,並說明宣告式語法在 IaC 和多資源管理方面的優勢。同時,kubectl 工具的使用技巧和 Kubernetes 資源查詢方法也得到闡述。文章進一步探討了 Kubernetes 高用性議題,分析了單節點、單控制平面多節點和多控制平面多節點叢集的特性、優缺點及應用場景,並詳細介紹了 Minikube 的安裝、組態和使用方法,涵蓋 Linux、macOS 和 Windows 等不同作業系統,以及 CPU、記憶體、容器執行時等設定選項和驅動程式選擇。
Kubernetes架構:從容器映像檔到執行中的Pod
在Kubernetes中建立資源時,可以使用指令式(imperative)或宣告式(declarative)語法。每個鍵值對代表您要為Kubernetes資源設定的組態資料。
以下是指令式命令,用於建立名為my-pod的Pod,使用我們之前使用的busybox:latest容器映像檔:
$ kubectl run my-pod --restart Never --image busybox:latest
現在,我們將使用宣告式語法實作相同的功能:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: busybox-container
image: busybox:latest
假設這個檔案被儲存為pod.yaml。要建立實際的Pod,您需要執行以下命令:
$ kubectl create -f pod.yaml
這將產生與前一個命令相同的結果。
內容解密:
apiVersion: 指定資源所屬的API版本。對於Pod資源,API版本是v1。kind: 指定YAML檔案要建立的資源型別。在這裡,是建立一個Pod。metadata: 提供有關Kubernetes資源的後設資料,如名稱。spec: 描述物件的規格。在這個例子中,Pod由一個根據busybox:latest容器映像檔的容器組成。
每個為Kubernetes建立的YAML檔案都必須包含這四個必要的鍵。
宣告式語法的優勢
宣告式語法允許在同一個檔案中使用三個破折號作為資源之間的分隔符來宣告多個資源。以下是YAML檔案的修訂版本,它將建立兩個Pod:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: busybox-container
image: busybox:latest
---
apiVersion: v1
kind: Pod
metadata:
name: my-second-pod
spec:
containers:
- name: nginx-container
image: nginx:latest
這個檔案建立了兩個Pod:第一個使用busybox映像檔,第二個使用nginx映像檔。
瞭解Kubernetes資源
您不需要記住所有語法和每個鍵的值。可以參考官方Kubernetes檔案中的示例宣告YAML檔案。如果檔案不夠詳細,可以使用kubectl explain命令來瞭解資源細節:
$ kubectl explain pod.spec.containers.image
KIND: Pod
VERSION: v1
FIELD: image <string>
DESCRIPTION:
Container image name. More info:
https://kubernetes.io/docs/concepts/containers/images
這將提供有關該欄位的清晰說明和資訊。
宣告式語法的優點
雖然編寫YAML檔案比使用指令式命令更耗時,但宣告式語法提供了兩個主要優點:
- 基礎設施即程式碼(IaC)管理:您可以將組態儲存在某處,並使用Git(原始碼管理)來版本化您的Kubernetes資源。
- 同時建立多個資源:由於您可以在同一個YAML檔案中宣告多個資源,因此可以在同一個地方擁有整個應用程式及其所有依賴項。
如何實作Kubernetes的高用性
Kubernetes是一種叢集解決方案,其分散式特性允許它在多台機器上執行。透過將不同的元件分散在不同的機器上,您可以使您的Kubernetes叢集具有高用性。接下來,我們將簡要討論不同的Kubernetes設定。
kubectl的安裝與組態
從技術角度來看,您必須在任何需要與叢集互動的機器上安裝和組態kubectl命令列工具。這可以是您的本地機器,也可以是存取Kubernetes叢集的伺服器。在較大的專案中,在您的持續整合平台的代理/執行器中安裝kubectl也是一個好主意。
這樣,您的CI/CD管道將能夠對您的Kubernetes叢集發出命令並更新叢集的狀態。將kubectl視為與Kubernetes通訊的通用工具:在您希望與叢集通訊的任何地方安裝它。
Kubernetes 叢集架構深度解析
在探討 Kubernetes 架構時,瞭解不同叢集組態對於生產環境的影響至關重要。本章節將深入分析單節點叢集、單控制平面多計算節點叢集,以及多控制平面多計算節點叢集的優缺點與應用場景。
單節點叢集:開發與測試的理想選擇
單節點叢集將所有 Kubernetes 元件佈署在同一台機器上,雖然不適合生產環境,但對於開發和測試而言卻是個理想的起點。Minikube 是實作單節點叢集的流行工具,它透過虛擬機器組態必要的元件,簡化了本地測試流程。
單節點叢集的優缺點
| 優點 | 缺點 |
|---|---|
| 適合測試 | 無法擴充套件 |
| 易於本地設定 | 不具備高用性 |
| Minikube原生支援 | 不建議用於生產環境 |
單節點叢集在資源有限的邊緣環境中仍具價值,它提供了輕量級的佈署選項,並支援災難還原策略。
單控制平面多計算節點叢集:高用性的初步實踐
此組態包含一個控制平面節點和多個計算節點,相比單節點叢集具有更高的可用性。然而,它仍然存在單點故障風險,因為控制平面節點一旦故障,將無法管理容器。
單控制平面多計算節點叢集的問題
- 控制平面是單點故障
- 單一 etcd 例項存在資料丟失風險
- 擴充套件計算節點可能對 kube-apiserver 造成壓力
| 優點 | 缺點 |
|---|---|
| 計算節點具備高用性 | 控制平面是單點故障 |
| 支援多節點功能 | 單一 etcd 例項 |
| 可使用 kind 或 minikube 本地執行 | 無法有效擴充套件 |
儘管比單節點叢集更為可靠,但此組態仍非高可用性方案。
多控制平面多計算節點叢集:實作高可用性的最佳實踐
此架構透過複製控制平面和計算節點消除了單點故障,實作了真正的 Kubernetes 高用性。為了均衡負載,需要在 kube-apiserver 例項前組態負載平衡器。
多控制平面叢集中 etcd 的管理
在多控制平面叢集中,每個控制平面節點執行一個 etcd 例項,形成 etcd 叢集以確保資料的高用性。etcd 例項之間透過 Raft 共識演算法保持資料一致性,並選舉長官者負責寫入操作。
Kubernetes 元件概覽
下表總結了 Kubernetes 核心元件的功能與相互關係:
| 元件名稱 | 通訊物件 | 功能描述 |
|---|---|---|
| kube-apiserver | kubectl、etcd、kube-scheduler、kube-controller-manager、kubelet、kube-proxy | 提供 HTTP REST API,與 etcd 直接通訊 |
| etcd | kube-apiserver | 儲存 Kubernetes 叢集狀態 |
| kube-scheduler | kube-apiserver | 排程未分配的 Pod 至合適節點 |
| kube-controller-manager | kube-apiserver | 執行調諧迴圈以管理叢集狀態 |
| kubelet | kube-apiserver 和容器執行時 | 將 Pod 清單轉化為容器執行 |
| kube-proxy | kube-apiserver | 實作 Kubernetes 網路層 |
| 容器引擎 | kubelet | 根據 kubelet 指令執行容器 |
這些元件構成了 Kubernetes 的核心架構,不同發行版可能會增加額外元件或修改預設行為。
在本機安裝您的第一個 Kubernetes 叢集
在上一章中,我們有機會解釋了什麼是 Kubernetes、其分散式架構、工作中的叢集剖析,以及它如何在多台 Linux 機器上管理您的 Docker 容器。現在,我們將親自動手,因為是時候安裝 Kubernetes 了。本章的主要目標是讓您在後續章節中擁有一個可用的 Kubernetes 安裝。這樣,您就有自己的叢集來工作、練習和學習。
安裝 Kubernetes 意味著您必須讓不同的元件協同工作。當然,我們不會採用設定個別叢集元件的困難方式;相反,我們將使用自動化工具。這些工具的好處是可以在本地啟動和組態所有元件。這種自動化的 Kubernetes 叢集設定對於快速測試 YAML 變更的 DevOps 團隊、希望擁有本地環境來測試應用程式的開發人員,以及快速測試對 Kubernetes 物件 YAML 定義的變更的安全團隊來說尤其有益。
使用 minikube 安裝 Kubernetes 叢集
在本文中,我們將學習如何使用 minikube 安裝本地 Kubernetes 叢集。這可能是本地獲得可用的 Kubernetes 安裝的最簡單方法。到本文結束時,您將在本地機器上安裝一個可用的單節點 Kubernetes 叢集。
minikube 易於使用且完全免費。它將在您的本地機器上安裝所有 Kubernetes 元件並組態它們。透過 minikube 解除安裝所有元件也很容易,因此如果有一天您想銷毀您的本地叢集,您不會被它困住。
與成熟的生產叢集佈署方法相比,minikube 有一個很大的優勢:它是快速測試 Kubernetes 場景的超級有用工具。如果您不願意使用 minikube,您可以完全跳過本文,選擇本章中描述的其他方法。
使用 minikube 的優缺點
雖然 minikube 是本地 Kubernetes 開發的熱門選擇,但與成熟的生產叢集相比,它在資源使用和功能保真度方面有一些權衡:
- 資源壓力:在本地機器上與其他程式一起執行 minikube 可能會對資源造成壓力。當您想要建立更大的 Kubernetes 叢集時,它需要大量的 CPU 和 RAM,可能會影響其他應用程式的效能。
- 網路差異:與生產 Kubernetes 叢集不同,minikube 的預設網路設定可能無法完全模擬真實世界的網路環境。這可能會在複製或故障排除可能在生產中發生的網路相關問題時帶來挑戰。
- 相容性考慮:某些 Kubernetes 功能或第三方工具可能需要比 minikube 提供的更完整的 Kubernetes 環境,從而導致開發過程中的相容性問題。
- 持久儲存挑戰:在 minikube 中管理應用程式的持久儲存可能很麻煩,因為與完整的 Kubernetes 叢集相比,其持久性儲存區支援存在侷限性。
技術需求
要跟隨本章中的範例,您需要以下內容:
- 在本地機器上安裝 kubectl
- 一台具有 2 個或更多 CPU、2 GB 可用記憶體和 20 GB 可用磁碟空間的工作站。(如果您想要探索多節點叢集環境,您需要更多的資源。)
- 在工作站上安裝容器或虛擬機器管理器,例如 Docker、QEMU、Hyperkit、Hyper-V、KVM、Parallels、Podman、VirtualBox 或 VMware Fusion/Workstation
- 可靠的網路連線
minikube 的安裝步驟
安裝前的準備
- 檢查系統需求:確保您的系統符合 minikube 的最低需求,包括足夠的 CPU、記憶體和磁碟空間。
- 選擇虛擬化驅動:根據您的作業系統選擇適合的虛擬化驅動,如 Docker、VirtualBox 等。
下載與安裝 minikube
- 下載 minikube:造訪 minikube 的官方網站下載最新版本。
- 安裝 minikube:根據下載的檔案型別(例如
.exe檔案或二進位制檔案),按照相應的指示進行安裝。
啟動 minikube
- 啟動叢集:開啟終端機或命令提示字元,執行
minikube start命令來啟動您的 Kubernetes 叢集。 - 驗證叢集狀態:使用
kubectl get nodes命令檢查節點狀態,確認叢集是否正常運作。
在 minikube 上佈署應用
- 建立佈署:使用
kubectl create deployment命令建立一個新的佈署。 - 暴露服務:透過
kubectl expose命令將佈署暴露為服務,使其可以被外部存取。
管理與監控
- 檢視日誌:使用
kubectl logs檢視 Pod 的日誌,進行故障排除。 - 監控資源使用:利用
kubectl top命令監控 Pod 和節點的資源使用情況。
#### 內容解密:
上述步驟展示瞭如何在本地使用 minikube 建立和管理 Kubernetes 叢集。minikube 提供了一個簡單而有效的方式來測試和開發 Kubernetes 應用。透過瞭解其安裝步驟和基本操作,您可以充分利用 minikube 的優勢,為進一步學習和使用 Kubernetes 打下堅實的基礎。
在不同作業系統上安裝minikube
本章節將介紹如何在Linux、macOS和Windows上安裝minikube。透過二進位檔案或套件管理器安裝minikube是一個簡單直接的過程。
在Linux上安裝minikube
在Linux上,可以使用Debian套件、RPM套件或二進位檔案來安裝minikube。以下是安裝步驟:
$ curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
$ sudo install minikube-linux-amd64 /usr/local/bin/minikube
# 驗證minikube命令和路徑
$ which minikube
/usr/local/bin/minikube
內容解密:
- 使用
curl命令下載最新版本的minikube二進位檔案。 - 使用
sudo install命令將下載的二進位檔案安裝到/usr/local/bin/minikube。 - 使用
which minikube命令驗證minikube的安裝路徑。
請注意,安裝路徑可能會根據作業系統的不同而有所不同。您需要確保該路徑包含在PATH環境變數中,以便minikube命令能夠正常運作。
在macOS上安裝minikube
在macOS上,可以使用二進位檔案或Homebrew套件管理器來安裝minikube。以下是使用二進位檔案的安裝步驟:
$ curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-amd64
$ sudo install minikube-darwin-amd64 /usr/local/bin/minikube
# 驗證minikube命令和路徑
$ which minikube
內容解密:
- 使用
curl命令下載最新版本的minikube二進位檔案(適用於macOS)。 - 使用
sudo install命令將下載的二進位檔案安裝到/usr/local/bin/minikube。 - 使用
which minikube命令驗證minikube的安裝路徑。
在Windows上安裝minikube
在Windows上,可以使用多種方法安裝minikube,包括使用Windows套件管理器、Chocolatey或下載.exe檔案並設定PATH。以下是一些安裝範例:
# 使用Windows套件管理器(如果已安裝)
$ winget install minikube
# 使用Chocolatey
$ choco install minikube
內容解密:
- 使用Windows套件管理器(winget)或Chocolatey來安裝minikube。
- 這些工具可以自動處理下載和安裝過程。
設定minikube
minikube提供了一些基本的自定義選項,以滿足開發環境的需求。例如,預設的Kubernetes叢集規格是2個CPU和2GB記憶體。您可以根據需要調整這些設定:
$ minikube config set cpus 4
$ minikube config set memory 16000
$ minikube config set container-runtime containerd
內容解密:
- 使用
minikube config set命令來調整Kubernetes叢集的CPU數量、記憶體大小和容器執行時。 - 這些變更需要在刪除並重新啟動minikube叢集後才會生效。
minikube的驅動程式
minikube使用驅動程式來管理叢集的生命週期。這些驅動程式可以與不同的虛擬化和容器化技術互動,從而允許minikube建立、組態和控制本地Kubernetes環境的基礎設施。
容器驅動程式
對於容器化的方式,minikube可以利用本地的Podman或Docker安裝。這使得您可以在開發機器上的容器中直接執行minikube。
虛擬機器(VM)驅動程式
如果您偏好使用VM的方式,minikube可以在您的機器上啟動VM。這些VM將容納必要的Kubernetes元件,從而為您的本地叢集提供一個更為隔離的環境。
設定預設驅動程式
您可以設定minikube的預設驅動程式:
$ minikube config set driver docker
內容解密:
- 使用
minikube config set driver命令來設定預設的驅動程式為Docker。 - 變更驅動程式後,需要刪除並重新啟動minikube叢集。