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

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

通过身份验证访问节点,方法因节点 OS 和连接方法而异。 通过本文中讨论的两个选项,安全地针对 AKS Linux 和 Windows 节点进行身份验证。 其中一个选项要求你具有 Kubernetes API 访问权限,另一个是通过 AKS ARM API 完成,该 API 提供直接的专用 IP 信息。 出于安全原因,AKS 节点不会向 Internet 公开。 相反,若要直接连接到任何 AKS 节点,需要使用 kubectl debug 或主机的专用 IP 地址。

使用 Kubernetes API 访问节点

此方法需要使用 kubectl debug 命令。

开始之前

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

如果没有 SSH 密钥,请完成下述步骤。 根据节点 OS 映像(适用于 macOS 和 LinuxWindows)创建 SSH 密钥。 务必以 OpenSSH 格式保存密钥对,避免 .ppk 等不受支持的格式。 接下来,请参阅管理 SSH 配置将密钥添加到群集。

Linux 和 macOS

Linux 和 macOS 用户可使用 kubectl debug 或专用 IP 地址访问其节点。 Windows 用户应跳到 Windows Server 代理部分,了解通过代理启用 SSH 的解决方法。

使用 kubectl debug 进行连接

若要创建交互式 shell 连接,请使用 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.azk8s.cn/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 调试模式

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

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

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

  1. 使用以下内容创建 hostprocess.yaml,并将 AKSWINDOWSNODENAME 替换为 AKS Windows 节点名称。

    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.azk8s.cn/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 节点中的文件。

后续步骤

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

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