可以使用 kubectl
工具来与 Kubernetes 群集交互。 Azure CLI 提供了一种简单的方法来获取访问凭据和 kubeconfig 配置文件,以便使用 kubectl
连接到 AKS 群集。 可以使用 Azure 基于角色的访问控制 (Azure RBAC) 来限制谁可以访问 kubeconfig 文件以及他们拥有的权限。
本文介绍如何分配用于限制谁可以获取 AKS 群集配置信息的 Azure 角色。
- 本文假定你拥有现有的 AKS 群集。 如果需要 AKS 群集,请使用 Azure CLI、Azure PowerShell 或 Azure 门户创建一个。
- 本文还要求运行 Azure CLI 2.0.65 或更高版本。 运行
az --version
即可查找版本。 如果需要进行安装或升级,请参阅安装 Azure CLI。
当你使用 kubectl
工具与 AKS 群集交互时,一个名为 kubeconfig 的配置文件会定义群集连接信息。 此配置文件通常存储在 ~/.kube/config 中。可在此 kubeconfig 文件中定义多个群集。 可以使用 kubectl config use-context
命令在群集之间切换。
使用 az aks get-credentials
命令可以获取 AKS 群集的访问凭据,并将凭据合并到 kubeconfig 文件中。 可以使用 Azure RBAC 来控制对这些凭据的访问。 使用这些 Azure 角色可以定义谁能够检索 kubeconfig 文件,以及他们在群集中拥有的权限。
有两个 Azure 角色可以应用于 Microsoft Entra 用户或组:
Azure Kubernetes 服务群集管理员角色
- 允许访问
Microsoft.ContainerService/managedClusters/listClusterAdminCredential/action
API 调用。 此 API 调用列出群集管理员凭据。 - 下载 clusterAdmin 角色的 kubeconfig。
- 允许访问
Azure Kubernetes 服务群集用户角色
- 允许访问
Microsoft.ContainerService/managedClusters/listClusterUserCredential/action
API 调用。 此 API 调用列出群集用户凭据。 - 下载 clusterUser 角色的 kubeconfig。
- 允许访问
注意
在使用 Microsoft Entra ID 的群集上,具有 clusterUser 角色的用户有一个提示登录的空 kubeconfig 文件。 登录后,用户可以根据其 Microsoft Entra 用户或组设置进行访问。 具有 clusterAdmin 角色的用户拥有管理员访问权限。
在不使用 Microsoft Entra ID 的群集上,clusterUser 角色具有的效果与 clusterAdmin 角色相同。
若要分配其中一个可用角色,你需要使用以下步骤获取 AKS 群集的资源 ID 和 Microsoft Entra 用户帐户或组的 ID:
- 使用
az aks show
命令获取 myResourceGroup 资源组中名为 myAKSCluster 的群集的群集资源 ID。 请根据需要提供自己的群集和资源组名称。 - 使用
az account show
和az ad user show
命令获取用户 ID。 - 使用
az role assignment create
命令分配角色。
以下示例将 Azure Kubernetes 服务群集管理员角色分配给单个用户帐户:
# Get the resource ID of your AKS cluster
AKS_CLUSTER=$(az aks show --resource-group myResourceGroup --name myAKSCluster --query id -o tsv)
# Get the account credentials for the logged in user
ACCOUNT_UPN=$(az account show --query user.name -o tsv)
ACCOUNT_ID=$(az ad user show --id $ACCOUNT_UPN --query objectId -o tsv)
# Assign the 'Cluster Admin' role to the user
az role assignment create \
--assignee $ACCOUNT_ID \
--scope $AKS_CLUSTER \
--role "Azure Kubernetes Service Cluster Admin Role"
若要将权限分配给 Microsoft Entra 组,请使用组而不是用户的对象 ID 更新在上一示例中显示的 --assignee
参数。
若要获取组的对象 ID,请使用 az ad group show
命令。 以下命令获取名为 appdev 的 Microsoft Entra 组的对象 ID:
az ad group show --group appdev --query objectId -o tsv
重要
在某些情况下,例如对于 Microsoft Entra 来宾用户,帐户中的 user.name 与 userPrincipalName 不同。
$ az account show --query user.name -o tsv
user@contoso.com
$ az ad user list --query "[?contains(otherMails,'user@contoso.com')].{UPN:userPrincipalName}" -o tsv
user_contoso.com#EXT#@contoso.partner.onmschina.cn
在这种情况下,请将 ACCOUNT_UPN 的值设置为 Microsoft Entra 用户的 userPrincipalName。 例如,如果帐户 user.name 为 user@contoso.com,则此操作将如以下示例所示:
ACCOUNT_UPN=$(az ad user list --query "[?contains(otherMails,'user@contoso.com')].{UPN:userPrincipalName}" -o tsv)
分配 Azure 角色后,请使用 az aks get-credentials
命令获取 AKS 群集的 kubeconfig 定义。 以下示例获取 --admin 凭据,如果为用户分配了群集管理员角色,则这些凭据可正常运行:
az aks get-credentials --resource-group myResourceGroup --name myAKSCluster --admin
然后,可以使用 kubectl config view
命令来验证群集上下文是否显示已应用管理员配置信息。
$ kubectl config view
输出应类似于以下示例输出:
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: DATA+OMITTED
server: https://myaksclust-myresourcegroup-19da35-4839be06.hcp.chinaeast2.cx.prod.service.azk8s.cn:443
name: myAKSCluster
contexts:
- context:
cluster: myAKSCluster
user: clusterAdmin_myResourceGroup_myAKSCluster
name: myAKSCluster-admin
current-context: myAKSCluster-admin
kind: Config
preferences: {}
users:
- name: clusterAdmin_myResourceGroup_myAKSCluster
user:
client-certificate-data: REDACTED
client-key-data: REDACTED
token: e9f2f819a4496538b02cefff94e61d35
若要删除角色分配,请使用 az role assignment delete
命令。 指定在前面的步骤中获得的帐户 ID 和群集资源 ID。 如果将角色分配给组而不是用户,请为 --assignee
参数指定相应的组对象 ID 而不是帐户对象 ID。
az role assignment delete --assignee $ACCOUNT_ID --scope $AKS_CLUSTER
若要增强在访问 AKS 群集时的安全性,请集成 Microsoft Entra 身份验证。