将 Azure RBAC 与 Azure Kubernetes Fleet Manager 配合使用

本文概述了可与 Azure Kubernetes Fleet Manager 一起使用的 Azure RBAC 角色。

Azure 基于角色的访问控制 (Azure RBAC) 是在 Azure 资源管理器基础上构建的授权系统,针对 Azure 资源提供精细的访问权限管理。

Azure Resource Manager

这些角色授予对 Azure 资源管理器(ARM)舰队资源和子资源的访问权限,适用于具有和不使用中心群集的机队经理。

角色名称 说明 使用情况
Azure Kubernetes 舰队管理器贡献者 授予对 Azure Kubernetes Fleet Manager 提供的Azure资源的读取和写入访问权限,包括车队、机队成员、车队更新策略、机队更新运行等。 使用此角色授予仅适用于 Fleet Manager ARM 资源和子资源的参与者权限。 例如,可以将此角色提供给负责定义和维护 Fleet Manager 资源的Azure管理员。
Azure Kubernetes Fleet Manager Hub 群集用户角色 授予对 Fleet Manager 中心群集的只读访问权限,并通过 kubeconfig 文件连接到 Fleet Manager 中心群集。 用于查看 Fleet Manager 资源并下载 Fleet Manager 中心群集 kubeconfig ,以检查配置和工作负载,而无需进行任何更改。

Kubernetes 数据平面

可以在编队范围或单个管理的编队命名空间范围内分配 Fleet Manager 数据平面角色。

有两种类型的数据平面角色:机群管理器的 RBAC 角色和成员群集的 RBAC 角色。 Fleet Manager 的 RBAC 角色仅授予对 Fleet 托管中心群集中的 Kubernetes 对象的访问权限。 成员群集的 RBAC 角色仅授予对一组中的成员群集上 Kubernetes 对象的访问权限。 在管理命名空间范围内为成员群集分配 RBAC 角色时,该角色将应用于父 Fleet 的所有成员上的管理命名空间,而不考虑管理命名空间是否传播到该成员。

当群集以成员群集的形式加入集群车队时,用户将获得已在父集群车队范围内授予的群集上的所有权限。 成员群集离开舰队时,用户将失去该群集的这些权限。 例如,在机群范围内分配了 Azure Kubernetes Fleet Manager RBAC Cluster Admin for Member Clusters 角色的用户只能在这些群集保留在机群中时在所有成员群集上创建命名空间。

如果在托管命名空间范围内应用角色并且删除了该托管命名空间,则角色分配也会被删除。 如果重新创建托管命名空间,则不会自动重新创建角色分配,并且必须手动重新创建。

注意

这些 RBAC 角色当前不适用于在 Fleet 中启用了 Arc 的成员群集。 此外,这些 Azure RBAC 角色不支持对特定 Kubernetes 自定义资源(CR)的访问控制。

Fleet Manager 中心群集

以下角色用于与 Fleet Manager 中心群集上的 Kubernetes 资源进行交互。

角色名称 说明 使用情况
Azure Kubernetes Fleet Manager RBAC 集群管理员 授予对舰队托管的中心群集中所有 Kubernetes 资源的读/写访问权限。 使用此角色授予对命名空间或群集范围内所有 Kubernetes 对象(包括 CRD)的访问权限。
Azure Kubernetes 集群管理器 RBAC 管理员 授予对中心群集管理的舰队命名空间内 Kubernetes 资源的读写访问权限。 提供对命名空间中大多数对象的写入权限,但 ResourceQuota 对象和命名空间对象本身除外。 在群集范围内应用此角色将提供对所有命名空间的访问权限。 使用此角色可授予在命名空间或群集范围内管理所选 Kubernetes 对象(包括角色和角色绑定)的功能。 例如,供负责给定命名空间中对象的项目团队使用。
Azure Kubernetes 舰队管理器 RBAC 编写者 授予对舰队托管中心群集中的某个命名空间内的大多数 Kubernetes 资源的读写访问权限。 此角色不允许查看或修改角色或角色绑定。 但是,此角色允许以命名空间中任何 ServiceAccount 的身份访问机密,因此可用于获取命名空间中任何 ServiceAccount 的 API 访问级别。 在群集范围内应用此角色将提供对所有命名空间的访问权限。 使用此角色授予在命名空间或群集范围内写入所选 Kubernetes 对象的功能。 例如,供负责给定命名空间中对象的项目团队使用。
Azure Kubernetes 群集管理器 RBAC 读取者 授予对舰队管理的枢纽集群中命名空间内大多数 Kubernetes 资源的只读访问权限。 不允许查看角色或角色绑定。 此角色不允许查看机密,因为通过读取机密内容可以访问命名空间中的 ServiceAccount 凭据,这样就会允许以命名空间中任何 ServiceAccount 的身份进行 API 访问(一种特权提升形式)。 在群集范围内应用此角色将提供对所有命名空间的访问权限。 使用此角色授予在命名空间或集群范围内读取所选非敏感 Kubernetes 对象的权限。 例如,可以授予此角色,以进行评审。

