MicroK8s 作為輕量級 Kubernetes 發行版,簡化了叢集的佈署和管理,尤其適用於資源有限的環境。擴充套件 MicroK8s 叢集,新增工作節點,可以提升整體運算能力,滿足日益增長的工作負載需求。本文詳細說明瞭如何使用 microk8s join 命令將新節點加入現有叢集,並透過 kubectl cordon 和 drain 命令安全地清空主節點,將工作負載遷移到新的工作節點,確保服務不中斷。同時,也探討了使用 kubectl drain 命令時可能遇到的問題,例如非 Deployment 管理的 Pod 和 DaemonSet 管理的 Pod 的處理方式,並提供瞭解決方案。最後,文章還介紹了 Kubernetes 節點維護的最佳實踐,以及未來發展方向,例如更智慧的排程演算法、增強的自動化功能和更好的可觀察性,以提升叢集的穩定性和應用程式的效能。

MicroK8s 叢集擴充套件:新增工作節點與管理工作負載

在現代化的雲端運算和容器化應用中,Kubernetes 已成為不可或缺的容器協調工具。MicroK8s 是 Canonical 提供的輕量級 Kubernetes 發行版,適合開發、測試和小型生產環境。本章節將詳細介紹如何使用 MicroK8s 擴充套件叢集計算節點,以及如何管理工作負載。

新增工作節點到 MicroK8s 叢集

要擴充套件 MicroK8s 叢集,首先需要在新的工作節點上加入現有的叢集。這可以透過 microk8s join 命令來實作。

步驟1:取得加入叢集的命令

在主節點上執行 microk8s add-node 命令,以取得將新節點加入叢集所需的命令。

shiva@ubuntu2004-02:~$ microk8s add-node
From the node you wish to join to this cluster, run the following:
microk8s join 192.168.0.26:25000/dbf59cf2b0d45fa59060a597b73cebb1/4c64e74803d0

步驟2:在新節點上執行加入命令

在新節點(node03)上執行取得的 microk8s join 命令,並加上 --worker 引數,以將該節點作為工作節點加入叢集。

shiva@node03:~$ microk8s join 192.168.0.81:25000/26c594bf521eb1d3ccb1cd16f51b54d0/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.

步驟3:驗證節點狀態

在主節點上執行 microk8s kubectl get nodes 命令,以確認新節點是否成功加入叢集並處於 Ready 狀態。

shiva@wks01:~$ microk8s kubectl get nodes
NAME      STATUS   ROLES    AGE     VERSION
node02    Ready    <none>   9m56s   v1.27.4
wks01     Ready    <none>   3h22m   v1.27.4
node03    Ready    <none>   51s     v1.27.4

程式碼解析:

# 在主節點上執行取得加入命令
microk8s add-node

# 在新節點上執行加入叢集命令
microk8s join 192.168.0.81:25000/26c594bf521eb1d3ccb1cd16f51b54d0/81c1ddb1e5cb --worker

# 驗證節點狀態
microk8s kubectl get nodes

內容解密:

  1. microk8s add-node 命令用於生成將新節點加入叢集的指令。
  2. microk8s join 命令用於在新節點上執行,以加入現有的叢集。--worker 引數指定該節點作為工作節點。
  3. microk8s kubectl get nodes 命令用於檢查叢集中的所有節點狀態,確認新節點是否成功加入並處於 Ready 狀態。

管理工作負載

當叢集中新增工作節點後,我們需要管理工作負載,以充分利用新增的資源。

步驟1:隔離主節點

首先,將主節點(wks01)設定為不可排程,以將工作負載遷移到其他工作節點。

shiva@wks01:~$ microk8s kubectl cordon wks01
node/wks01 cordoned

步驟2:檢查工作負載分佈

使用 microk8s kubectl get pods 命令,檢視目前工作負載的分佈情況。

