Skip to content
Open Source

新增與維護節點

用 zeabur-installer 加入新節點,停止排程,用 kubectl 移走副本與移除節點,並在需要時安全地開啟節點終端機。

到 叢集 → 概覽 的 節點 查看每台主機的狀況。要多一台主機執行服務,見加入節點。主機要停機維護時,在該節點的操作選單選 停止排程,需要移走副本時再用 kubectl 的 drain。

  • 只有用 Zeabur Installer(RKE2)安裝的叢集能用 zeabur-installer node add 加節點。其他叢集用原本的安裝工具。
  • 準備一台能用 root 操作的新 VM,以及安裝第一台伺服器時用的同一個 zeabur-installer 執行檔。
  • 所有節點放在同一家主機服務商的同一個區域,同區域內不同的可用區域沒有問題。跨服務商或跨區域時,延遲會拖慢 etcd、Kubernetes API 和儲存。
  • 停止排程和恢復排程需要修改 Node 的權限。drain 和 delete node 在 kubectl 終端機執行,用的是你自己的權限。節點終端機要用管理員帳號開啟。

節點之間的防火牆要開放:

方向連接埠
連到 RKE2 伺服器TCP 9345、6443
所有節點之間TCP 10250、9099,UDP 8472(Canal VXLAN)
RKE2 伺服器之間TCP 2379–2381

UDP 8472 只對叢集節點開放,不要對網際網路開放。Installer 的連線檢查測不到 UDP 8472,如果它被擋住,不同節點上的 Pod 會連不到彼此。

加入節點的指令都在 zeabur-installer,完整選項見 Installer 指令。

以 root 登入現有的伺服器,執行:

sudo zeabur-installer node add --ttl 1h

指令印出新 VM 要執行的內容:寫入 /etc/zeabur-installer/config.yaml 的設定,以及 plan 和 apply。輸出裡的權杖等同密碼,不要貼到公開的地方。

加入工作節點用會過期的 bootstrap 權杖,--ttl 預設 1 小時,最長 24 小時。要加入伺服器(控制平面),加上 --role server,用的是叢集的 server 權杖,不會過期。新 VM 連不到伺服器的內部位址時,用 --address 指定它連得到的位址。

叢集跑 Longhorn 或 zot 鏡像時,輸出會自動帶上對應的設定。設定檔還寫著 profile: single-node 時,輸出會提醒你改成 multi-node 並重新 apply。

把安裝第一台伺服器用的 zeabur-installer 複製到新 VM,以 root 貼上上一步的輸出。它會寫好設定檔,再執行:

zeabur-installer plan
zeabur-installer apply

plan 只列出網路檢查和警告,不改任何東西。有警告時先處理再繼續。apply 安裝 RKE2,等節點就緒才結束。

sudo zeabur-installer node sync
sudo /var/lib/rancher/rke2/bin/kubectl --kubeconfig /etc/rancher/rke2/rke2.yaml get nodes -o wide

node sync 把新節點的位址加進 Installer 建立的基準網路政策。新加入的伺服器會自己同步。工作節點加入後,一定要在伺服器手動執行一次,在這之前網路政策會擋掉新節點的流量。看到新節點 Ready 後,撤銷工作節點的權杖,把 <ID> 換成 node add 輸出最後一行裡的 ID:

sudo /var/lib/rancher/rke2/bin/kubectl --kubeconfig /etc/rancher/rke2/rke2.yaml \
-n kube-system delete secret bootstrap-token-<ID>

已加入的節點不受影響,之後也不能再用這份權杖加入。

etcd 需要過半數的伺服器才能運作。要在少一台時繼續運作,至少要三台伺服器。只有兩台時,任一台停機整個叢集就會停擺。

在節點選單選 停止排程,節點列就會標示已停止排程。這會阻止新的 Pod 排到這台節點,已經在跑的 Pod 會留在原處。只是要重開機,做到這一步就夠了,不需要執行 drain。

也可以在 Zeabur 叢集 頁標題旁點 開啟 kubectl 終端機,執行:

kubectl cordon <node>

把 <node> 換成節點名稱。重開機完成後,再恢復排程。

到 Zeabur 叢集 頁標題旁點 開啟 kubectl 終端機,先列出這台節點上的 Pod,以及它們使用的 PVC:

kubectl get pods -A --field-selector spec.nodeName=<node> -o custom-columns=NS:.metadata.namespace,POD:.metadata.name,PVC:.spec.volumes[*].persistentVolumeClaim.claimName

