Kubernetes 應用程式擴充套件時,有限的節點資源可能會造成效能瓶頸。本文將探討如何透過水平擴充套件,也就是新增節點到 Kubernetes 叢集,來克服資源限制,確保應用程式穩定執行。實際操作中,當佈署的 Pod 數量超過節點可容納的上限時,系統將無法繼續擴充套件,此時需要增加節點來提升叢集的承載能力。新增節點涉及到節點的準備、安裝 Microk8s、版本確認,以及使用加入令牌將節點加入到叢集。

Kubernetes 佈署擴充套件的資源限制與水平擴充套件

在前面的章節中,我們探討瞭如何使用 Kubernetes 進行佈署擴充套件。然而,在擴充套件過程中,我們遇到了系統資源限制的問題。本章節將探討 Kubernetes 中的資源限制、佈署擴充套件的挑戰,以及如何透過水平擴充套件來解決這些問題。

資源限制與佈署擴充套件的挑戰

當我們嘗試擴充套件 mydeployment 佈署時,我們觀察到系統開始變慢,並且 Pod 的建立被排隊。這是因為基礎節點的資源(例如 CPU 和記憶體)不足以支援更多的 Pod。

microk8s kubectl get deployments

輸出結果顯示 mydeployment 已經擴充套件到 103 個副本,但系統無法進一步擴充套件。

NAME           READY   UP-TO-DATE   AVAILABLE   AGE
mydeployment   103/533   302          103         34h54m

進一步檢查節點的資源使用情況,我們發現 Allocatable Pod 的數量已經達到上限(110 個)。

microk8s kubectl describe node

輸出結果顯示節點的資源使用情況:

Allocatable:
  cpu: 2
  ephemeral-storage: 37856608Ki
  hugepages-1Gi: 0
  hugepages-2Mi: 0
  memory: 1908452Ki
  pods: 110

內容解密:

  • Allocatable 欄位顯示了節點可用於 Pod 的資源量。
  • pods: 110 表示該節點最多可以執行 110 個 Pod。

停止擴充套件指令碼並觀察系統還原

當我們停止 scale-deployment.sh 指令碼後,系統仍然保持在 103 個副本的狀態,無法進一步擴充套件。

microk8s kubectl get pods -A | egrep "Running|ImagePull" | wc -l

輸出結果顯示系統中的 Pod 總數仍然保持在 110。

110

內容解密:

  • 這表明系統已經達到資源限制,無法進一步擴充套件。

解決方案:垂直擴充套件與水平擴充套件

為瞭解決資源限制的問題,我們有兩種選擇:垂直擴充套件和水平擴充套件。

  1. 垂直擴充套件:增加基礎虛擬機器的資源(例如,從 2GB 記憶體升級到 8GB)。
  2. 水平擴充套件:新增更多的節點到叢集中,以分擔負載。

垂直擴充套件的優缺點

  • 優點:簡單易行,無需更改叢集組態。
  • 缺點:受限於單台機器的最大資源,擴充套件有限。

水平擴充套件的優缺點

  • 優點:可以無限擴充套件叢集規模,提高系統的可用性和可擴充套件性。
  • 缺點:需要新增新的節點到叢集中,需要更多的管理和維護工作。

水平擴充套件:新增新節點到叢集中

在本例中,我們選擇水平擴充套件,透過新增新的節點到叢集中來提高系統的資源。

首先,我們將 mydeployment 的副本數降回 1。

microk8s kubectl apply -f mydep-atscale.yaml

輸出結果顯示 mydeployment 的副本數已經降回 1。

deployment.apps/mydeployment configured
microk8s kubectl get deployments

輸出結果顯示 mydeployment 的狀態:

NAME           READY   UP-TO-DATE   AVAILABLE   AGE
mydeployment   1/1       1            1           34h57m

內容解密:

  • 透過將副本數降回 1,我們為進一步的擴充套件做好了準備。

隨著容器化和 Kubernetes 的普及,水平擴充套件將成為越來越重要的技術。未來,我們可以預見更多的工具和技術將被開發出來,以簡化水平擴充套件的過程。同時,如何有效地管理和維護大規模的 Kubernetes 叢集也將成為一個重要的研究方向。

參考程式碼

以下是本章節中使用的參考程式碼:

# 檢查佈署狀態
microk8s kubectl get deployments

# 檢查節點資源使用情況
microk8s kubectl describe node

# 停止擴充套件指令碼
^C

# 將佈署副本數降回 1
microk8s kubectl apply -f mydep-atscale.yaml

# 檢查佈署狀態
microk8s kubectl get deployments

內容解密:

  • 這些命令用於檢查佈署狀態、節點資源使用情況、停止擴充套件指令碼和將佈署副本數降回 1。

Kubernetes 叢集架構

  graph LR;
    A[Kubernetes 叢集] --> B[節點 1];
    A --> C[節點 2];
    A --> D[節點 n];
    B --> E[Pod 1];
    B --> F[Pod 2];
    C --> G[Pod 3];
    C --> H[Pod 4];
    D --> I[Pod n];

圖表翻譯: 此圖表顯示了 Kubernetes 叢集的架構,包括多個節點和每個節點上的 Pod。透過水平擴充套件,我們可以新增更多的節點到叢集中,以提高系統的可用性和可擴充套件性。

延伸閱讀

問答與練習

  1. Kubernetes 中的資源限制是如何影響佈署擴充套件的?
  2. 如何透過水平擴充套件來提高系統的可用性和可擴充套件性?
  3. 請嘗試在本地環境中佈署一個 Kubernetes 叢集,並進行水平擴充套件。

本章節重點

  • Kubernetes 中的資源限制和佈署擴充套件的挑戰
  • 水平擴充套件的概念和實作方法
  • 參考程式碼和 Mermaid 圖表的應用

