使用群集连接安全连接到已启用 Azure Arc 的 Kubernetes 群集

通过群集连接,可在任何位置安全地连接到已启用 Azure Arc 的 Kubernetes 群集,而无需在防火墙上启用任何入站端口。

访问已启用 Azure Arc 的 Kubernetes 群集的 apiserver 可实现以下方案:

  • 交互式调试和故障排除。
  • Azure 服务对自定义位置及其上创建的其他资源的群集访问权限。

在开始之前,请查看群集连接功能的概念性概述

先决条件

  • 具有活动订阅的 Azure 帐户。 创建试用版订阅

  • 一个现有的已启用 Azure Arc 的 Kubernetes 连接的群集。

  • 启用面向启用了 Arc 的 Kubernetes 的网络要求

  • 启用这些终结点以进行出站访问:

    终结点 端口
    *.servicebus.chinacloudapi.cn 443
    guestnotificationservice.azure.cn, *.guestnotificationservice.azure.cn 443

    注意

    若要将 *.servicebus.chinacloudapi.cn 通配符转换为特定终结点,请使用命令 \GET https://guestnotificationservice.azure.cn/urls/allowlist?api-version=2020-01-01&location=<location>。 在这个命令中,必须为 <location> 占位符指定区域。

要获取区域终结点的区域段,请从 Azure 区域名称中删除所有空格。 例如,“中国东部 2”地区,地区名称为 chinaeast2

例如:*.<region>.prod.chinacloudsites.cn 应为位于“China East 2”地区的 *.chinaeast2.prod.chinacloudsites.cn

要查看所有区域的列表,请运行以下命令:

az account list-locations -o table
Get-AzLocation | Format-Table
  • 安装 Azure CLI 或将其更新到最新版本。

  • 安装最新版本的 connectedk8s Azure CLI 扩展:

    az extension add --name connectedk8s
    

    如果已安装 connectedk8s 扩展,请将扩展更新到最新版本:

    az extension update --name connectedk8s
    
  • 替换占位符并运行以下命令,设置本文档中使用的环境变量:

    CLUSTER_NAME=<cluster-name>
    RESOURCE_GROUP=<resource-group-name>
    ARM_ID_CLUSTER=$(az connectedk8s show -n $CLUSTER_NAME -g $RESOURCE_GROUP --query id -o tsv)
    

设置身份验证

在已启用 Arc 的现有群集上,使用 Microsoft Entra 身份验证或服务帐户令牌创建 ClusterRoleBinding。

Microsoft Entra 验证选项

  1. 获取与 Microsoft Entra 实体关联的 objectId。 如果使用单个用户帐户,请获取与 Microsoft Entra 实体关联的用户主体名称 (UPN)。

    • 对于 Microsoft Entra 组帐户:

      AAD_ENTITY_ID=$(az ad signed-in-user show --query id -o tsv)
      
    • 对于 Microsoft Entra 单用户帐户:

      AAD_ENTITY_ID=$(az ad signed-in-user show --query userPrincipalName -o tsv)
      
    • 对于 Microsoft Entra 应用程序:

      AAD_ENTITY_ID=$(az ad sp show --id <id> --query id -o tsv)
      
  2. 向实体授予适当权限。

    • 如果使用 Kubernetes 本机 ClusterRoleBinding 或 RoleBinding 对群集进行授权检查,并且 kubeconfig 文件指向群集的 apiserver 来进行直接访问,你可以创建一个映射到需要访问此群集的 Microsoft Entra 实体(服务主体或用户)。 例如:

      kubectl create clusterrolebinding demo-user-binding --clusterrole cluster-admin --user=$AAD_ENTITY_ID
      
    • 如果使用 Azure RBAC 对群集进行授权检查,可以创建一个映射到 Microsoft Entra 实体的适用 Azure 角色分配。 例如:

      az role assignment create --role "Azure Arc Kubernetes Viewer" --assignee $AAD_ENTITY_ID --scope $ARM_ID_CLUSTER
      az role assignment create --role "Azure Arc Enabled Kubernetes Cluster User Role" --assignee $AAD_ENTITY_ID --scope $ARM_ID_CLUSTER
      

服务帐户令牌身份验证选项

  1. kubeconfig 文件指向 Kubernetes 群集的 apiserver 的情况下,运行以下命令以创建服务帐户。 此示例将在默认命名空间中创建服务帐户,但你可以用任何其他命名空间来替换 default

    kubectl create serviceaccount demo-user -n default
    
  2. 创建 ClusterRoleBinding 以向此服务帐户授予对群集的适当权限。 如果在第一个命令中使用了其他命名空间,请在此处用其替换 default

    kubectl create clusterrolebinding demo-user-binding --clusterrole cluster-admin --serviceaccount default:demo-user
    
  3. 创建服务帐户令牌:

    kubectl apply -f - <<EOF
    apiVersion: v1
    kind: Secret
    metadata:
      name: demo-user-secret
      annotations:
        kubernetes.io/service-account.name: demo-user
    type: kubernetes.io/service-account-token
    EOF
    
    TOKEN=$(kubectl get secret demo-user-secret -o jsonpath='{$.data.token}' | base64 -d | sed 's/$/\n/g')
    
  4. 获取要输出到控制台的令牌

    echo $TOKEN
    

从客户端设备访问群集

现在可从其他客户端访问群集。 在另一台客户端设备上运行以下步骤。

  1. 使用 Microsoft Entra 身份验证或服务帐户令牌身份验证进行登录。

  2. 根据所用的验证选项,从任何位置(甚至可以从群集周围的防火墙外部)获取与群集通信所需的群集连接 kubeconfig

    • 如果使用 Microsoft Entra 身份验证:

      az connectedk8s proxy -n $CLUSTER_NAME -g $RESOURCE_GROUP
      
    • 如果使用服务帐户令牌身份验证:

      az connectedk8s proxy -n $CLUSTER_NAME -g $RESOURCE_GROUP --token $TOKEN
      

      注意

      此命令将打开代理并阻止当前 shell。

  3. 在不同的 shell 会话中,使用 kubectl 将请求发送到群集:

    kubectl get pods -A
    

现在应会看到来自群集的响应,其中包含 default 命名空间下所有 Pod 的列表。

已知限制

使用 az connectedk8s show 检查已启用 Arc 的 Kubernetes 代理版本。

对 Kubernetes 群集发出请求时,如果使用的 Microsoft Entra 实体是 200 多个组的成员,则可能会看到以下错误:

You must be logged in to the server (Error:Error while retrieving group info. Error:Overage claim (users with more than 200 group membership) is currently not supported.

这是一个已知限制。 若要避免此错误,请执行以下操作:

  1. 创建一个不太可能是超过 200 个组的成员的服务主体
  2. 运行命令 az connectedk8s proxy 之前,先使用服务主体登录到 Azure CLI。

后续步骤