將 Node 加入 Kubernetes Cluster 的完整指南
在 Kubernetes 中,Node 是用來運行應用程式工作負載的主機。隨著應用程式的擴展,將更多的 Node 加入到 Kubernetes Cluster 中是一個關鍵步驟。本文將詳盡介紹如何將新的 Node 加入已初始化的 Kubernetes Cluster,並探討過程中的最佳實踐和常見問題的解決方案。
前置準備工作
在開始之前,請確保已經完成以下準備工作:
控制平面(Control Plane)的設置:
- 請參考Day 03- 安裝與設定 Kubernetes 環境中的前面三個步驟,完成 Docker、Kubeadm、Kubectl 和 Kubelet的安裝和服務啟動工作。這包括安裝 Kubernetes 相關套件,以及設定必要的網路和防火牆組態。
網路連接:
- 確保新 Node 能夠與控制平面節點通過網路連接,這是後續步驟能否成功的關鍵。
時間同步:
- 所有 Node 的系統時間需要保持同步,以避免由於時間不一致而引發的 TLS 證書驗證失敗問題。建議使用
ntp或chrony服務來實現時間同步。
- 所有 Node 的系統時間需要保持同步,以避免由於時間不一致而引發的 TLS 證書驗證失敗問題。建議使用
加入 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 的其他核心概念和進階功能,幫助您更深入地理解並掌握這一強大的容器編排工具。
