通用故障
安裝過程中常見的錯誤與解決方式
指令找不到 kubectl
sudo su -c "echo 'export PATH=\${PATH}:/usr/local/bin' >> /root/.bashrc"
目標節點下載失敗
- 下載第一個檔案就失敗
- 在目標主機上執行
curl [http://<部署主機 IP>/ --output /tmp/trash.bin- 檢查
佈署主機防火牆是否有開通 Port (80 & 35000) - 檢查
佈署主機Nginx & Registry 服務是否有起來 - 檢查
佈署主機資料目錄內是否有此對應的檔案
- 檢查
- 在目標主機上執行
- 中間某個檔案單獨失敗
- 檢查檔案是否存在
- 於 Koffline 容器內的
/outputs/files/確認此檔案是否存在、版本等資訊是否一致
- 於 Koffline 容器內的
- 檢查檔案 Hash 值是否正確
- 執行 Ansible-playbook 時加上
-v,-vvv,-vvvvvv檢視詳細的除錯資訊,訊息確認比對的 hash 值 - Hash 值存放的位置:
/kubespray/roles/kubespray_defaults/vars/main/checksums.yml(Kubespray v2.27 以前為roles/download/defaults/main.yml) - 臨時性修復方式:新增
/inventory/group_vars/all/patch.yml,並且在裡面設定一樣的變數名稱來取代錯誤的 hash 值- inventory 內變數的優先權高於 role 預設值,執行時將自動取代原有值
- 執行 Ansible-playbook 時加上
- 檢查檔案是否存在
NodeLocalDNS CrashLoopBackOff 問題
此問題通常發生在該節點並未設置上游 DNS 伺服器時。現階段解法如下
- 修改
/inventory/group_vars/k8s_cluster/k8s-cluster.yml內resolvconf_mode成none - 移除
/inventory/group_vars/all/all.yml內upstream_dns_servers前面的註解符號,讓此處的設定指向至少一個 DNS,此處的範例直接沿用官方的範例8.8.8.8&8.8.4.4 - 參考來源
如果該環境內部並未使用 DNS,可以採取另一個方案
- 修改
/inventory/group_vars/k8s_cluster/k8s-cluster.yml內enable_nodelocaldns成false
Flannel 安裝失敗
- 安裝到一半顯示
Timeout when waiting for file /run/flannel/subnet.env subnet.env為 CNI Pod 啟動時自動產生,需先查明不能啟動的原因- 檢查 nodes 上面是否缺 default route (ex : 0.0.0.0/0),flannel 啟動時是透過搜尋 default route 為哪張網卡決定他要綁在哪個裝置上。
- 檢測方式
kubectl get pods -A取得掛掉的 Pod Namekubectl logs -n kube-system {Pod Name}檢視問題
sudo 指令卡住
多數原因為 sudo 進行主機名稱反查時,/etc/hosts 內缺此主機的 host 對應時即可能發生,加上對應紀錄即可
hostname | awk '{print "127.0.0.1 "$1}' >> /etc/hosts
dial tcp x:6443: connect: no route to host
TASK [kubernetes/kubeadm : Join to cluster] ****************************************************************************
fatal: [worker1]: FAILED! => {"changed": false, "cmd": ["timeout", "-k", "120s", "120s", "/usr/local/bin/kubeadm", "join",
"--config", "/etc/kubernetes/kubeadm-client.conf", "--ignore-preflight-errors=DirAvailable--etc-kubernetes-manifests",
"--skip-phases="], "delta": "0:01:00.446181", "end": "2024-01-17 14:02:52.298855", "msg": "non-zero return code", "rc": 1,
"start": "2024-01-17 14:01:51.852674", "stderr": "\t[WARNING FileExisting-tc]: tc not found in system path\nerror execution phase
preflight: couldn't validate the identity of the API Server: Get \"https://192.168.2.61:6443/api/v1/namespaces/kube-public/configmaps
/cluster-info?timeout=10s\": dial tcp 192.168.2.61:6443: connect: no route to host\nTo see the stack trace of this error execute with
--v=5 or higher", "stderr_lines": ["\t[WARNING FileExisting-tc]: tc not found in system path", "error execution phase preflight: couldn't
validate the identity of the API Server: Get \"https://192.168.2.61:6443/api/v1/namespaces/kube-public/configmaps/cluster-info?timeout=10s\":
dial tcp 192.168.2.61:6443: connect: no route to host", "To see the stack trace of this error execute with --v=5 or higher"],
"stdout": "[preflight] Running pre-flight checks", "stdout_lines": ["[preflight] Running pre-flight checks"]}
Wednesday 17 January 2024 19:02:52 +0000 (0:01:01.433) 0:19:41.762 *****
TASK [kubernetes/kubeadm : Display kubeadm join stderr if any] *****************************************************************************************************************************************************
ok: [worker1] => {
"msg": "Joined with warnings\n['\\t[WARNING FileExisting-tc]: tc not found in system path', 'error execution phase preflight:
couldn\\'t validate the identity of the API Server: Get \"https://192.168.2.61:6443/api/v1/namespaces/kube-public/configmaps/cluster-info?timeout=10s\":
dial tcp 192.168.2.61:6443: connect: no route to host', 'To see the stack trace of this error execute with --v=5 or higher']\n"
}
Wednesday 17 January 2024 19:03:53 +0000 (0:00:00.049) 0:20:43.119 *****
執行過程中部分節點無法連線到 Kubernetes API Server,且出現 no route to host
確定節點間網路皆正常異常
先檢測兩節點間網路是否通暢,可以使用任何網路工具 (i.e ping) 確認是否能連通可能是 VLAN tag、路由、實體網路出現狀況而導致
嘗試連線 Kubernetes API Server
curl https://x.x.x.x:6443防火牆
若此時出現
no route to host但節點間網路是可以互相連通,很可能就是防火牆導致連到該 IP 所屬節點後,利用指令檢查防火牆狀況$ sudo firewall-cmd --list-all public (active) target: default ... services: cockpit dhcpv6-client dns https kube-worker ssh ports: <---- 為空表示沒有開放任何 Port protocols: ...加入規則開放
6443sudo firewall-cmd --add-port=6443/tcp --permanent sudo firewall-cmd --reload sudo firewall-cmd --list-all確認
6443是否成功加入,若成功會看到ports: 6443/tcp
可以查看文件瞭解更多 Kubernetes 使用到的埠號
重新執行 cluster.yml 時停在「Wait for new control plane nodes to be Ready」
若首次安裝後 CNI 未正常啟動(例如 Pod 處於 ImagePullBackOff),直接重新執行 cluster.yml 會在等待控制節點 Ready 的步驟逾時:重新執行時 Kubespray 會先等待節點 Ready 才部署 CNI,而節點在 CNI 未就緒前不會成為 Ready。請先排除 CNI 無法啟動的原因(通常為映像檔無法下載),再執行 reset.yml(請參考安裝 & 建置)後重新安裝。
Pod 處於 ImagePullBackOff,且映像檔名稱含 @sha256:
以 Helm chart 安裝的元件(如 Cilium)可能於 chart 內固定上游映像檔的 digest。Koffline 推送至私有 Registry 的映像檔 digest 與上游不同,帶有 digest 的映像檔名稱必然無法下載。Koffline 產生的 /inventory/group_vars/all/offline.yml 已針對 Cilium 關閉 useDigest;如自行加入其他 chart 或 values,請同樣關閉 digest 並改以 tag 指定映像檔。