為何無法透過 SSH 進入我的工作者節點?

Virtual Private Cloud 標準基礎架構

您無法使用 SSH 連線存取工作執行緒節點。

工作者節點上無法使用透過密碼的 SSH。

若要在每個工作者節點上執行動作,請使用 Kubernetes DaemonSet,或將工作用於一次性動作。

若要取得工作者節點的主機存取權以進行除錯及疑難排解,請檢閱下列選項。

使用 oc debug 進行除錯

使用 oc debug node 指令,將具有特許 securityContext 的 Pod 部署至您要疑難排解的工作者節點。

使用互動式 Shell 部署除錯 Pod,以便您可以在建立 Pod 之後立即存取工作者節點。 如需 oc debug node 指令運作方式的相關資訊,請參閱 這篇 Red Hat 部落格文章

  1. 取得您要存取的工作節點的名稱。 對於 CoreOS 工作者節點,名稱是工作者節點的主機名稱。 對於所有其他工作者節點,工作者節點名稱是專用 IP 位址。

    oc get nodes -o wide
    
  2. 建立具有主機存取權的除錯 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中的映像。

  3. 執行除錯指令以協助您收集資訊並對問題進行疑難排解。 Shell 中已提供您可用來除錯的指令,例如 tcpdumpcurlipifconfigncpingps。 您也可以執行 yum install <tool> 來安裝其他工具,例如 mtrconntrack

使用 kubectl exec 進行除錯

如果無法使用 oc debug node 指令,您可以建立具有特許 securityContext 的 Alpine Pod,並使用 kubectl exec 指令從 Pod 的互動式 Shell 執行除錯指令。

  1. 取得您要存取的工作節點的名稱。 對於 CoreOS 工作者節點,名稱是工作者節點的主機名稱。 對於所有其他工作者節點,工作者節點名稱是專用 IP 位址。

    oc get nodes -o wide
    
  2. 匯出環境變數中的名稱。

    export NODE=<NODE_NAME>
    
  3. 在工作者節點上建立除錯 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
    
  4. 登入調試窗格。 會自動開啟 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
    
  5. 執行除錯指令以協助您收集資訊並對問題進行疑難排解。 您可以用來除錯的指令 (例如 digtcpdumpmtrcurlipifconfigncpingps) 已在 Shell 中提供。 您也可以執行 apk add <tool> 來安裝其他工具,例如 conntrack。 例如,若要新增 conntrack,請執行 apk add conntrack-tools

  6. 刪除您建立用於除錯的主機存取 Pod。

    kubectl delete pod debug-${NODE}
    

透過在工作者節點上啟用 root SSH 存取權進行除錯

如果您無法使用 oc debug nodekubectl exec 指令 (例如,叢集主節點與工作者節點之間的 VPN 連線已關閉),則可以建立 Pod 來啟用 root SSH 存取權,並將公用 SSH 金鑰複製到工作者節點以進行 SSH 存取。

容許 root SSH 存取是安全風險。 只有在需要 SSH 存取時,才容許 SSH 存取,且沒有其他選項可用來疑難排解工作者節點問題。 完成疑難排解時,請務必遵循 除錯之後清除 區段中的步驟,以停用 SSH 存取。

  1. 選擇現有或建立新的公用 SSH 金鑰。

    ssh-keygen -f /tmp/id_rsa_cluster_worker -t rsa -b 4096 -C temp-worker-ssh-key -P ''
    ls /tmp
    
    id_rsa_cluster_worker id_rsa_cluster_worker.pub
    
    cat /tmp/id_rsa_cluster_worker.pub
    
  2. 取得您要存取的工作節點的名稱。 對於 CoreOS 工作者節點,名稱是工作者節點的主機名稱。 對於所有其他工作者節點,工作者節點名稱是專用 IP 位址。

    oc get nodes -o wide
    
  3. 為除錯 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
    
  4. 在集群中建立 pod。 建立此 Pod 時,會將公開金鑰新增至工作者節點,並將 SSH 配置為容許 root SSH 登入。

    oc apply -f enable-ssh.yaml
    
  5. 使用專用或公用網路,以使用 SSH 金鑰來存取工作者節點。

透過 SSH 登入專用網路上的工作者節點

建立新的伺服器實例,或選擇可存取與工作者節點相同的專用網路的現有伺服器實例。 對於 VPC 叢集,虛擬伺服器實例 必須存在於與工作者節點相同的 VPC 中。

對於標準叢集,如果已啟用 虛擬路由器功能(VRF)VLAN Spanning,則 裝置 可以從任何專用 VLAN 存取工作者節點。 否則,裝置必須存在於與工作者節點相同的專用 VLAN 上。

  1. 將 SSH 私密金鑰從本端機器從步驟 1 複製到此伺服器實例。

    scp <SSH_private_key_location> <user@host>:/.ssh/id_rsa_worker_private
    
  2. 透過 SSH 登入伺服器實例。

  3. 請設定正確的許可權,以使用您所複製的 SSH 私密金鑰。

    chmod 400 ~/.ssh/id_rsa_worker_private
    
  4. 使用私密金鑰透過 SSH 進入您在步驟 2 中找到的工作者節點。

    ssh -i ~/.ssh/id_rsa_worker_private root@<WORKER_PRIVATE_IP>
    

透過 SSH 登入公用網路上的工作者節點

透過登入工作者節點,對連接至公用 VLAN 的標準叢集進行除錯。

  1. 安裝及配置 Calico CLI,並設定叢集的環境定義以執行 Calico 指令

  2. 建立名為 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
    
  3. 取得工作節點的公共 IP 位址。

    oc get nodes -o wide
    
  4. 透過工作者節點的公用 IP 位址,透過 SSH 進入工作者節點。

    ssh -i <SSH_private_key_location> root@<WORKER_PUBLIC_IP>
    
  5. 執行除錯指令以協助您收集資訊並對問題進行疑難排解,例如 ipifconfigpingpscurl。 您也可以透過執行 yum install <tool> 來安裝依預設可能未安裝的其他工具,例如 tcpdumpnc

除錯後清除

完成除錯之後,請清除資源以停用 SSH 存取。

  1. 刪除 SSH 啟用 Pod。

    oc delete pod enable-ssh-<NODE_NAME>
    
  2. 如果您透過公用網路存取工作者節點,請刪除 Calico 原則,以便再次封鎖埠 22。

    calicoctl delete gnp ssh-open [-c <path_to_calicoctl_cfg>/calicoctl.cfg]
    
  3. 重新載入標準工作者節點取代 VPC 工作者節點,以使用原始 SSH 配置並移除您新增的 SSH 金鑰。