通过


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

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

在 Azure Kubernetes 服务 (AKS) 群集的整个生命周期中,你最终需要直接访问 AKS 节点。 进行这种访问的原因包括维护、日志收集或故障排除操作。

本文介绍两个选项,用于与 AKS Linux 和 Windows 节点建立安全连接。 其中一个选项要求你具有 Kubernetes API 访问权限,另一个是通过 AKS ARM API 完成,该 API 提供直接的专用 IP 信息。 出于安全原因,AKS 节点不会向 Internet 公开。 如果要直接连接到任何 AKS 节点,需要使用 或主机的专用 IP 地址。

使用 Kubernetes API 访问节点

此方法需要 命令。

开始之前

本指南介绍如何创建与 AKS 节点的连接,以及如何更新 AKS 群集的 SSH 密钥。 若要执行这些步骤,需要Azure CLI 2.0.64 或更高版本。 请运行 检查版本。 如果需要安装或升级,请参阅 Install Azure CLI

如果没有 SSH 密钥,请完成下述步骤。 根据节点 OS 映像、macOS 和 LinuxWindows 创建 SSH 密钥。 以 OpenSSH 格式保存密钥对,并避免不受支持的格式,例如 。 接下来,请参阅《SSH 配置管理》,将密钥添加到群集。

Linux 和 macOS

Linux 和 macOS 用户可以使用 或专用 IP 地址访问其节点。 Windows用户应跳到Windows Server代理部分,以便通过代理解决 SSH 问题。

通过 kubectl debug 连接

若要创建交互式 shell 连接,请使用 命令在节点上运行特权容器。

  1. 若要列出节点,请使用 命令:

    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 node/aks-nodepool1-37663765-vmss000000 -it --image=mcr.microsoft.com/azurelinux/busybox:1.36
    

    示例输出:

    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 来访问节点。

    注意

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

退出 kubectl 调试模式

完成节点操作后,输入命令以结束交互式 shell 会话。 交互式容器会话关闭后,删除与 一起使用的调试 Pod。

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

用于 SSH 的Windows Server代理连接

请按照以下步骤在Windows Server节点上使用 SSH 进行连接。

创建代理服务器

目前,无法使用 kubectl debug 直接连接到Windows Server节点。 相反,需要先使用 kubectl 连接到群集中的另一个节点,然后使用 SSH 从该节点连接到Windows Server节点。

若要连接到群集中的另一个节点,请使用 命令。 有关详细信息,请按照 kubectl 部分中的之前步骤进行操作。 使用创建 AKS 群集时提供的 SSH 密钥和Windows Server节点的内部 IP 地址,从另一个节点创建与Windows Server节点的 SSH 连接。

重要

仅当使用具有 --generate-ssh-keys 参数的Azure CLI创建 AKS 群集时,才能使用以下步骤从另一个节点创建到Windows Server节点的 SSH 连接。 如果想要改用自己的 SSH 密钥,可以使用 来管理现有 AKS 群集上的 SSH 密钥。 有关详细信息,请参阅管理 SSH 节点访问。

注意

如果 Linux 代理节点已关闭或无响应,请使用 Azure Bastion 方法进行连接。

  1. 使用 命令在代理 (Linux) 节点上启动特权容器,然后连接到该容器。

    kubectl debug node/aks-nodepool1-37663765-vmss000000 -it --image=mcr.microsoft.com/azurelinux/busybox:1.36
    

    示例输出:

    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. 打开新的终端窗口,并使用 命令获取 启动的 Pod 的名称。

    kubectl get pods
    

    示例输出:

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

    在示例输出中, 是以 开头的 pod 的名称。

  3. 使用 命令打开到已部署的 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
    

    上面的示例从开发计算机上的端口 开始将网络流量转发到部署的 pod 上的端口 。 使用 打开连接并转发网络流量时,在停止 命令之前,连接将一直保持打开状态。

  4. 打开新终端并运行命令 kubectl get nodes 以显示Windows Server节点的内部 IP 地址:

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

    示例输出:

    NAME                                INTERNAL_IP
    aks-nodepool1-19409214-vmss000003   10.224.0.8
    aksnpwin000000                      10.224.0.62
    

    在前面的示例中,10.224.0.62是Windows Server节点的内部 IP 地址。

  5. 使用内部 IP 地址创建到Windows服务器节点的 SSH 连接,并通过开发计算机上的端口 2022 连接到端口 22。 AKS 节点的默认用户名为 azureuser。 接受提示以继续进行连接。 然后,您会看到 Windows Server 节点的 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
    

    注意

    如果希望使用密码验证,请包含参数 。 例如:

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

使用主机进程容器访问Windows节点

  1. 运行以下脚本以创建 。 在脚本中,将 AKSWINDOWSNODENAME 替换为 AKS Windows 节点名称。

    此规范使用 nanoserver 基础映像。 基础映像没有 PowerShell,但由于它作为主机进程容器(HPC)运行,因此可在基础 VM 中使用 PowerShell。

    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/nanoserver:ltsc2022 # Use nanoserver: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. 使用 .

  4. 可以在 HPC 容器中运行任何 PowerShell 命令来访问Windows节点。

注意

需要将根文件夹切换到 HPC 容器内的 C:\,以访问Windows节点中的文件。

使用 Azure Bastion 进行 SSH 连接

如果无法访问 Linux 代理节点,则使用 Azure Bastion 作为代理是替代方法。 此方法要求为群集所在的虚拟网络设置Azure Bastion主机。 有关更多详细信息,请参阅 Connect with Azure Bastion

使用群集虚拟网络中的专用 IP 进行 SSH

为方便起见,AKS 节点通过专用 IP 地址在群集的虚拟网络上公开。 但是,需要在群集的虚拟网络中通过 SSH 连接到节点。

  1. 如果你无权访问 Kubernetes API,则可以访问属性,例如 ,通过 AKS 代理池 API (在稳定版本 或更高版本上可用)连接到 AKS 节点。 使用命令获取私有 IP,针对特定节点池中所有具有的虚拟机。

    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
    

    若要以节点池中的特定节点为目标,请使用 标志:

    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 节点。

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

后续步骤

如需更多故障排除数据,可查看 kubelet 日志或查看 Kubernetes 控制平面日志。

若要了解如何管理 SSH 密钥,请参阅管理 SSH 配置。