分享方式:


連線到 Azure Kubernetes Service (AKS) 叢集節點以進行維護或疑難排解

在 Azure Kubernetes Service(AKS)叢集的整個生命週期中,您最終需要直接存取 AKS 節點。 此存取可能用於維護、記錄收集,或疑難排解作業。

您需要透過驗證存取節點,這個方法視您的節點作業系統和連接方法而異。 您可以透過這個本文討論的兩個選項,對 AKS Linux 和 Windows 節點進行安全性驗證。 其中一個選項要有 Kube API 存取權限,另一個選項則是透過 AKS ARM API,直接提供私人 IP 資訊。 基於安全考量,我們不會在網路公開 AKS 節點。 若要直接連線到任何 AKS 節點,您必須使用 kubectl debug 或主機的私人 IP 位址。

使用 Kube API 存取節點

這個方法需要使用 kubectl debug 命令。

開始之前

本指南說明如何與 AKS 節點建立連接,以及如何更新 AKS 叢集的 SSH 金鑰。 若要依照這些步驟操作,您必須使用支援 2.0.64 版或更新版本的 Azure CLI。 請執行 az --version 檢查版本。 如果您需要安裝或升級,請參閱安裝 Azure CLI

如果您沒有 SSH 金鑰,請完成這些步驟。 根據您的節點作業系統映像(適用於 macOS 和 LinuxWindows),建立 SSH 金鑰。 請務必以 OpenSSH 格式儲存金鑰組,並避免使用 .ppk 等不支援的格式。 接著請參閱 管理 SSH 設定,將金鑰新增到叢集。

Linux 與 macOS

Linux 和 macOS 使用者可以使用 kubectl debug 或其私人 IP 位址存取其節點。 Windows 使用者應跳到 Windows Server Proxy 部分,了解透過 Proxy 進行 SSH 的因應措施。

使用 kubectl 偵錯進行連線

若要建立互動式殼層連接,請使用 kubectl debug 命令,在節點上執行特殊權限容器。

  1. 若要列出您的節點,請使用 kubectl get nodes 命令:

    kubectl get nodes -o wide
    

    範例輸出:

    NAME                                STATUS   ROLES   AGE    VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE
    aks-nodepool1-37663765-vmss000000   Ready    agent   166m   v1.25.6   10.224.0.33   <none>        Ubuntu 22.04.2 LTS
    aks-nodepool1-37663765-vmss000001   Ready    agent   166m   v1.25.6   10.224.0.4    <none>        Ubuntu 22.04.2 LTS
    aksnpwin000000                      Ready    agent   160m   v1.25.6   10.224.0.62   <none>        Windows Server 2022 Datacenter
    
  2. 使用 kubectl debug 命令在節點上啟動特殊權限容器並連線。

    kubectl debug node/aks-nodepool1-37663765-vmss000000 -it --image=mcr.microsoft.com/cbl-mariner/busybox:2.0
    

    範例輸出:

    Creating debugging pod node-debugger-aks-nodepool1-37663765-vmss000000-bkmmx with container debugger on node aks-nodepool1-37663765-vmss000000.
    If you don't see a command prompt, try pressing enter.
    root@aks-nodepool1-37663765-vmss000000:/#
    

    您現在可以將特殊權限容器當作偵錯 Pod,以存取節點。

    注意

    您可以從具特殊權限的容器執行 chroot /host,以與節點工作階段互動。

結束 kubectl 偵錯模式

完成節點操作後,請輸入 exit 命令以結束互動式殼層工作階段。 互動式容器工作階段關閉後,請刪除與 kubectl delete pod 一起使用的偵錯 Pod。

kubectl delete pod node-debugger-aks-nodepool1-37663765-vmss000000-bkmmx

用於 SSH 的 Windows Server Proxy 連接

請將以下步驟當作因應措施,在 Windows Server 節點上使用 SSH 連線。

建立 Proxy 伺服器

目前,您無法使用 kubectl debug 直接連線到 Windows Server 節點。 您需要先使用 kubectl 與叢集的另一個節點連線,然後使用 SSH 從節點與 Windows Server 節點連線。

若要連線到叢集中的另一個節點,請使用 kubectl debug 命令。 如需詳細資訊,請依照 kubectl 部分中的上述步驟操作。 建立 AKS 叢集時會拿到 SSH 金鑰,請使用這個 SSH 金鑰和 Windows Server 節點的內部 IP 位址,從另一個節點建立與 Windows Server 節點的 SSH 連接。