shiva@wks01:~$ microk8s kubectl get pods -o custom-columns=NAME:metadata.name,NAMESPACE:metadata.namespace,NODENAME:spec.nodeName,HOSTIP:status.hostIP
NAME                     NAMESPACE   NODENAME   HOSTIP
mynginx02               default     wks01      192.168.0.81
mydeployment-55bb4df494-q52w2   default     wks01      192.168.0.81
primeornot               default     wks01      192.168.0.81
dep-webserver-7d7459d5d7-6m26d   default     wks01      192.168.0.81
primeornot01             default     wks01      192.168.0.81
this-pod-will-not-start   default     wks01      192.168.0.81

程式碼解析:

# 隔離主節點
microk8s kubectl cordon wks01

# 檢查工作負載分佈
microk8s kubectl get pods -o custom-columns=NAME:metadata.name,NAMESPACE:metadata.namespace,NODENAME:spec.nodeName,HOSTIP:status.hostIP

內容解密:

  1. microk8s kubectl cordon wks01 命令將主節點標記為不可排程,防止新的 Pod 被排程到該節點上。
  2. microk8s kubectl get pods 命令用於檢查目前 Pod 的分佈情況,包括它們所在的節點和 IP 地址。

步驟3:清空主節點

執行 microk8s kubectl drain 命令,將主節點上的工作負載遷移到其他工作節點。

shiva@wks01:~$ microk8s kubectl drain wks01
node/wks01 already cordoned
error: unable to drain node "wks01" due to error:[cannot delete Pods declare no controller (use --force to override): default/mynginx02, default/primeornot, default/primeornot01, default/this-pod-will-not-start, cannot delete DaemonSet-managed Pods (use --ignore-daemonsets to ignore): kube-system/calico-node-5q6x6], continuing command...

程式碼解析:

# 清空主節點
microk8s kubectl drain wks01

內容解密:

  1. microk8s kubectl drain wks01 命令嘗試清空主節點上的工作負載,將 Pod 遷移到其他可用節點。
  2. 錯誤訊息表明某些 Pod 無法被刪除,因為它們沒有控制器管理,或者是由 DaemonSet 管理。需要使用 --force--ignore-daemonsets 引數來強制刪除或忽略 DaemonSet 管理的 Pod。

隨著容器化和雲端運算技術的持續發展,Kubernetes 叢集的管理和擴充套件將變得更加重要。未來,可以考慮進一步探索自動化擴充套件、叢集監控和安全強化等主題,以提升 Kubernetes 叢集的效能和可靠性。

MicroK8s 叢集擴充套件流程

  graph LR
    A[新增工作節點] --> B[執行 microk8s join 命令]
    B --> C[驗證節點狀態]
    C --> D[隔離主節點]
    D --> E[檢查工作負載分佈]
    E --> F[清空主節點]
    F --> G[驗證工作負載遷移]

圖表翻譯:

此圖表展示了使用 MicroK8s 擴充套件 Kubernetes 叢集的主要步驟,包括新增工作節點、驗證節點狀態、隔離主節點、檢查工作負載分佈以及清空主節點等過程。透過這些步驟,可以有效地擴充套件和管理 Kubernetes 叢集。

Kubernetes節點維護與Pod重新排程詳解

在Kubernetes叢集管理中,節點維護是一個重要的操作任務。當需要對特定節點進行維護或升級時,需要將該節點上的工作負載遷移到其他可用節點,以確保應用的持續可用性。本文將詳細探討如何使用kubectl drain命令安全地清空節點並重新排程Pod。

使用kubectl drain進行節點維護

kubectl drain命令用於安全地清空指定節點上的Pod,將它們重新排程到叢集中的其他可用節點。這個過程涉及多個步驟和考量因素,以確保操作的順利進行。

初始嘗試與錯誤處理

shiva@wks01:~$ microk8s kubectl drain wks01
node/wks01 cordoned
error: unable to drain node "wks01", aborting command...

執行drain命令時,Kubernetes可能會報告錯誤,指出無法刪除某些Pod。這通常是因為這些Pod不是由Deployment或其他控制器管理的,而是透過run命令直接建立的。此外,Kubernetes還可能報告無法刪除由DaemonSet管理的Pod。

