連線到 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 和 Linux 或 Windows),建立 SSH 金鑰。 請務必以 OpenSSH 格式儲存金鑰組,並避免使用 .ppk
等不支援的格式。 接著請參閱 管理 SSH 設定,將金鑰新增到叢集。
Linux 與 macOS
Linux 和 macOS 使用者可以使用 kubectl debug
或其私人 IP 位址存取其節點。 Windows 使用者應跳到 Windows Server Proxy 部分,了解透過 Proxy 進行 SSH 的因應措施。
使用 kubectl 偵錯進行連線
若要建立互動式殼層連接,請使用 kubectl debug
命令,在節點上執行特殊權限容器。
若要列出您的節點,請使用
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
使用
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 方法連線。
使用
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:/#
開啟新的終端機視窗,並使用
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 的名稱。使用
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
命令為止。開啟新的終端機並執行
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 位址。
使用內部 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 節點
使用下列內容建立
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
執行
kubectl apply -f hostprocess.yaml
以在指定的 Windows 節點中部署 Windows 主機處理序容器 (HPC)。使用
kubectl exec -it [HPC-POD-NAME] -- powershell
。您可以在 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 IP
和 Node Name
等屬性,(在預覽版本 07-02-2023
或更高版本中可用),以與 AKS 節點連線。
重要
AKS 預覽功能可透過自助服務,以加入方式使用。 預覽會以「現狀」和「可供使用時」提供,其其不受服務等級協定和有限瑕疵擔保所保護。 客戶支援部門會盡最大努力,部分支援 AKS 預覽。 因此,這些功能不適合實際執行用途。 如需詳細資訊,請參閱下列支援文章:
使用 IP 位址與節點建立互動式殼層連接
為了方便起見,AKS 節點透過私人 IP 位址在叢集的虛擬網路上公開。 但您必須位於叢集的虛擬網路中,才能透過 SSH 與節點連線。 若尚未設定環境,可以使用 Azure Bastion 建立 Proxy,從 Proxy 可以透過 SSH 與叢集節點連線。 Azure Bastion 部署的位置,務必與叢集所在的虛擬網路相同。
使用
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
使用您在上一個步驟取得的私人 IP 位址,透過 SSH 與節點連線。 這個步驟只適用於 Linux 機器。 如要使用 Windows 機器,請參閱透過 Azure Bastion 連線。
ssh -i /path/to/private_key.pem azureuser@10.224.0.33
下一步
如需其他疑難排解資料,可以檢視 kubelet 記錄或檢視 Kube 控制平面記錄。
若要瞭解如何管理 SSH 金鑰,請參閱管理 SSH 設定。