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

连接到 Azure 运营商关系 Kubernetes 群集

在 Azure 运营商关系 Kubernetes 群集的整个生命周期中,你最终需要直接访问群集节点。 进行这种访问的原因包括维护、日志收集或故障排除操作。 通过身份验证访问节点,具体方法因你的连接方法而异。 通过本文中讨论的两个选项,安全地针对群集节点进行身份验证。 出于安全原因,群集节点不会向 Internet 公开。 相反,要直接连接到群集节点,需要使用 kubectl debug 或 Jumpbox 中的主机 IP 地址。

先决条件

  • 部署在 Azure 订阅的资源组中的 Azure 运营商关系 Kubernetes 群集。
  • 群集节点的 SSH 私钥。
  • 若要使用节点 IP 地址进行 SSH 访问,必须在与群集节点相同的容器网络接口 (CNI) 网络上部署 Jumpbox VM。

通过 Azure Arc for servers 访问群集节点

az ssh arc 命令允许用户远程访问已连接到 Azure Arc 的群集 VM。此方法是直接从命令行通过 SSH 访问群集节点的安全方法,因此也是快速有效的远程管理方法。

注意

默认情况下,运营商关系 Kubernetes 群集节点是 Arc 连接的服务器。

  1. 设置所需的变量。 请将占位符替换为与 Azure 环境和 Nexus Kubernetes 群集相关的实际值。

    RESOURCE_GROUP="myResourceGroup" # Resource group where the Nexus Kubernetes cluster is deployed
    CLUSTER_NAME="myNexusK8sCluster" # Name of the Nexus Kubernetes cluster
    SUBSCRIPTION_ID="<Subscription ID>" # Azure subscription ID
    ADMIN_USERNAME="azureuser" # Username for the cluster administrator (--admin-username parameter value used during cluster creation)
    SSH_PRIVATE_KEY_FILE="<vm_ssh_id_rsa>" # Path to the SSH private key file
    MANAGED_RESOURCE_GROUP=$(az networkcloud kubernetescluster show -n $CLUSTER_NAME -g $RESOURCE_GROUP --subscription $SUBSCRIPTION_ID --output tsv --query managedResourceGroupConfiguration.name)
    
  2. 获取可用的群集节点名称。

    az networkcloud kubernetescluster show --name $CLUSTER_NAME --resource-group $RESOURCE_GROUP --subscription $SUBSCRIPTION_ID -o json | jq '.nodes[].name'
    
  3. 示例输出:

    "mynexusk8scluster-0b32128d-agentpool1-md-7h9t4"
    "mynexusk8scluster-0b32128d-agentpool1-md-c6xbs"
    "mynexusk8scluster-0b32128d-control-plane-qq5jm"
    
  4. 将群集节点名称设置为 VM_NAME 变量。

    VM_NAME="mynexusk8scluster-0b32128d-agentpool1-md-7h9t4"
    
  5. 运行以下命令,通过 SSH 连接到群集节点。

    az ssh arc --subscription $SUBSCRIPTION_ID \
        --resource-group $MANAGED_RESOURCE_GROUP \
        --name $VM_NAME \
        --local-user $ADMIN_USERNAME \
        --private-key-file $SSH_PRIVATE_KEY_FILE
    

使用 Kubernetes API 访问节点

此方法需要使用 kubectl debug 命令。 此方法仅限于容器,可能会忽略更广泛的系统问题,这与 SSH(使用“az ssh arc”或直接 IP)不同,后者提供完整的节点访问和控制。

通过 Azure Arc for Kubernetes 访问 Kubernetes API

注意

创建 Nexus Kubernetes 群集时,Nexus 会自动创建专用于存储群集资源的托管资源组,在此组中,会建立 Arc 连接的群集资源。

要访问群集,需要设置群集连接 kubeconfig。 使用相关 Microsoft Entra 实体登录到 Azure CLI 后,可以获取从任意位置(甚至在群集周围的防火墙以外)与群集通信所需的 kubeconfig

  1. 设置 CLUSTER_NAMERESOURCE_GROUPSUBSCRIPTION_ID 变量。

    CLUSTER_NAME="myNexusK8sCluster"
    RESOURCE_GROUP="myResourceGroup"
    SUBSCRIPTION_ID=<set the correct subscription_id>
    
  2. 查询具有 az 的托管资源组并将其存储在 MANAGED_RESOURCE_GROUP

     az account set -s $SUBSCRIPTION_ID
     MANAGED_RESOURCE_GROUP=$(az networkcloud kubernetescluster show -n $CLUSTER_NAME -g $RESOURCE_GROUP --output tsv --query managedResourceGroupConfiguration.name)
    
  3. 以下命令会启动 connectedk8s 代理,你可以通过该代理连接到指定 Nexus Kubernetes 群集的 Kubernetes API 服务器。

    az connectedk8s proxy -n $CLUSTER_NAME  -g $MANAGED_RESOURCE_GROUP &
    
  4. 使用 kubectl 将请求发送到群集:

    kubectl get pods -A
    

    现在应会看到来自群集的响应,其中包含所有节点的列表。

注意

如果看到错误消息“无法将访问令牌发布到客户端代理,无法连接到 MSI”,则可能需要执行 az login 以使用 Azure 重新进行身份验证。

通过适用于 Kubernetes 的 Azure Arc 访问群集节点