錯誤分析與解決方案

錯誤訊息中提到無法刪除的Pod包括:

  • 使用run命令建立的Pod(非Deployment管理)
  • 由DaemonSet管理的Pod(如calico-node-5q6x6

為瞭解決這些問題,可以使用以下選項:

  1. --force:強制刪除非控制器管理的Pod
  2. --ignore-daemonsets:忽略DaemonSet管理的Pod

帶有額外選項的drain命令執行

shiva@wks01:~$ microk8s kubectl drain wks01 --force --ignore-daemonsets
node/wks01 already cordoned
evicting pod default/dep-webserver-7d7459d5d7-6m26d
...
pod/coredns-7745f9f87f-5wfv8 evicted
node/wks01 drained

使用--force--ignore-daemonsets選項後,Kubernetes成功地將Pod從wks01節點遷移到其他節點。

Pod重新排程後的狀態檢查

使用以下命令檢查Pod的當前狀態:

microk8s kubectl get pods -A -o custom-columns=NAME:metadata.name,NAMESPACE:metadata.namespace,NODENAME:spec.nodeName,HOSTIP:status.hostIP

輸出結果顯示Pod已經被重新排程到不同的節點:

NAME                                 NAMESPACE     NODENAME    HOSTIP
calico-node-5q6x6                    kube-system   wks01       192.168.0.81
calico-node-xwwbc                    kube-system   node02      192.168.0.191
calico-kube-controllers-6c99c8747f-7xb6p kube-system   node02      192.168.0.191
dep-webserver-7d7459d5d7-5z8qb       default       node02      192.168.0.191
mydeployment-55bb4df494-7c8zz       default       node03      192.168.0.149

詳細分析:

  1. 節點狀態wks01節點已經被清空,所有非DaemonSet管理的Pod被遷移到node02node03
  2. Pod分佈:Pod被重新排程到不同的節點,實作了負載平衡。
  3. DaemonSet管理的Pod:如calico-node-5q6x6,仍然保留在原節點上。

將節點重新上線

維護完成後,可以使用uncordon命令將節點重新標記為可排程:

microk8s kubectl uncordon wks01

雖然wks01節點已經重新上線,但Kubernetes不會自動將Pod遷回該節點,除非有新的排程需求或容錯移轉。

進一步操作:清空其他節點

當需要對其他節點進行維護時,可以重複類別似的操作。例如,清空node03

microk8s kubectl drain node03 --ignore-daemonsets

執行後,node03上的Pod將被遷移到wks01node02,確保叢集的穩定執行。

Kubernetes節點維護最佳實踐

在進行Kubernetes節點維護時,遵循以下最佳實踐可以最大程度地減少對應用程式的影響:

  1. 提前規劃:在進行節點維護之前,提前規劃好維護視窗和預期結果。
  2. 監控叢集狀態:在執行維護操作前後,密切監控叢集和應用的狀態。
  3. 使用自動化工具:利用Kubernetes的自動化功能,如自動排程和自動修復,來簡化維護流程。
  4. 測試維護流程:在非生產環境中測試維護流程,以確保在實際操作時能夠順利進行。
  5. 備份重要資料:在進行重大維護操作前,確保相關資料已經備份。

透過遵循這些最佳實踐,可以確保Kubernetes叢集的穩定性和應用的連續性。

Kubernetes節點維護的未來發展

隨著Kubernetes技術的不斷進步,節點維護和管理也在不斷改進。未來的發展方向可能包括:

  1. 更智慧的排程演算法:改進排程演算法,以更好地平衡負載和最佳化資源利用。
  2. 增強的自動化功能:提供更強大的自動化功能,簡化叢集管理和維護操作。
  3. 更好的可觀察性:增強叢集的可觀察性,提供更詳細的監控和診斷資訊。

這些進步將進一步簡化Kubernetes叢集的管理和維護工作,提高叢集的穩定性和應用的效能。