指令找不到 kubectl

  sudo su -c "echo 'export PATH=\${PATH}:/usr/local/bin' >> /root/.bashrc"
  

目標節點下載失敗

  1. 下載第一個檔案就失敗
    • 在目標主機上執行 curl [http://<部署主機 IP>/ --output /tmp/trash.bin
      • 檢查 佈署主機 防火牆是否有開通 Port (80 & 35000)
      • 檢查 佈署主機 Nginx & Registry 服務是否有起來
      • 檢查 佈署主機 資料目錄內是否有此對應的檔案
  2. 中間某個檔案單獨失敗
    • 檢查檔案是否存在
      • 於 Koffline 容器內的 /outputs/files/ 確認此檔案是否存在、版本等資訊是否一致
    • 檢查檔案 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 預設值,執行時將自動取代原有值

NodeLocalDNS CrashLoopBackOff 問題

此問題通常發生在該節點並未設置上游 DNS 伺服器時。現階段解法如下

  1. 修改 /inventory/group_vars/k8s_cluster/k8s-cluster.yml 內 resolvconf_mode 成 none
  2. 移除 /inventory/group_vars/all/all.yml 內 upstream_dns_servers 前面的註解符號,讓此處的設定指向至少一個 DNS,此處的範例直接沿用官方的範例 8.8.8.8 & 8.8.4.4
  3. 參考來源

如果該環境內部並未使用 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 為哪張網卡決定他要綁在哪個裝置上。
  • 檢測方式
    1. kubectl get pods -A 取得掛掉的 Pod Name
    2. kubectl 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

  1. 確定節點間網路皆正常異常

    先檢測兩節點間網路是否通暢,可以使用任何網路工具 (i.e ping) 確認是否能連通
    可能是 VLAN tag、路由、實體網路出現狀況而導致

  2. 嘗試連線 Kubernetes API Server

      curl https://x.x.x.x:6443
      
  3. 防火牆

    若此時出現 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:
    ...
      

    加入規則開放 6443

      sudo 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 指定映像檔。

Was this page helpful?