--- name: k8s-installer description: 自動化安裝 Kubernetes 叢集的 AI Agent Skill author: Jeff.Hou version: 1.1.2 --- # K8S-Installer ## Overview 自動化安裝 Kubernetes 高可用(HA)叢集的 AI Agent Skill。預設配置為 5 個節點:3 個 Master(Control Plane)+ 2 個 Worker。透過 SSH 連線到目標 Linux 節點,依序執行前置作業、安裝 containerd 與 kubeadm 套件、初始化 HA Control Plane、安裝 Calico CNI 網路外掛與 MetalLB LoadBalancer,並將 Worker 節點加入叢集。 ## When to Use This Skill 使用此 Skill 當使用者: - 要求「幫我安裝 K8S」或「建立 Kubernetes 叢集」 - 提供節點 IP 位址並詢問如何部署 K8S - 詢問「如何自動化安裝 Kubernetes」 - 需要在多台 Linux 伺服器上建立 K8S 叢集 - 有 SSH 存取權限的伺服器並想要部署容器平台 ## Prerequisites ### 執行環境(AI Agent 端) - 可執行 Python 3.11+ 腳本 - 需要 `paramiko`(SSH)、`click`(CLI)、`pyyaml`(設定檔)套件 ### 目標節點(要安裝 K8S 的伺服器) - **5 個節點**(預設配置): - master-1, master-2, master-3(Control Plane HA) - worker-1, worker-2(Worker 節點) - Oracle Linux 9+ 或其他 RHEL 相容系統 - 每節點至少 2 CPU、2GB RAM - 節點間網路互通 - 必要 Port: - Control Plane:6443, 2379-2380, 10250, 10259, 10257 - Worker:10250, 30000-32767 - SSH 存取權限(root 或具 sudo 權限的使用者) - 需要 internet 連線以下載套件 - **建議**:設定 Load Balancer 指向 3 個 Master 的 6443 port ## Parameters 向使用者收集以下資訊(預設 5 節點 HA 架構): | 參數 | 類型 | 必填 | 說明 | |------|------|------|------| | master_nodes | list | ✓ | Master 節點列表(預設 3 個),每個包含 host、user、password | | worker_nodes | list | ✓ | Worker 節點列表(預設 2 個),每個包含 host、user、password | | load_balancer_ip | string | | Load Balancer IP(HA 架構建議設定) | | pod_network_cidr | string | | Pod 網路 CIDR,預設 192.168.0.0/16(Calico 預設) | | metallb_ip_range | string | | MetalLB IP 位址範圍,例如 192.168.1.200-192.168.1.250 | ### 預設節點配置 | 節點 | 角色 | 說明 | |------|------|------| | node-1 | master-1 | 第一個 Control Plane(初始化節點) | | node-2 | master-2 | 第二個 Control Plane | | node-3 | master-3 | 第三個 Control Plane | | node-4 | worker-1 | 第一個 Worker 節點 | | node-5 | worker-2 | 第二個 Worker 節點 | ### 參數收集對話範例 ``` 我需要以下資訊來安裝 K8S HA 叢集(3 Master + 2 Worker): === Master 節點(Control Plane HA)=== 請提供 3 個 Master 節點的連線資訊: --- master-1(初始化節點)--- IP 位址: SSH 使用者: root SSH 密碼: --- master-2 --- IP 位址: SSH 使用者: root SSH 密碼: --- master-3 --- IP 位址: SSH 使用者: root SSH 密碼: === Worker 節點 === 請提供 2 個 Worker 節點的連線資訊: --- worker-1 --- IP 位址: SSH 使用者: root SSH 密碼: --- worker-2 --- IP 位址: SSH 使用者: root SSH 密碼: === Load Balancer(選填但建議)=== Load Balancer IP(指向 3 個 Master 的 6443 port): === 網路設定(選填)=== Pod 網路 CIDR?(預設 192.168.0.0/16,Calico 預設) === MetalLB 設定(選填)=== MetalLB IP 位址範圍?(例如 192.168.1.200-192.168.1.250) ``` ## Execution Workflow ### Step 1: 驗證連線 在開始安裝前,先測試所有節點的 SSH 連線: ```python # 對每個節點執行連線測試 ssh {user}@{host} -p {port} "echo 'Connection OK'" ``` 如果連線失敗,報告錯誤並請使用者確認: - SSH 服務是否啟動 - 防火牆是否允許 22 port - 使用者名稱密碼是否正確 ### Step 2: 前置作業(所有節點) 在每個節點執行: **2.1 停用 Swap** ```bash swapoff -a sed -i '/swap/d' /etc/fstab ``` **2.2 載入核心模組** ```bash cat < 4m v1.29.0 worker-2 Ready 3m v1.29.0 ``` 檢查 etcd 叢集狀態: ```bash kubectl get pods -n kube-system -l component=etcd ``` 預期有 3 個 etcd Pod 運行中。 檢查 Calico CNI 狀態: ```bash kubectl get pods -n calico-system ``` 預期所有 calico-node Pod 都為 Running。 檢查 MetalLB 狀態: ```bash kubectl get pods -n metallb-system kubectl get ipaddresspool -n metallb-system ``` ## Output 安裝完成後,回報以下資訊給使用者: ``` ✅ K8S HA 叢集安裝完成! 叢集資訊: - 架構:High Availability(HA) - Master 節點:3 個(master-1, master-2, master-3) - Worker 節點:2 個(worker-1, worker-2) - Control Plane Endpoint: {endpoint} - Pod 網路: {pod_network_cidr} - CNI: Calico - LoadBalancer: MetalLB(IP 範圍: {metallb_ip_range}) - Kubernetes 版本: v1.29.0 📋 Join 命令(供未來新增節點使用): # 新增 Master(Control Plane) kubeadm join {endpoint}:6443 --token {token} \ --discovery-token-ca-cert-hash sha256:{hash} \ --control-plane --certificate-key {cert_key} # 新增 Worker kubeadm join {endpoint}:6443 --token {token} \ --discovery-token-ca-cert-hash sha256:{hash} 下一步: 1. SSH 登入任一 Master: ssh {user}@{master_ip} 2. 檢查節點狀態: kubectl get nodes 3. 檢查 Calico 狀態: kubectl get pods -n calico-system 4. 檢查 MetalLB 狀態: kubectl get pods -n metallb-system 5. 部署第一個應用: kubectl create deployment nginx --image=nginx 6. 建立 LoadBalancer Service: kubectl expose deployment nginx --type=LoadBalancer --port=80 ``` ## Error Handling ### SSH 連線失敗 ``` ❌ 無法連線到 {host} 可能原因: - SSH 服務未啟動:systemctl status sshd - 防火牆阻擋:firewall-cmd --add-port=22/tcp --permanent - 密碼錯誤 請確認後重試。 ``` ### kubeadm init 失敗 ``` ❌ Control Plane 初始化失敗 可能原因: - CPU 或記憶體不足(需至少 2 CPU、2GB RAM) - swap 未停用:free -h 確認 swap 為 0 - 已有 K8S 殘留:kubeadm reset -f 錯誤訊息:{error_message} ``` ### Worker 加入失敗 ``` ❌ Worker {host} 無法加入叢集 可能原因: - 無法連線 Control Plane 6443 port - Token 已過期(24 小時有效) - 網路不通 請確認後重試,或重新產生 token:kubeadm token create --print-join-command ``` ## Scripts Location 此 Skill 的執行腳本位於 `scripts/` 目錄: - `install.py` - 主要安裝腳本 - `ssh_client.py` - SSH 連線封裝 - `config.py` - 設定檔處理 ## References 參考文件位於 `references/` 目錄: - `kubeadm_setup.md` - kubeadm 官方安裝指南 - `troubleshooting.md` - 常見問題排除 - `oracle_linux_notes.md` - Oracle Linux 特定注意事項 ## Key Principles **收集完整資訊再執行**: - 在開始安裝前,確保已收集所有必要的節點連線資訊 - 先驗證 SSH 連線,避免安裝到一半失敗 **逐步回報進度**: - 每完成一個步驟,告知使用者進度 - 如果某步驟耗時較長,提供預估時間 **清楚的錯誤訊息**: - 發生錯誤時,提供具體的原因與解決建議 - 不要只說「安裝失敗」,要說明是哪個步驟、什麼錯誤 **安全考量**: - 密碼等敏感資訊不要顯示或記錄 - 完成後提醒使用者變更預設密碼