你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

连接到 Azure Kubernetes 服务 (AKS) 群集节点以进行维护或故障排除

在 Azure Kubernetes 服务 (AKS) 群集的整个生命周期内,你可能需要访问 AKS 节点。 进行这种访问的原因包括维护、日志收集或故障排除操作。 可以使用 SSH 安全地对 AKS Linux 和 Windows 节点进行身份验证,还可以使用远程桌面协议 (RDP) 连接到 Windows Server 节点。 出于安全原因,AKS 节点不会向 Internet 公开。 若要连接到 AKS 节点,需使用 kubectl debug 或专用 IP 地址。

本文介绍如何创建与 AKS 节点的连接,以及如何更新现有 AKS 群集上的 SSH 密钥。

准备阶段

本文假设你已有一个 SSH 密钥。 如果没有,可以使用 macOS 或 LinuxWindows 创建 SSH 密钥。 请确保将密钥对保存为 OpenSSH 格式,其他格式(如 .ppk)不受支持。

还需安装并配置 Azure CLI 2.0.64 或更高版本。 运行 az --version 即可查找版本。 如果需要进行安装或升级,请参阅安装 Azure CLI

创建与 Linux 节点的交互式 shell 连接

若要创建与 Linux 节点的交互式 shell 连接,请使用 kubectl debug 命令在节点上运行特权容器。 若要列出节点,请使用 kubectl get nodes 命令:

kubectl get nodes -o wide

命令的输出如下例所示:

NAME                                STATUS   ROLES   AGE     VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE                         KERNEL-VERSION     CONTAINER-RUNTIME
aks-nodepool1-12345678-vmss000000   Ready    agent   13m     v1.19.9   10.240.0.4    <none>        Ubuntu 18.04.5 LTS               5.4.0-1046-azure   containerd://1.4.4+azure
aks-nodepool1-12345678-vmss000001   Ready    agent   13m     v1.19.9   10.240.0.35   <none>        Ubuntu 18.04.5 LTS               5.4.0-1046-azure   containerd://1.4.4+azure
aksnpwin000000                      Ready    agent   87s     v1.19.9   10.240.0.67   <none>        Windows Server 2019 Datacenter   10.0.17763.1935    docker://19.3.1

使用 kubectl debug 命令在节点上运行容器映像以连接到该映像。 以下命令在节点上启动特权容器,然后连接到该容器。

kubectl debug node/aks-nodepool1-12345678-vmss000000 -it --image=mcr.microsoft.com/dotnet/runtime-deps:6.0

命令的输出如下例所示:

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

此特权容器提供对节点的访问权限。

注意

可以通过从特权容器运行 chroot /host 与节点会话进行交互。

删除 Linux 节点访问权限

完成后,使用 exit 退出交互式 shell 会话。 交互式容器会话关闭后,请使用 kubectl delete pod 删除用于访问的 pod。

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

创建与 Windows 节点的 SSH 连接

目前,无法通过使用 kubectl debug 直接连接到 Windows Server 节点。 相反,需要先连接到群集中的另一个节点,然后使用 SSH 从该节点连接到 Windows Server 节点。 此外,可以使用远程桌面协议 (RDP) 连接连接到 Windows Server 节点,而不需使用 SSH。

若要连接到群集中的另一个节点,请使用 kubectl debug 命令。 有关详细信息,请参阅创建与 Linux 节点的交互式 shell 连接

若要从另一个节点创建与 Windows Server 节点的 SSH 连接,请使用创建 AKS 群集时提供的 SSH 密钥和 Windows Server 节点的内部 IP 地址。

重要

只有在使用 Azure CLI 和 --generate-ssh-keys 参数创建了 AKS 群集时,才能使用以下步骤从另一个节点创建与 Windows Server 节点的 SSH 连接。 如果未使用此方法创建群集,你将使用密码而不是 SSH 密钥。 若要执行此操作,请参阅使用密码创建与 Windows 节点的 SSH 连接

打开新的终端窗口,并使用 kubectl get pods 命令获取 kubectl debug 启动的 Pod 的名称。

kubectl get pods

命令的输出如下例所示:

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

在上例中,node-debugger-aks-nodepool1-12345678-vmss000000-bkmmx 是由 启动的 Pod 的名称。

使用 kubectl port-forward 命令打开到已部署的 Pod 的连接:

kubectl port-forward node-debugger-aks-nodepool1-12345678-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 Server 节点的内部 IP 地址:

kubectl get nodes -o wide

命令的输出如下例所示:

