為何無法透過 SSH 進入我的工作者節點?
Virtual Private Cloud 標準基礎架構
您無法使用 SSH 連線存取工作執行緒節點。
工作者節點上無法使用透過密碼的 SSH。
若要在每個工作者節點上執行動作,請使用 Kubernetes DaemonSet,或將工作用於一次性動作。
若要取得工作者節點的主機存取權以進行除錯及疑難排解,請檢閱下列選項。
使用 oc debug 進行除錯
使用 oc debug node 指令,將具有特許 securityContext 的 Pod 部署至您要疑難排解的工作者節點。
使用互動式 Shell 部署除錯 Pod,以便您可以在建立 Pod 之後立即存取工作者節點。 如需 oc debug node 指令運作方式的相關資訊,請參閱 這篇 Red Hat 部落格文章。
-
取得您要存取的工作節點的名稱。 對於 CoreOS 工作者節點,名稱是工作者節點的主機名稱。 對於所有其他工作者節點,工作者節點名稱是專用 IP 位址。
oc get nodes -o wide -
建立具有主機存取權的除錯 Pod。 建立 Pod 時,會自動開啟 Pod 的互動式 Shell。 如果
oc debug node指令失敗,請繼續選項 2。oc debug node/<NODE_NAME>如果
oc debug node/<NODE_NAME>指令失敗,則可能有安全群組、ACL 或防火牆規則阻止取回預設儲存器映像檔。 使用--image=us.icr.io/armada-master/network-alpine:latest選項再次嘗試該命令,該命令使用可透過專用網路存取的IBM Cloud Container Registry中的映像。 -
執行除錯指令以協助您收集資訊並對問題進行疑難排解。 Shell 中已提供您可用來除錯的指令,例如
tcpdump、curl、ip、ifconfig、nc、ping及ps。 您也可以執行yum install <tool>來安裝其他工具,例如mtr和conntrack。
使用 kubectl exec 進行除錯
如果無法使用 oc debug node 指令,您可以建立具有特許 securityContext 的 Alpine Pod,並使用 kubectl exec 指令從 Pod 的互動式 Shell 執行除錯指令。
-
取得您要存取的工作節點的名稱。 對於 CoreOS 工作者節點,名稱是工作者節點的主機名稱。 對於所有其他工作者節點,工作者節點名稱是專用 IP 位址。
oc get nodes -o wide -
匯出環境變數中的名稱。
export NODE=<NODE_NAME> -
在工作者節點上建立除錯 Pod。 這裡的 Docker alpine 映像檔用作範例。 如果工作者節點沒有公用網路存取權,您可以維護映像檔的副本,以便在您自己的 ICR 儲存庫中進行除錯,或使用其他工具來建置自訂映像檔以符合您的需求。
kubectl apply -f - << EOF apiVersion: v1 kind: Pod metadata: name: debug-${NODE} namespace: default spec: tolerations: - operator: "Exists" hostNetwork: true containers: - args: ["-c", "sleep 20d"] command: ["/bin/sh"] image: us.icr.io/armada-master/network-alpine:latest imagePullPolicy: Always name: debug securityContext: privileged: true volumeMounts: - mountPath: /host name: host-volume volumes: - name: host-volume hostPath: path: / nodeSelector: kubernetes.io/hostname: ${NODE} restartPolicy: Never EOF -
登入調試窗格。 會自動開啟 Pod 的互動式 Shell。 如果
kubectl exec指令失敗,請繼續選項 3。kubectl exec -it debug-${NODE} -- sh若要從工作者節點取得日誌或其他檔案,請使用下列格式的
**kubectl cp**指令。 下列範例從工作者節點的主機檔案系統取得/var/log/messages檔案。oc cp default/debug-${NODE}:/host/var/log/messages ./messages取得下列日誌,以尋找工作者節點上的問題。
/var/log/messages /var/log/kubelet.log /var/log/crio.log /var/log/calico/cni/cni.log -
執行除錯指令以協助您收集資訊並對問題進行疑難排解。 您可以用來除錯的指令 (例如
dig、tcpdump、mtr、curl、ip、ifconfig、nc、ping及ps) 已在 Shell 中提供。 您也可以執行apk add <tool>來安裝其他工具,例如conntrack。 例如,若要新增conntrack,請執行apk add conntrack-tools。 -
刪除您建立用於除錯的主機存取 Pod。
kubectl delete pod debug-${NODE}
透過在工作者節點上啟用 root SSH 存取權進行除錯
如果您無法使用 oc debug node 或 kubectl exec 指令 (例如,叢集主節點與工作者節點之間的 VPN 連線已關閉),則可以建立 Pod 來啟用 root SSH 存取權,並將公用 SSH 金鑰複製到工作者節點以進行 SSH 存取。
容許 root SSH 存取是安全風險。 只有在需要 SSH 存取時,才容許 SSH 存取,且沒有其他選項可用來疑難排解工作者節點問題。 完成疑難排解時,請務必遵循 除錯之後清除 區段中的步驟,以停用 SSH 存取。
-
選擇現有或建立新的公用 SSH 金鑰。
ssh-keygen -f /tmp/id_rsa_cluster_worker -t rsa -b 4096 -C temp-worker-ssh-key -P '' ls /tmpid_rsa_cluster_worker id_rsa_cluster_worker.pubcat /tmp/id_rsa_cluster_worker.pub -
取得您要存取的工作節點的名稱。 對於 CoreOS 工作者節點,名稱是工作者節點的主機名稱。 對於所有其他工作者節點,工作者節點名稱是專用 IP 位址。
oc get nodes -o wide -
為除錯 Pod 建立下列 YAML 檔案,並將該檔案儲存為
enable-ssh.yaml。 將<NODE_NAME>取代為工作者節點名稱,並將SSH_PUBLIC_KEY的範例value取代為您的公開 SSH 金鑰。 這裡的 Docker alpine 映像檔用作範例。 如果工作者節點沒有公用網路存取權,您可以保留映像檔的副本,以便在您自己的 ICR 儲存庫中進行除錯,或使用其他工具來建置自訂的映像檔,以符合您的需求。apiVersion: v1 kind: Pod metadata: name: enable-ssh-<NODE_NAME> labels: name: enable-ssh spec: tolerations: - operator: "Exists" hostNetwork: true hostPID: true hostIPC: true containers: - image: us.icr.io/armada-master/network-alpine:latest env: - name: SSH_PUBLIC_KEY value: "<ssh-rsa AAA...ZZZ temp-worker-ssh-key>" args: ["-c", "echo $(SSH_PUBLIC_KEY) | tee -a /root/.ssh/authorized_keys && sed -i 's/^#*PermitRootLogin.*/PermitRootLogin yes/g' /host/etc/ssh/sshd_config && sed -i 's/^#*PermitRootLogin.*/PermitRootLogin yes/g' /host/etc/ssh/sshd_config.d/40-rhcos-defaults.conf || true && killall -1 sshd || yes n | ssh-keygen -f /host/etc/ssh/ssh_host_rsa_key -t rsa -b 4096 -C temp-server-ssh-key -P '' && while true; do sleep 86400; done"] command: ["/bin/sh"] name: enable-ssh securityContext: privileged: true volumeMounts: - mountPath: /host name: host-volume - mountPath: /root/.ssh name: ssh-volume volumes: - name: host-volume hostPath: path: / - name: ssh-volume hostPath: path: /root/.ssh nodeSelector: kubernetes.io/hostname: <NODE_NAME> restartPolicy: Never -
在集群中建立 pod。 建立此 Pod 時,會將公開金鑰新增至工作者節點,並將 SSH 配置為容許 root SSH 登入。
oc apply -f enable-ssh.yaml -
使用專用或公用網路,以使用 SSH 金鑰來存取工作者節點。
透過 SSH 登入專用網路上的工作者節點
建立新的伺服器實例,或選擇可存取與工作者節點相同的專用網路的現有伺服器實例。 對於 VPC 叢集,虛擬伺服器實例 必須存在於與工作者節點相同的 VPC 中。
對於標準叢集,如果已啟用 虛擬路由器功能(VRF) 或 VLAN Spanning,則 裝置 可以從任何專用 VLAN 存取工作者節點。 否則,裝置必須存在於與工作者節點相同的專用 VLAN 上。
-
將 SSH 私密金鑰從本端機器從步驟 1 複製到此伺服器實例。
scp <SSH_private_key_location> <user@host>:/.ssh/id_rsa_worker_private -
透過 SSH 登入伺服器實例。
-
請設定正確的許可權,以使用您所複製的 SSH 私密金鑰。
chmod 400 ~/.ssh/id_rsa_worker_private -
使用私密金鑰透過 SSH 進入您在步驟 2 中找到的工作者節點。
ssh -i ~/.ssh/id_rsa_worker_private root@<WORKER_PRIVATE_IP>
透過 SSH 登入公用網路上的工作者節點
透過登入工作者節點,對連接至公用 VLAN 的標準叢集進行除錯。
-
建立名為
ssh-open的 Calico 廣域網路原則,以容許埠 22 上的入埠 SSH 資料流量。calicoctl apply -f - <<EOF apiVersion: projectcalico.org/v3 kind: GlobalNetworkPolicy metadata: name: ssh-open spec: selector: ibm.role == 'worker_public' ingress: - action: Allow protocol: TCP destination: ports: - 22 order: 1500 EOF -
取得工作節點的公共 IP 位址。
oc get nodes -o wide -
透過工作者節點的公用 IP 位址,透過 SSH 進入工作者節點。
ssh -i <SSH_private_key_location> root@<WORKER_PUBLIC_IP> -
執行除錯指令以協助您收集資訊並對問題進行疑難排解,例如
ip、ifconfig、ping、ps及curl。 您也可以透過執行yum install <tool>來安裝依預設可能未安裝的其他工具,例如tcpdump或nc。
除錯後清除
完成除錯之後,請清除資源以停用 SSH 存取。
-
刪除 SSH 啟用 Pod。
oc delete pod enable-ssh-<NODE_NAME> -
如果您透過公用網路存取工作者節點,請刪除 Calico 原則,以便再次封鎖埠 22。
calicoctl delete gnp ssh-open [-c <path_to_calicoctl_cfg>/calicoctl.cfg] -
重新載入標準工作者節點 或 取代 VPC 工作者節點,以使用原始 SSH 配置並移除您新增的 SSH 金鑰。