重要

只有在使用 Azure CLI 和 --generate-ssh-keys 參數建立 AKS 叢集時,才能依照以下步驟從另一個節點建立與 Windows Server 節點的 SSH 連接。 若想使用自己的 SSH 金鑰,可以使用 az aks update 管理現有 AKS 叢集上的 SSH 金鑰。 如需詳細資訊,請參閱管理 SSH 節點存取

注意

如果您的 Linux Proxy 節點已關閉或沒有回應,請使用 Azure Bastion 方法連線。

  1. 使用 kubectl debug 命令在 Proxy(Linux)節點上啟動特殊權限容器並連線。

    kubectl debug node/aks-nodepool1-37663765-vmss000000 -it --image=mcr.microsoft.com/cbl-mariner/busybox:2.0
    

    範例輸出:

    Creating debugging pod node-debugger-aks-nodepool1-37663765-vmss000000-bkmmx with container debugger on node aks-nodepool1-37663765-vmss000000.
    If you don't see a command prompt, try pressing enter.
    root@aks-nodepool1-37663765-vmss000000:/#
    
  2. 開啟新的終端機視窗,並使用 kubectl get pods 命令取得由 kubectl debug 所啟動 Pod 的名稱。

    kubectl get pods
    

    範例輸出:

    NAME                                                    READY   STATUS    RESTARTS   AGE
    node-debugger-aks-nodepool1-37663765-vmss000000-bkmmx   1/1     Running   0          21s
    

    在輸出範例中,node-debugger-aks-nodepool1-37663765-vmss000000-bkmmx 是由 kubectl debug 啟動的 Pod 的名稱。

  3. 使用 kubectl port-forward 命令開啟已部署 Pod 的連線:

    kubectl port-forward node-debugger-aks-nodepool1-37663765-vmss000000-bkmmx 2022:22
    

    範例輸出:

    Forwarding from 127.0.0.1:2022 -> 22
    Forwarding from [::1]:2022 -> 22
    

    上述範例開始將流量從您開發電腦的連接埠 2022,轉接到已部署 Pod 的連接埠 22。 當使用 kubectl port-forward 開啟連線並轉送網路流量時,連線會保持開啟狀態,直到您停止 kubectl port-forward 命令為止。

  4. 開啟新的終端機並執行 kubectl get nodes 命令,以顯示 Windows 伺服器節點的內部 IP 位址:

    kubectl get no -o custom-columns=NAME:metadata.name,'INTERNAL_IP:status.addresses[?(@.type == \"InternalIP\")].address'
    

    範例輸出:

    NAME                                INTERNAL_IP
    aks-nodepool1-19409214-vmss000003   10.224.0.8
    

    上述範例的 10.224.0.62 是 Windows 伺服器節點的內部 IP 位址。

  5. 使用內部 IP 位址,建立與 Windows 伺服器節點的 SSH 連接,並透過您開發電腦的連接埠 2022 與連接埠 22 連線。 AKS 節點的預設使用者名稱為 azureuser。 接受提示以繼續進行連線。 接著您將看到 Windows 伺服器節點的 bash 提示:

    ssh -o 'ProxyCommand ssh -p 2022 -W %h:%p azureuser@127.0.0.1' azureuser@10.224.0.62
    

    範例輸出:

    The authenticity of host '10.224.0.62 (10.224.0.62)' can't be established.
    ECDSA key fingerprint is SHA256:1234567890abcdefghijklmnopqrstuvwxyzABCDEFG.
    Are you sure you want to continue connecting (yes/no)? yes
    

    注意

    如果您想要使用密碼驗證,請包含參數 -o PreferredAuthentications=password。 例如:

     ssh -o 'ProxyCommand ssh -p 2022 -W %h:%p azureuser@127.0.0.1' -o PreferredAuthentications=password azureuser@10.224.0.62
    

