指令找不到 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. 中間某個檔案單獨失敗
    • 檢查檔案是否存在
      • ${HOME}/outputs/files/ 下確認此檔案是否存在、版本等資訊是否一致
    • 檢查檔案 Hash 值是否正確
      • 執行 Ansible-playbook 時加上 -v, -vvv, -vvvvvv 檢視詳細的除錯資訊,訊息確認比對的 hash 值
      • Hash 值存放的位置:${kubespray_project}/roles/download/defaults/main.yml
      • 臨時性修復方式:新增 ${kubespray_inventory_dir}/group_vars/all/patch.yml,並且在裡面設定一樣的變數名稱來取代錯誤的 hash 值
        • 此方式新增的變數優先權比 roles/download/defaults/main.yml 高,所以執行時會自動替代掉舊值

NodeLocalDNS CrashLoopBackOff 問題

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

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

如果該環境內部並未使用 DNS,可以採取另一個方案

  • 修改 /inventory/group_vars/ks8_cluster/k8s-cluster.ymlenable_nodelocaldnsfalse

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 使用到的埠號

Was this page helpful?