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
內容解密:
- 這表明系統已經達到資源限制,無法進一步擴充套件。
解決方案:垂直擴充套件與水平擴充套件
為瞭解決資源限制的問題,我們有兩種選擇:垂直擴充套件和水平擴充套件。
- 垂直擴充套件:增加基礎虛擬機器的資源(例如,從 2GB 記憶體升級到 8GB)。
- 水平擴充套件:新增更多的節點到叢集中,以分擔負載。
垂直擴充套件的優缺點
- 優點:簡單易行,無需更改叢集組態。
- 缺點:受限於單台機器的最大資源,擴充套件有限。
水平擴充套件的優缺點
- 優點:可以無限擴充套件叢集規模,提高系統的可用性和可擴充套件性。
- 缺點:需要新增新的節點到叢集中,需要更多的管理和維護工作。
水平擴充套件:新增新節點到叢集中
在本例中,我們選擇水平擴充套件,透過新增新的節點到叢集中來提高系統的資源。
首先,我們將 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。透過水平擴充套件,我們可以新增更多的節點到叢集中,以提高系統的可用性和可擴充套件性。
延伸閱讀
- Kubernetes 官方檔案:https://kubernetes.io/docs/
- Kubernetes 叢集管理:https://kubernetes.io/docs/tasks/administer-cluster/
問答與練習
- Kubernetes 中的資源限制是如何影響佈署擴充套件的?
- 如何透過水平擴充套件來提高系統的可用性和可擴充套件性?
- 請嘗試在本地環境中佈署一個 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許可權的使用者。
在新的節點node02和node03上安裝與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:~$
在工作節點node02和node03上重複相同的操作,如清單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上使用該令牌加入叢集。
#### 內容解密:
- 主機條目新增:透過在
/etc/hosts檔案中新增新的主機條目,確保叢集中的節點可以透過主機名相互存取。 microk8s add-node命令:該命令用於生成加入叢集所需的令牌,包括IP地址和令牌值。--worker標誌:在加入命令中使用--worker標誌,表示該節點將作為工作節點加入叢集,而不是控制平面節點。
圖表說明
graph LR
A[父節點 wks01] -->|add-node|> B(生成加入令牌)
B -->|令牌|> C[node02]
B -->|令牌|> D[node03]
C -->|加入叢集|> A
D -->|加入叢集|> A
圖表翻譯:
此圖表描述了將新節點node02和node03加入到由wks01管理的Kubernetes叢集的過程。首先,在wks01上執行microk8s add-node命令生成加入令牌。然後,這些令牌被用於node02和node03,以便它們能夠成功加入叢集。