使用主機處理序容器來存取 Windows 節點

  1. 使用下列內容建立 hostprocess.yaml,並以 AKS Windows 節點名稱取代 AKSWINDOWSNODENAME

    apiVersion: v1
    kind: Pod
    metadata:
      labels:
        pod: hpc
      name: hpc
    spec:
      securityContext:
        windowsOptions:
          hostProcess: true
          runAsUserName: "NT AUTHORITY\\SYSTEM"
      hostNetwork: true
      containers:
        - name: hpc
          image: mcr.microsoft.com/windows/servercore:ltsc2022 # Use servercore:1809 for WS2019
          command:
            - powershell.exe
            - -Command
            - "Start-Sleep 2147483"
          imagePullPolicy: IfNotPresent
      nodeSelector:
        kubernetes.io/os: windows
        kubernetes.io/hostname: AKSWINDOWSNODENAME
      tolerations:
        - effect: NoSchedule
          key: node.kubernetes.io/unschedulable
          operator: Exists
        - effect: NoSchedule
          key: node.kubernetes.io/network-unavailable
          operator: Exists
        - effect: NoExecute
          key: node.kubernetes.io/unreachable
          operator: Exists
    
  2. 執行 kubectl apply -f hostprocess.yaml 以在指定的 Windows 節點中部署 Windows 主機處理序容器 (HPC)。

  3. 使用 kubectl exec -it [HPC-POD-NAME] -- powershell

  4. 您可以在 HPC 容器內執行任何 PowerShell 命令,以存取 Windows 節點。

注意

您必須將根資料夾切換至 HPC 容器內部的 C:\,才能存取 Windows 節點中的檔案。

使用 Windows 版 Azure Bastion 的 SSH

如果您的 Linux Proxy 節點無法連線,可以使用 Azure Bastion 當作 Proxy。 這個方法需要您為叢集所在的虛擬網路設定 Azure Bastion 主機。 如需詳細資訊,請參閱使用 Azure Bastion 連線

使用 AKS API 的私人 IP 進行 SSH(預覽)

如果您沒有 Kube API 的存取權,可以透過 AKS 代理程式集區 API(預覽)存取 Node IPNode Name 等屬性,(在預覽版本 07-02-2023 或更高版本中可用),以與 AKS 節點連線。

重要

AKS 預覽功能可透過自助服務,以加入方式使用。 預覽會以「現狀」和「可供使用時」提供,其其不受服務等級協定和有限瑕疵擔保所保護。 客戶支援部門會盡最大努力,部分支援 AKS 預覽。 因此,這些功能不適合實際執行用途。 如需詳細資訊,請參閱下列支援文章:

使用 IP 位址與節點建立互動式殼層連接

為了方便起見,AKS 節點透過私人 IP 位址在叢集的虛擬網路上公開。 但您必須位於叢集的虛擬網路中,才能透過 SSH 與節點連線。 若尚未設定環境,可以使用 Azure Bastion 建立 Proxy,從 Proxy 可以透過 SSH 與叢集節點連線。 Azure Bastion 部署的位置,務必與叢集所在的虛擬網路相同。

  1. 使用 az aks machine list 命令取得私人 IP,鎖定特定節點集區中,所有含 --nodepool-name 旗標的虛擬機器。

    az aks machine list --resource-group myResourceGroup  --cluster-name myAKSCluster --nodepool-name nodepool1 -o table
    

    以下範例輸出顯示節點集區中,所有節點的內部 IP 位址:

    Name                               Ip           Family
    ---------------------------------  -----------  -----------
    aks-nodepool1-33555069-vmss000000  10.224.0.5   IPv4
    aks-nodepool1-33555069-vmss000001  10.224.0.6   IPv4
    aks-nodepool1-33555069-vmss000002  10.224.0.4   IPv4
    

    若要鎖定節點集區內的特定節點,請使用 --machine-name 旗標:

    az aks machine show --cluster-name myAKScluster --nodepool-name nodepool1 -g myResourceGroup --machine-name aks-nodepool1-33555069-vmss000000 -o table
    

    以下範例輸出顯示所有指定節點的內部 IP 位址:

    Name                               Ip         Family
    ---------------------------------  -----------  -----------
    aks-nodepool1-33555069-vmss000000  10.224.0.5   IPv4
    
  2. 使用您在上一個步驟取得的私人 IP 位址,透過 SSH 與節點連線。 這個步驟只適用於 Linux 機器。 如要使用 Windows 機器,請參閱透過 Azure Bastion 連線

    ssh -i /path/to/private_key.pem azureuser@10.224.0.33
    

下一步

如需其他疑難排解資料,可以檢視 kubelet 記錄檢視 Kube 控制平面記錄

若要瞭解如何管理 SSH 金鑰,請參閱管理 SSH 設定