將 Node 加入 Kubernetes Cluster 的完整指南

在 Kubernetes 中,Node 是用來運行應用程式工作負載的主機。隨著應用程式的擴展,將更多的 Node 加入到 Kubernetes Cluster 中是一個關鍵步驟。本文將詳盡介紹如何將新的 Node 加入已初始化的 Kubernetes Cluster,並探討過程中的最佳實踐和常見問題的解決方案。

前置準備工作

在開始之前,請確保已經完成以下準備工作:

  1. 控制平面(Control Plane)的設置

    • 請參考Day 03- 安裝與設定 Kubernetes 環境中的前面三個步驟,完成 Docker、Kubeadm、Kubectl 和 Kubelet的安裝和服務啟動工作。這包括安裝 Kubernetes 相關套件,以及設定必要的網路和防火牆組態。
  2. 網路連接

    • 確保新 Node 能夠與控制平面節點通過網路連接,這是後續步驟能否成功的關鍵。
  3. 時間同步

    • 所有 Node 的系統時間需要保持同步,以避免由於時間不一致而引發的 TLS 證書驗證失敗問題。建議使用 ntp  chrony 服務來實現時間同步。

加入 Node 的步驟詳解

一旦完成了上述的準備工作,就可以開始將新的 Node 加入到 Kubernetes Cluster 中了。以下是具體的操作步驟:

步驟 1:取得加入指令

首先,您需要在控制平面節點上生成加入指令。這個指令將用來指導新的 Node 如何與現有的 Kubernetes Cluster 進行通訊和註冊。

kubeadm token create --print-join-command

該指令會生成一個類似於以下格式的加入指令:

kubeadm join <master-ip>:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>

這個指令包含了控制平面的 IP 地址、Token 以及證書的雜湊碼(hash code),接下來需要這些資訊將新 Node 加入到 Cluster 中。

步驟 2:在新 Node 上執行加入指令

在每個需要加入的 Node 上,使用 sudo 權限執行剛才取得的加入指令:

sudo kubeadm join 192.168.1.100:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef

該指令將使該 Node 與控制平面進行通訊,並將其註冊到 Kubernetes Cluster 中。成功執行後,您會看到成功加入的提示資訊:

[preflight] Running pre-flight checks
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Starting the kubelet
[kubelet-check] Waiting for a healthy kubelet. This can take up to 4m0s
[kubelet-check] The kubelet is healthy after 501.604437ms
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap

This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

[Run 'kubectl get nodes' on the control-plane to see this node join the cluster.]

步驟 3:驗證 Node 加入結果

加入完成後,您可以通過以下指令檢查所有 Node 是否成功加入 Cluster:

kubectl get nodes

在指令輸出中,您應該能看到新加入的 Node,並且其狀態為 Ready。如果一切正常,新 Node 應該如以下範例所示已經加入到 Cluster 並準備好接收工作負載:

NAME    STATUS  ROLES          AGE   VERSION
k8s-cp  Ready   control-plane  4h2m  v1.30.3
k8s-n1  Ready   <none>         2m7s  v1.30.3

這表示有兩個節點在 Kubernetes 叢集中,一個是控制平面節點(k8s-cp),另一個是沒有指定角色的工作節點(k8s-n1),兩者的狀態都是 "Ready",並且都運行在 Kubernetes 版本 v1.30.3

處理常見問題

Node 狀態非 Ready

如果新 Node 已經顯示在 kubectl get nodes 的列表中,但其狀態並非 Ready,這可能是由於以下原因:

NAME    STATUS  ROLES          AGE   VERSION
k8s-cp  Ready   control-plane  4h2m  v1.30.3
k8s-n1  NotReady   <none>         2m7s  v1.30.3
  • 網路套件模組未完全啟動:新 Node 可能正在啟動網路套件模組,這過程中狀態會暫時為 NotReady。此情況通常不會持續很久,等待網路套件模組啟動完畢即可。
  • 時間不同步:時間不一致也可能導致 Node 無法正確加入 Cluster。檢查所有節點的時間同步狀況,並確保它們在同一時間服務器上同步。

進階主題:擴展與最佳實踐

隨著 Kubernetes Cluster 的規模增長,持續擴展 Cluster 的能力變得相當重要。以下是一些在擴展 Kubernetes Cluster 時應該考慮的進階主題和最佳實踐:

1. 多區域與多Cluster的設置

  • 在大型部署中,考慮跨多個地理區域或多個 Cluster 部署 Node,以提高 Cluster 的高可用性和故障恢復能力。

2. 自動化擴展

  • 使用 Kubernetes 的 Cluster Autoscaler 自動管理 Node 的擴展與縮減,根據工作負載需求自動調整 Cluster 大小。

3. 資源監控與優化

  • 定期監控 Cluster 中的資源使用情況,確保每個 Node 的負載平衡。使用 Prometheus 和 Grafana 等工具,幫助您可視化和優化資源分配。

防火牆與網路設定的詳細說明

在正式環境中,網路設定和防火牆設置尤為重要。以下是一些關鍵的端口和服務,它們需要在防火牆中開放,以確保 Kubernetes Cluster 的順利運行:

  • 6443:Kubernetes API 服務。這是控制平面和 Node 之間通訊的核心端口,必須開放以允許控制平面與每個 Node 之間的安全通訊。
  • 10250:Kubelet API。Kubelet 是 Kubernetes 的一個組件,它在每個 Node 上運行,負責管理該 Node 上的容器。開放此端口以允許控制平面與 Kubelet 通訊。
  • 10255:Kubelet 唯讀端口(可選)。如果啟用了此端口,將允許對 Node 的唯讀存取,主要用於監控用途。
  • 8472:Flannel vxlan(如果使用 Flannel)。Flannel 是一種 Kubernetes 網路套件模組,確保這個端口在使用 Flannel 的情況下被開放。

總結

通過以上詳細步驟,您已經成功地將 Node 加入到 Kubernetes Cluster。這些新加入的 Node 為您的 Cluster 提供了更多的計算資源,使其具備更高的可用性和擴展性。隨著 Cluster 的擴展和應用負載的增加,繼續遵循這些最佳實踐將有助於保持 Kubernetes 部署的健康和穩定。在未來的文章中,我們將進一步探討 Kubernetes 的其他核心概念和進階功能,幫助您更深入地理解並掌握這一強大的容器編排工具。

文章標籤
全站熱搜
創作者介紹
創作者 unexpected 的頭像
unexpected

料想不到部落格(unexpected blog)

unexpected 發表在 痞客邦 留言(0) 人氣(0)