Fleet Manager 成员群集

使用 托管机群命名空间时,以下角色用于与 Fleet Manager 成员群集上的 Kubernetes 资源进行交互。

角色名称 说明 使用情况
Azure Kubernetes 舰队管理器 RBAC 成员群集集群管理员 对机群中成员群集上所有 Kubernetes 资源的完整读/写访问权限。 使用此角色授予对成员群集上所有资源的完全访问权限。 例如,需要访问成员群集上的多个命名空间的平台管理员。
Azure Kubernetes Fleet Manager 成员群集的 RBAC 管理员 对成员群集上命名空间中的 Kubernetes 资源的读取和写入访问权限。 使用此角色可授予在 Kubernetes 集群成员的命名空间范围内管理特定 Kubernetes 对象(包括角色和角色绑定)的权限。 例如,供负责给定命名空间中对象的项目团队使用。
适用于成员群集的 Azure Kubernetes Fleet Manager RBAC 编写器 对命名空间中大多数 Kubernetes 资源具有读取和写入权限。 无法查看或修改角色或角色绑定。 可以读取机密(因此可以假定 ServiceAccount 命名空间中的任何内容)。 使用此角色以赋予集群成员在命名空间中写入指定 Kubernetes 对象的能力。 例如,供负责给定命名空间中对象的项目团队使用。
Azure Kubernetes Fleet Manager 对成员群集的 RBAC 读取 对成员群集上命名空间中大多数对象的只读访问权限。 无法查看角色或角色绑定。 无法查看机密(阻止通过 ServiceAccount 凭据提升特权)。 使用此角色可授予在机群成员的命名空间范围内读取所选的非敏感 Kubernetes 对象的功能。

专用中心群集

将 Fleet Manager 与专用中心群集配合使用时,必须添加以下Azure RBAC 配置,以便 Fleet Manager 可以控制其配置,并将更新应用到托管中心群集。

专用中心群集需要在配置为代理(节点)子网的虚拟网络子网上分配 网络参与者 角色。 角色分配使用 Fleet Manager 的 Azure 服务主体,其对象 ID 因不同的 Entra 租户而异。

注意

使用 az fleet create Azure CLI 命令创建具有专用中心群集的机群管理器时不需要此角色分配,因为Azure CLI会自动创建角色分配。

  1. 获取 Azure Virtual Network 子网的 Azure 资源标识符,该子网是 Fleet Manager 中心群集附加到的。 对占位符使用适当的值。

    SUBNET_ID=$(az network vnet subnet show --subscription <subscription-id> --resource-group <virtual-network-rg> --vnet-name <virtual-network> -n <subnet-name> -o tsv --query id)
    
  2. 检索车队管理器的 Azure 服务主体对象 ID,以适应您的环境。

    FLEET_RP_ID=$(az ad sp list --display-name "Azure Kubernetes Service - Fleet RP" --query "[].{id:id}" --output tsv)
    
  3. 为 Fleet 资源提供程序分配网络参与者角色,将范围设置为子网的资源标识符。

    az role assignment create --assignee "${FLEET_RP_ID}" --role "Network Contributor" --scope "${SUBNET_ID}"
    
  4. 使用以下命令确认分配。

    az role assignment list --assignee "${FLEET_RP_ID}" --scope "${SUBNET_ID}"
    

示例角色分配

可以使用 Azure CLI 授予 Azure RBAC 角色。 例如,若要在机群范围内创建角色分配,请执行以下操作:

IDENTITY=$(az ad signed-in-user show --output tsv --query id)
FLEET_ID=$(az fleet show --resource-group $GROUP --name $FLEET --output tsv --query id)

az role assignment create \
    --role 'Azure Kubernetes Fleet Manager RBAC Reader' \
    --assignee "$IDENTITY" \
    --scope "$FLEET_ID"

还可以通过追加 /managedNamespaces/<managed-namespace> 到机群 ID 范围,将角色分配限定为单个托管命名空间。 例如,若要在命名空间 example-ns的托管命名空间级别创建角色分配:

IDENTITY=$(az ad signed-in-user show --output tsv --query id)
FLEET_ID=$(az fleet show --resource-group $GROUP --name $FLEET --output tsv --query id)
MANAGED_NAMESPACE_NAME="example-ns"

az role assignment create --role 'Azure Kubernetes Fleet Manager RBAC Reader' --assignee "$IDENTITY" --scope "$FLEET_ID"/managedNamespaces/"$MANAGED_NAMESPACE_NAME"