NAME                                STATUS   ROLES   AGE     VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE                         KERNEL-VERSION     CONTAINER-RUNTIME
aks-nodepool1-12345678-vmss000000   Ready    agent   13m     v1.19.9   10.240.0.4    <none>        Ubuntu 18.04.5 LTS               5.4.0-1046-azure   containerd://1.4.4+azure
aks-nodepool1-12345678-vmss000001   Ready    agent   13m     v1.19.9   10.240.0.35   <none>        Ubuntu 18.04.5 LTS               5.4.0-1046-azure   containerd://1.4.4+azure
aksnpwin000000                      Ready    agent   87s     v1.19.9   10.240.0.67   <none>        Windows Server 2019 Datacenter   10.0.17763.1935    docker://19.3.1

在以上示例中,10.240.0.67 是 Windows Server 节点的内部 IP 地址。

使用内部 IP 地址创建到 Windows Server 节点的 SSH 连接,并通过开发计算机上的端口 2022 连接到端口 22。 AKS 节点的默认用户名为 azureuser。 接受提示以继续进行连接。 然后,系统会提供 Windows Server 节点的 bash 提示:

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

命令的输出如下例所示:

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

[...]

Microsoft Windows [Version 10.0.17763.1935]
(c) 2018 Microsoft Corporation. All rights reserved.

azureuser@aksnpwin000000 C:\Users\azureuser>

注意

如果希望使用密码验证,请包含参数 -o PreferredAuthentications=password。 例如:

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

使用密码创建与 Windows 节点的 SSH 连接

如果未使用 Azure CLI 和 --generate-ssh-keys 参数创建 AKS 群集,你将使用密码而不是 SSH 密钥来创建 SSH 连接。 若要使用 Azure CLI 执行此操作,请使用以下步骤:

  1. 创建名为 azureuser 的根用户。

    az vmss update -g <nodeRG> -n <vmssName> --set virtualMachineProfile.osProfile.adminUsername=azureuser
    
  2. 为新的根用户创建密码。

    az vmss update -g <nodeRG> -n <vmssName> --set virtualMachineProfile.osProfile.adminPassword=<new password>
    
  3. 更新实例以使用上述更改。

    az vmss update-instances -g <nodeRG> -n <vmssName> --instance-ids '*'
    
  4. 重置受影响节点的映像,以便可以使用新凭据进行连接。

    az vmss reimage -g <nodeRG> -n <vmssName> --instance-id <affectedNodeInstanceId>
    
  5. 使用 kubectl debug 连接到另一个节点。

    kubectl debug node/<nodeName> -it --image=mcr.microsoft.com/dotnet/runtime-deps:6.0
    
  6. 打开第二个终端,使用端口转发将调试 Pod 连接到本地计算机。

    kubectl port-forward <debugPodName> 2022:22
    
  7. 打开第三个终端,获取受影响节点的 INTERNAL-IP 以启动 SSH 连接。 可使用 kubectl get nodes -o wide 获取。 获取后,使用以下命令进行连接。

     ssh -o 'ProxyCommand ssh -p 2022 -W %h:%p azureuser@127.0.0.1' azureuser@<affectedNodeIp>
    
  8. 输入密码。

删除 SSH 访问

完成后,运行 exit 退出 SSH 会话,停止任何端口转发,然后运行 exit 退出交互式容器会话。 交互式容器会话关闭后,请使用 kubectl delete pod 命令删除用于 SSH 访问的 Pod。

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

更新现有 AKS 群集上的 SSH 密钥(预览版)

先决条件

  • 在开始之前,请确保已安装并配置 Azure CLI。 如果需要进行安装或升级,请参阅安装 Azure CLI
  • aks-preview 扩展版本 0.5.111 或更高版本。 若要了解如何安装 Azure 扩展,请参阅如何安装扩展

注意

支持在包含 AKS 群集的 Azure 虚拟机规模集上更新 SSH 密钥。

使用 az aks update 命令更新群集上的 SSH 密钥。 此操作将更新所有节点池上的密钥。 可以使用 --ssh-key-value 参数指定密钥或密钥文件。

az aks update --name myAKSCluster --resource-group MyResourceGroup --ssh-key-value <new SSH key value or SSH key file>

示例:在以下示例中,可为 --ssh-key-value 参数指定新的 SSH 密钥值。

az aks update --name myAKSCluster --resource-group MyResourceGroup --ssh-key-value 'ssh-rsa AAAAB3Nza-xxx'

在以下示例中,可以指定 SSH 密钥文件。

az aks update --name myAKSCluster --resource-group MyResourceGroup --ssh-key-value .ssh/id_rsa.pub

重要

在此操作期间,所有虚拟机规模集实例将会升级并重建映像,以使用新的 SSH 密钥。

后续步骤

如需更多的故障排除数据,可以查看 kubelet 日志查看 Kubernetes 主节点日志