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

访问 Azure Kubernetes 舰队管理器中心群集的 Kubernetes API

适用于: ✔️具有中心群集的 Fleet Manager

如果你的 Azure Kubernetes 舰队管理器(Kubernetes 舰队)资源是使用中心群集创建的,那么你可将其用于集中控制 Kubernetes 资源传播等方案。 在本文中,你将了解如何访问 Kubernetes 舰队中心群集的 Kubernetes API。

在您开始之前

如果 Azure Kubernetes Fleet Manager (Kubernetes Fleet) 资源是使用专用中心群集创建的,则可以使用它集中控制 Kubernetes 资源传播等方案。 本文介绍如何使用 Azure Bastion 的本机客户端隧道功能安全地访问专用 Kubernetes 机群中心群集的 Kubernetes API。

使用 Azure Bastion 可保护专用枢纽群集,防止向外部公开端点,同时仍提供安全访问。 有关详细信息,请参阅 什么是 Azure Bastion?

在您开始之前

  • 如果没有 Azure 帐户,请在开始前创建一个免费帐户
  • 你需要有包括中心群集和成员群集的 Kubernetes 舰队资源。 如果没有,请参阅使用 Azure CLI 创建 Azure Kubernetes 舰队管理器资源并加入成员群集
  • 需要一个已经安装了 Bastion 主机的虚拟网络。
    • 确保已为舰队管理器所在的虚拟网络设置 Azure Bastion 主机。 若要设置 Azure Bastion 主机,请参阅 快速入门:使用默认设置部署 Bastion
    • Bastion 必须是标准或高级 SKU,并在配置设置下启用本机客户端支持。
  • 使用的身份(用户或服务主体)需要具备以下内容:
    • 针对 Kubernetes Fleet 资源的 Microsoft.ContainerService/fleets/listCredentials/action 权限。
    • 针对 Bastion 资源的 Microsoft.Network/bastionHosts/read。
    • 针对专用中心群集的虚拟网络的 Microsoft.Network/virtualNetworks/read。

访问 Kubernetes API

  1. 为订阅 ID、资源组和 Kubernetes 舰队资源设置以下环境变量:

    export SUBSCRIPTION_ID=<subscription-id>
    export GROUP=<resource-group-name>
    export FLEET=<fleet-name>
    
  2. 使用 az account set 命令设置默认 Azure 订阅:

    az account set --subscription ${SUBSCRIPTION_ID}
    
  3. 使用 az fleet get-credentials 命令获取 Kubernetes 舰队中心群集的 kubeconfig 文件:

    az fleet get-credentials --resource-group ${GROUP} --name ${FLEET}
    

    输出应类似于以下示例:

    Merged "hub" as current context in /home/fleet/.kube/config
    
  4. 为中心群集的 Kubernetes 舰队资源的 FLEET_ID 值设置以下环境变量:

    export FLEET_ID=/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${GROUP}/providers/Microsoft.ContainerService/fleets/${FLEET}
    
  5. 使用以下命令授权标识访问 Kubernetes 舰队中心群集。

    对于 ROLE 环境变量,可以使用以下四个内置角色定义之一作为值:

    • Azure Kubernetes 舰队管理器 RBAC 读者
    • Azure Kubernetes 舰队管理器 RBAC 编写者
    • Azure Kubernetes 舰队管理器 RBAC 管理员
    • Azure Kubernetes 舰队管理器 RBAC 群集管理员
    export IDENTITY=$(az ad signed-in-user show --query "id" --output tsv)
    export ROLE="Azure Kubernetes Fleet Manager RBAC Cluster Admin"
    az role assignment create --role "${ROLE}" --assignee ${IDENTITY} --scope ${FLEET_ID}
    

    输出应类似于以下示例:

    {
      "canDelegate": null,
      "condition": null,
      "conditionVersion": null,
      "description": null,
      "id": "/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<GROUP>/providers/Microsoft.ContainerService/fleets/<FLEET>/providers/Microsoft.Authorization/roleAssignments/<assignment>",
      "name": "<name>",
      "principalId": "<id>",
      "principalType": "User",
      "resourceGroup": "<GROUP>",
      "roleDefinitionId": "/subscriptions/<SUBSCRIPTION_ID>/providers/Microsoft.Authorization/roleDefinitions/18ab4d3d-a1bf-4477-8ad9-8359bc988f69",
      "scope": "/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<GROUP>/providers/Microsoft.ContainerService/fleets/<FLEET>",
      "type": "Microsoft.Authorization/roleAssignments"
    }
    
  1. 验证是否可以使用 kubectl get memberclusters 命令访问 API 服务器:

    kubectl get memberclusters
    

    如果命令成功,输出应类似于以下示例:

    NAME           JOINED   AGE
    aks-member-1   True     2m
    aks-member-2   True     2m
    aks-member-3   True     2m
    
  1. 打开专用舰队管理器中心群集的隧道:

    export HUB_CLUSTER_ID=<hub-cluster-id-in-FL_resourceGroup>
    az network bastion tunnel --name <BastionName> --resource-group ${GROUP} --target-resource-id ${HUB_CLUSTER_ID}$ --resource-port 443 --port <LocalMachinePort>
    
  2. 在新终端窗口中,通过 Bastion 隧道连接到中心群集并验证 API 服务器访问权限:

    kubectl get memberclusters --server=https://localhost:<LocalMachinePort>
    

    如果命令成功,输出应类似于以下示例:

    NAME           JOINED   AGE
    aks-member-1   True     2m
    aks-member-2   True     2m
    aks-member-3   True     2m