對照清單中的 PVC,確認哪些使用這台節點的 local-path 磁碟區。這些磁碟區的資料只存在這台節點上,不會跟著 Pod 搬到其他節點。

確認後,執行:

kubectl drain <node> --ignore-daemonsets --delete-emptydir-data

drain 會停止這台節點的排程,並驅逐 Pod,讓控制器在其他節點重新建立副本。DaemonSet 管理的 Pod 會留在原處。執行時請注意:

  • drain 會遵守 PodDisruptionBudget;被擋住時會一直重試,直到允許驅逐。
  • 遇到不屬於任何控制器的 Pod,drain 會停下來。這類 Pod 刪掉後不會自動啟動,確認可以刪除後,才在指令末尾加上 --force。
  • --delete-emptydir-data 會清空被驅逐 Pod 的 emptyDir 暫存資料。
  • 使用這台節點 local-path 磁碟區的 Pod 也會被驅逐。重新建立的 Pod 無法在其他節點使用這些磁碟區,會維持 Pending,直到原節點回來。資料不會因為 drain 遺失;對這些 Pod 來說,結果跟直接停機一樣,都得等這台節點恢復。

如果 Zeabur 自己也跑在這台節點上,drain 時頁面會斷線約一分鐘。請重新整理頁面並重新登入;kubectl 終端機也會斷線,需要重新開啟。

等 drain 完成後,再將節點停機維護。

維護完成、節點恢復運作後,在節點選單選 恢復排程。

也可以到 Zeabur 叢集 頁標題旁點 開啟 kubectl 終端機,執行:

kubectl uncordon <node>

恢復排程後,新的 Pod 就能排到這台節點。

不要移除叢集唯一的節點,也不要移除最後一台控制節點。

先到 Zeabur 叢集 頁標題旁點 開啟 kubectl 終端機,確認控制節點數量:

kubectl get nodes -l node-role.kubernetes.io/control-plane

如果只剩一台控制節點,不要刪除它。移除後如果剩不到三台 server 節點,控制平面再少一台就無法運作。

local-path 磁碟區的資料只在這台 VM 上。節點移除後,使用這些磁碟區的 Pod 沒有地方可以啟動。依照「讓節點停機維護」的步驟檢查 Pod 與磁碟區,再執行 drain,完成後才刪除節點:

kubectl drain <node> --ignore-daemonsets --delete-emptydir-data
kubectl delete node <node>

接著登入被移除的那台 VM,以 root 執行:

/usr/local/bin/rke2-uninstall.sh
zeabur-installer uninstall --purge

刪除 Kubernetes 節點後,還要完成 VM 上的解除安裝。 在執行解除安裝前,只要 RKE2 重新啟動,這台 VM 就會再次加入叢集。

/var/lib/zeabur/storage 底下的磁碟區會留在 VM 上。確認不再需要這些資料後,再手動刪除。

最後,回到執行 Zeabur Installer 的伺服器,執行:

sudo zeabur-installer node sync

這會把已移除節點的位址從基準網路政策中拿掉。

節點終端機 會在主機上開一個完整的 root shell。用管理員帳號登入,在節點列按 節點終端機,看過要建立的終端機 Pod 和時限,再按 開啟終端機。

節點會記下一筆事件,寫明是誰在什麼時候開啟的。畫面顯示 其他人也能進入這個終端機 時,表示有角色綁定讓叢集管理員以外的人能在終端機所在的 Namespace 建立 Pod。移除列出的角色綁定後再重新檢查。

關閉終端機時,Zeabur 會移除終端機 Pod,Pod 最多保留 30 分鐘。如果 Pod 留了下來,在節點下方的終端機 Pod 清單按 移除終端機 Pod,檢查後確認。

  • 加入時連不到伺服器:確認新 VM 連得到 node add 印出的伺服器位址的 TCP 9345、6443,以及上面表格的其他連接埠。
  • 新節點已就緒,但不同節點上的服務連不到彼此:檢查 UDP 8472,以及網路政策是否已放行新節點。
  • drain 一直停著:它在等 PodDisruptionBudget 放行,或停在不屬於任何控制器的 Pod 上。用 kubectl get pdb -A 看哪個預算擋住了,處理後再執行一次。
  • 副本在新節點 Pending:它用的是舊節點的 local-path 磁碟區,要等舊節點回來。
  • 終端機 Pod 無法啟動:看該 Pod 的事件,常見原因是映像檔下載失敗。