RKE 叢集常見問題排查
SSH 連線報錯
Failed to set up SSH tunneling for host [xxx.xxx.xxx.xxx]: Can't retrieve Docker Info
Failed to dial to /var/run/docker.sock: ssh: rejected: administratively prohibited (open failed)
- 沒有訪問 Docker socket 的許可權,請登入主機,執行docker ps檢查許可權:
ssh -i ssh_privatekey_file user@server user@server$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
請參考如何以非 root 使用者角色管理 Docker,正確配置您的許可權。
-
如果您使用的作業系統是 RedHat 或 CentOS,您不能使用 root 使用者連線節點,因為這兩種系統有這個 bugBugzilla #1527565。您需要新增一個使用者,然後為它配置訪問 Docker socket 的許可權。詳情請參考RKE OS Requirements。
-
SSH server 的版本低於 v6.7。通過 SSH 連線 Docker socket 需要用到 v6.7 或以上的 SSH server。您可以執行sshd -V命令檢查當前主機使用的 SSH server 版本,或使用 netcat 命令檢查 SSH server 版本,如下方示例程式碼所示,請將“xxx.xxx.xxx.xxx”替換為主機 IP 地址:
nc xxx.xxx.xxx.xxx 22
SSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2ubuntu2.10
Failed to dial ssh using address [xxx.xxx.xxx.xxx:xx]: Error configuring SSH: ssh: no key found
-
無法訪問金鑰檔案ssh_key_path。請檢查您是否已經指定了金鑰檔案,檢查執行 rke 命令的使用者是否有許可權訪問這個金鑰檔案。
-
金鑰檔案ssh_key_path異常。執行ssh-keygen -y -e -f private_key_file命令,檢查金鑰檔案是否有效。該命令的返回訊息包括了公鑰和私鑰,如果私鑰失效,該命令會返回報錯訊息。
Failed to dial ssh using address [xxx.xxx.xxx.xxx:xx]: ssh: handshake failed: ssh: unable to authenticate, attempted methods [none publickey], no supported methods remain
- 金鑰檔案ssh_key_path不正確。請檢查節點使用的金鑰檔案是否為ssh_key_path,然後檢查您是否指定了正確的使用者使用這個金鑰通過 SSH 連線。
Failed to dial ssh using address [xxx.xxx.xxx.xxx:xx]: Error configuring SSH: ssh: cannot decode encrypted private keys
- 如果您想使用加密的私鑰,您應該使用ssh-agent命令載入金鑰和金鑰短語(passphrase)。您可以在命令列工具輸入--ssh-agent-auth命令,配置 RKE 使用這個 agent。它會在執行rke命令的環境中使用SSH_AUTH_SOCK環境變數。
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
- 無法連線節點,請檢查配置的地址address和埠port是否有誤。
啟動叢集報錯
Failed to get job complete status 無法獲取”job complete“狀態
觸發這個報錯資訊的最常見原因是節點內有些問題,阻止了節點內的 job 成功執行。請執行下文的命令,檢查節點狀態,排查問題。
執行以下命令以列出節點 Conditions,關於節點 Conditions 請檢視節點 Conditions
kubectl get nodes -o go-template='{{range .items}}{{$node := .}}{{range .status.conditions}}{{$node.metadata.name}}{{": "}}{{.type}}{{":"}}{{.status}}{{"\n"}}{{end}}{{end}}'
執行以下命令以列出節點有問題的 Conditions,關於節點 Conditions 請檢視節點 Conditions
kubectl get nodes -o go-template='{{range .items}}{{$node := .}}{{range .status.conditions}}{{if ne .type "Ready"}}{{if eq .status "True"}}{{$node.metadata.name}}{{": "}}{{.type}}{{":"}}{{.status}}{{"\n"}}{{end}}{{else}}{{if ne .status "True"}}{{$node.metadata.name}}{{": "}}{{.type}}{{": "}}{{.status}}{{"\n"}}{{end}}{{end}}{{end}}{{end}}'
輸出示例:
worker-0: DiskPressure:True
您也可以執行以下命令,檢視日誌中是否有關於 job 報錯的資訊,請將命令中的日誌名稱rke-network-plugin-deploy-job替換為您的日誌名稱。
kubectl -n kube-system get pods -l job-name=rke-network-plugin-deploy-job --no-headers -o custom-columns=NAME:.metadata.name | xargs -L1 kubectl -n kube-system logs
Failed to apply the ServiceAccount needed for job execution
因為這個操作需要將運行了rke up命令的主機和 controplane 節點連線,這個問題在多數情況下是由於主機代理配置資訊有誤而造成的。出現這個錯誤之後返回的資訊是由阻止這個請求的代理髮出的。請檢查HTTP_PROXY、HTTPS_PROXY和NO_PROXY這三個環境變數是否配置正確。如果主機通過配置的代理無法訪問 controlplane 節點,請重點檢查NO_PROXY(要在NO_PROXY中新增這個 IP 區間)。