连接到 Azure Operator Nexus Kubernetes 集群

在 Azure 操作员 Nexus Kubernetes 群集的整个生命周期中,你最终需要直接访问群集节点。 此访问权限可用于维护、日志收集或故障排除作。 通过身份验证访问节点,该方法因连接方法而异。 通过本文中讨论的两个选项,安全地针对群集节点进行身份验证。 出于安全原因,群集节点不会向 Internet 公开。 相反,要直接连接到群集节点,您需要使用 kubectl debug 或从跳转服务器获取的主机 IP 地址。

先决条件

  • 部署在 Azure 订阅中的资源组中的 Azure 操作员 Nexus Kubernetes 群集。
  • 群集节点的 SSH 私钥。
  • 若要使用节点 IP 地址进行 SSH,必须在群集节点所在的同一容器网络接口(CNI)网络上部署 jumpbox VM。

通过用于服务器的 Azure Arc 访问群集节点

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

注释

默认情况下,操作员 Nexus 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 进行身份验证。

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

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

  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 后,请确保删除该容器:

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

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

从 Azure jumpbox 连接到群集节点

另一种安全连接到 Azure Operator Nexus Kubernetes 集群节点的选项是从 Azure jumpbox VM 设置直接访问群集的 CNI 网络。 使用此方法,可以通过 SSH 连接到群集节点,也可以使用该文件针对群集kubectl执行kubeconfig命令。

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

从本地部署的跳板机连接到群集节点

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

与网络管理员联系,设置此直接连接到群集的 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 群集(操作员 Nexus)”,然后从结果列表中选择“Kubernetes 群集”服务。

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

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

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

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

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

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

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

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

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

检索群集的主题可选名称 (SAN)

运行以下命令,检索 Kubernetes API 服务器证书接受的使用者可选名称(SAN)列表。 首先,使用用于服务器的 Azure Arc 或通过 IP 地址使用交互式 shell 访问控制平面节点。 这样,就可以访问 API 服务器使用的证书。 可以使用以下命令和 sudo 权限检查证书的内容:

sudo openssl x509 -in /etc/kubernetes/pki/apiserver.crt -text -noout

每个 SAN 都由前缀“DNS:”标识。 仅选择遵循指定命名约定“<clusterName>-<resourceGroup>”的 SAN,因为这与“kubernetes.default.svc.cluster.local”等其他 SAN 相比是独特的。

后续步骤

请尝试以下文章,详细了解 Azure 操作员 Nexus Kubernetes 群集。