通过 Arc for Kubernetes 连接到群集后,可以使用 kubectl debug 命令连接到单个 Kubernetes 节点,以便在节点上运行特权容器。

  1. 列出 Nexus Kubernetes 群集中的节点:

    $> kubectl get nodes
    NAME                                             STATUS   ROLES           AGE    VERSION
    mynexusk8scluster-0b32128d-agentpool1-md-7h9t4   Ready    <none>          125m   v1.24.9
    mynexusk8scluster-0b32128d-agentpool1-md-c6xbs   Ready    <none>          125m   v1.24.9
    mynexusk8scluster-0b32128d-control-plane-qq5jm   Ready    <none>          124m   v1.24.9
    
  2. 在节点上启动特权容器并连接到该容器:

    $> kubectl debug node/mynexusk8scluster-0b32128d-agentpool1-md-7h9t4 -it --image=mcr.microsoft.com/cbl-mariner/base/core:2.0
    Creating debugging pod node-debugger-mynexusk8scluster-0b32128d-agentpool1-md-7h9t4-694gg with container debugger on node mynexusk8scluster-0b32128d-agentpool1-md-7h9t4.
    If you don't see a command prompt, try pressing enter.
    root [ / ]#
    

    此特权容器提供对节点的访问权限。 通过在命令行中运行 chroot /host,在群集节点上执行命令。

  3. 完成调试 Pod 后,输入 exit 命令以结束交互式 shell 会话。 退出 shell 后,请确保删除 Pod:

    kubectl delete pod node-debugger-mynexusk8scluster-0b32128d-agentpool1-md-7h9t4-694gg 
    

使用 IP 地址创建与节点的交互式 shell 连接

从 Azure Jumpbox 连接到群集节点

另一种安全连接到 Azure 运营商关系 Kubernetes 群集节点的方法是设置从 Azure Jumpbox VM 到群集 CNI 网络的直接访问。 使用此方法,可以通过 SSH 连接到群集节点,还可以使用 kubeconfig 文件针对群集执行 kubectl 命令。

与网络管理员联系,设置从 Azure Jumpbox VM 到群集 CNI 网络的直接连接。

从本地 Jumpbox 连接到群集节点

从本地 Jumpbox 内部建立对群集 CNI(容器网络接口)的直接访问。 这种直接访问使你能够通过 SSH 连接到群集节点,并允许你使用 kubeconfig 文件执行 kubectl 命令。

与网络管理员联系,设置与群集 CNI 网络的这一直接连接。

群集节点的 IP 地址

在连接到群集节点之前,需要查找节点的 IP 地址。 可以使用 Azure 门户或 Azure CLI 找到节点的 IP 地址。

使用 Azure CLI

  1. 设置 RESOURCE_GROUP、CLUSTER_NAME 和 SUBSCRIPTION_ID 变量以匹配你的环境。

    RESOURCE_GROUP="myResourceGroup"
    CLUSTER_NAME="myNexusK8sCluster"
    SUBSCRIPTION_ID="<Subscription ID>"
    
  2. 执行以下命令获取节点的 IP 地址。

    az networkcloud kubernetescluster show --name $CLUSTER_NAME --resource-group $RESOURCE_GROUP --subscription $SUBSCRIPTION_ID -o json | jq '.nodes[] | select(any(.networkAttachments[]; .networkAttachmentName == "defaultcni")) | {name: .name, ipv4Address: (.networkAttachments[] | select(.networkAttachmentName == "defaultcni").ipv4Address)}'
    
  3. 下面是该命令的示例输出。

    {
      "name": "mynexusk8scluster-0b32128d-agentpool1-md-7h9t4",
      "ipv4Address": "10.5.54.47"
    }
    {
      "name": "mynexusk8scluster-0b32128d-agentpool1-md-c6xbs",
      "ipv4Address": "10.5.54.48"
    }
    {
      "name": "mynexusk8scluster-0b32128d-control-plane-qq5jm",
      "ipv4Address": "10.5.54.46"
    }
    

使用 Azure 门户

若要查找通过 SSH 连接的 VM 的 IP 地址,请执行以下步骤:

  1. 转到 Azure 门户,然后使用用户名和密码登录。
  2. 在搜索框中键入“Kubernetes 群集(运营商关系)”,然后从结果列表中选择“Kubernetes 群集”服务。

浏览 Nexus Kubernetes 服务的屏幕截图。

  1. 查找需要使用搜索的特定“Nexus Kubernetes 群集”资源。

浏览 Nexus Kubernetes 群集的屏幕截图。

  1. 通过将资源名称与群集名称匹配找到正确的资源后,选择资源以转到“Kubernetes 群集”主页。

Nexus Kubernetes 群集主页的屏幕截图。

  1. 通过将资源名称与群集名称匹配找到正确的资源后,转到左侧菜单中的“Kubernetes 群集节点”部分。

浏览 Nexus Kubernetes 群集节点的屏幕截图。

  1. 选择需要查看其详细信息的 Kubernetes 节点名称。
  2. 选中“附加网络”选项卡,查找用作 CNI 网络的节点“第 3 层网络”的 IP 地址。

浏览 Nexus Kubernetes 群集节点网络的屏幕截图。

后续步骤

请尝试阅读以下文章,详细了解 Azure 运营商关系 Kubernetes 群集。