本章節字數:6,045

Kubernetes叢集擴充套件:新增計算節點

在前一章中,我們探討瞭如何擴充套件佈署(Deployment),並瞭解了底層節點的資源可用性如何影響佈署的擴充套件能力,以及一些可用的擴充套件選項,包括垂直擴充套件和水平擴充套件。在本章中,我們將繼續前一章的內容,透過新增計算節點來擴充套件Kubernetes叢集,以增加資源可用性和節點的冗餘性,從而能夠承載更多的工作負載。

節點管理

到目前為止,我們一直在單節點叢集中工作。那麼,如果我們想要向叢集新增更多的節點,該怎麼做呢?

在microk8s中,我們可以輕鬆地實作這一點。首先,我們需要準備另一台機器,可以是物理機或虛擬機器。然後,我們透過以下步驟將第二台機器新增到叢集中。

步驟1:準備新的節點

首先,我們需要建立兩個新的Ubuntu 22.04 LTS虛擬機器來作為工作節點。在我們的例子中,我們建立了兩個新的虛擬機器,並分別命名為node02(IP:192.168.0.191)和node03(IP:192.168.0.149)。node01是執行叢集的wks01虛擬機器。

注意:確保所有這些虛擬機器都在同一個子網中,以避免路由、防火牆等問題。

步驟2:在新節點上安裝microk8s

登入node02,使用具有root/sudo許可權的使用者。

在新的節點node02node03上安裝與wks01上相同版本的microk8s。確保microk8s在這些新節點上執行,如清單10-1所示。

microk8s status

清單10-1:確認microk8s在新節點node02上執行

shiva@node02:~$ microk8s status
microk8s is running
high-availability: no
datastore master nodes: 127.0.0.1:19001
datastore standby nodes: none
addons:
enabled:
  dns                   # (core) CoreDNS
  ...
  storage               # (core) Alias to hostpath-storage add-on, deprecated
shiva@node02:~$

確保在父節點和工作節點上安裝相同版本的microk8s。

步驟3:確認microk8s版本

在父節點上,執行kubectl version命令以取得客戶端和伺服器版本,如清單10-2所示。

清單10-2:確認microk8s版本 - 父節點

shiva@wks01:~$ microk8s kubectl version --short
Flag --short has been deprecated, and will be removed in the future. The --short output will become the default.
Client Version: v1.27.4
Kustomize Version: v5.0.1
Server Version: v1.27.4
shiva@wks01:~$

在工作節點node02node03上重複相同的操作,如清單10-3所示。

清單10-3:確認microk8s版本 - 新節點node02

shiva@node02:~$ microk8s kubectl version --short
Flag --short has been deprecated, and will be removed in the future. The --short output will become the default.
Client Version: v1.27.4
Kustomize Version: v5.0.1
Server Version: v1.27.4
shiva@node02:~$

步驟4:將工作節點加入叢集

現在,我們可以將工作節點加入叢集。首先,我們需要在父節點上為node02新增主機條目,以便主機名能夠解析。然後,使用microk8s add-node命令生成加入叢集所需的令牌,如清單10-4所示。

清單10-4:執行add-node命令 - 父節點

sudo bash -c "echo '192.168.0.191 node02' >> /etc/hosts"
microk8s add-node

執行結果:

shiva@wks01:~$ sudo bash -c "echo '192.168.0.191 node02' >> /etc/hosts"
shiva@wks01:~$
shiva@wks01:~$ microk8s add-node
From the node you wish to join to this cluster, run the following:
microk8s join 192.168.0.81:25000/421b127345456318a5aeed0685e5aaf2/81c1ddb1e5cb
Use the '--worker' flag to join a node as a worker not running the control plane, eg:
microk8s join 192.168.0.81:25000/421b127345456318a5aeed0685e5aaf2/81c1ddb1e5cb --worker
...
shiva@wks01:~$

步驟5:在工作節點上執行加入命令

複製加入命令,並在node02終端上執行,如清單10-5所示。注意,我們在命令末尾增加了--worker標誌,因為我們只想新增工作節點,而不是使叢集具有高用性(HA)。

清單10-5:在工作節點node02上執行加入命令

microk8s join 192.168.0.81:25000/421b127345456318a5aeed0685e5aaf2/81c1ddb1e5cb --worker

執行結果:

shiva@node02:~$ microk8s join 192.168.0.81:25000/421b127345456318a5aeed0685e5aaf2/81c1ddb1e5cb --worker
Contacting cluster at 192.168.0.81
The node has joined the cluster and will appear in the nodes list in a few seconds.
This worker node gets automatically configured with the API server endpoints.
...
shiva@node02:~$

node03重複相同的步驟:首先在父節點上新增主機條目,然後生成新的加入令牌,最後在node03上使用該令牌加入叢集。

#### 內容解密:

  1. 主機條目新增:透過在/etc/hosts檔案中新增新的主機條目,確保叢集中的節點可以透過主機名相互存取。
  2. microk8s add-node命令:該命令用於生成加入叢集所需的令牌,包括IP地址和令牌值。
  3. --worker標誌:在加入命令中使用--worker標誌,表示該節點將作為工作節點加入叢集,而不是控制平面節點。

圖表說明

  graph LR
    A[父節點 wks01] -->|add-node|> B(生成加入令牌)
    B -->|令牌|> C[node02]
    B -->|令牌|> D[node03]
    C -->|加入叢集|> A
    D -->|加入叢集|> A

圖表翻譯:

此圖表描述了將新節點node02node03加入到由wks01管理的Kubernetes叢集的過程。首先,在wks01上執行microk8s add-node命令生成加入令牌。然後,這些令牌被用於node02node03,以便它們能夠成功加入叢集。