使用 kubelogin 对 Azure Kubernetes 服务(AKS)中的用户进行身份验证

Azure 中的 kubelogin 插件是一个实现 Microsoft Entra 身份验证的 client-go 凭据插件。 kubelogin 插件提供 kubectl 命令行工具中没有的功能。 有关详细信息,请参阅 kubelogin 简介kubectl 简介

本文概述了在 AKS 中如何使用 kubelogin 进行所有受支持的 Microsoft Entra 身份验证方法。

AKS 限制中的 Kubelogin 身份验证

  • 在 Microsoft Entra 中创建的组仅通过其 ObjectID 值(而不是显示名称)包含。 sAMAccountName 命令仅适用于从本地 Windows Server Active Directory 同步的组。
  • 服务主体身份验证方法仅适用于托管Microsoft Entra,不适用于早期版本的 Azure Active Directory。
  • 服务主体最多可以是 200 个 Microsoft Entra 组的成员。 如果有超过 200 个组,请考虑使用应用程序角色
  • 在 Microsoft Entra 租户上设置 Microsoft Entra 条件访问策略时,无法使用设备代码身份验证方法。 在这种情况下,请改用 Web 浏览器交互式身份验证。
  • Azure CLI 身份验证方法仅适用于 AKS 托管Microsoft Entra。

身份验证的工作原理

注意

请记住有关与 Microsoft Entra 集成的 AKS 群集的 kubelogin 身份验证的以下信息:

  • 运行 Kubernetes 版本 1.24 或更高版本的群集 会自动使用 kubelogin 格式。
  • 运行 Kubernetes 1.24 或更早版本的群集 需要手动转换。 可以使用设备代码身份验证方法将 kubeconfig 文件转换为使用 exec 插件格式。

对于与 kubelogin 的大多数交互,可以使用 convert-kubeconfig 子命令。 子命令使用在 --kubeconfigKUBECONFIG 环境变量中指定的 kubeconfig 文件,根据指定的身份验证方法将最终的 kubeconfig 文件转换为 exec 格式。

kubelogin 实现的身份验证方法是 Microsoft Entra OAuth 2.0 令牌授予流。 在每个身份验证方法中,令牌不会缓存在文件系统上。

设备代码身份验证

设备代码是 convert-kubeconfig 子命令的默认身份验证方法。 此身份验证方法会提示用户提供设备代码以从浏览器会话登录。

注意

在引入 kubelogin 和 exec 插件之前,kubectl 中的 Azure 身份验证方法仅支持设备代码流。 它使用了一个早期版本的库,该库生成一个令牌,具有前缀为 audiencespn: 声明。 它与 AKS 托管的 Microsoft Entra 不兼容,后者使用 代表(OBO)流。 运行 convert-kubeconfig 子命令时,kubelogin 会从受众声明中删除 spn: 前缀。

设备代码身份验证的参数

下表概述了可用于设备代码身份验证的参数:

参数 Description
-l devicecode(可选) 指定 kubelogin 身份验证方法。 此参数是可选的,因为设备代码是默认方法。
--legacy 对早期版本的 Azure Active Directory 群集使用旧行为。 如果要在早期版本的 Azure Active Directory 群集中使用 kubeconfig 文件,kubelogin 将自动添加 --legacy 标志。
--token-cache-dir 重写令牌缓存目录的默认路径,即 ${HOME}/.kube/cache/kubelogin

Azure CLI 身份验证

Azure CLI(命令: -l azurecli)身份验证方法使用 Azure CLI 建立的已登录上下文来获取访问令牌。 该令牌在与 az login 相同的 Microsoft Entra 租户中颁发。 kubelogin 不会将令牌写入令牌缓存文件,因为 Azure CLI 已管理令牌。

Azure CLI 身份验证的参数

下表概述了可用于 Azure CLI 身份验证的参数:

参数 Description
-l azurecli 指定 kubelogin 身份验证方法。
--azure-config-dir 指定 Azure CLI 配置目录。 默认目录为 ${HOME}/.azure

登录到 Azure

使用 az login 命令登录到 Azure。

az login

Web 浏览器交互式身份验证

Web 浏览器交互式(命令: -l interactive)身份验证方法会自动打开 Web 浏览器以登录用户。 用户进行身份验证后,浏览器会使用已验证的凭据重定向到本地 Web 服务器。 此身份验证方法符合条件访问策略。

可以将持有者令牌或所有权证明(PoP)令牌用于此身份验证方法。

持有者令牌身份验证的参数

下表概述了可用于持有者令牌身份验证的参数:

参数 Description
-l interactive 指定 kubelogin 身份验证方法。
--token-cache-dir 重写令牌缓存目录的默认路径,即 ${HOME}/.kube/cache/kubelogin

PoP 令牌身份验证的参数

下表概述了可用于 PoP 令牌身份验证的参数:

参数 Description
-l interactive 指定 kubelogin 身份验证方法。
--pop-enabled 启用 PoP 令牌身份验证。
--pop-claims 以键值对格式指定 PoP 令牌声明。 例如 u=/ARM/ID/OF/CLUSTER

服务主体身份验证

服务主体(命令: -l spn)身份验证方法使用服务主体登录用户。 可以通过设置环境变量或在命令行参数中使用凭据来提供凭据。 可以使用的受支持凭据是密码或个人信息交换 (PFX) 客户端证书。

服务主体身份验证的参数

下表概述了可用于服务主体身份验证的参数:

参数 Description
-l spn 指定 kubelogin 身份验证方法。
--client-id 服务主体的应用程序 ID(客户端 ID)。
--client-secret 服务主体的客户端密钥。

托管标识身份验证

使用 托管标识 身份验证方法(命令:-l msi),以便应用程序连接到支持 Microsoft Entra 身份验证的资源。 示例包括访问 Azure 资源(例如 Azure 虚拟机(VM)、虚拟机规模集或 Azure Cloud Shell。

可以使用分配给资源的默认托管标识或特定用户分配的托管标识。

托管标识身份验证的参数

可用以下参数进行托管标识身份验证,详情见下表:

参数 Description
-l msi 指定 kubelogin 身份验证方法。
--client-id 用户分配的托管标识的应用程序 ID(客户端 ID)。 如果未指定此参数,将使用默认托管标识。

工作负载身份验证

工作负荷标识(命令: -l workloadidentity) 身份验证方法使用与 Microsoft Entra 联合的标识凭据对 AKS 群集的访问权限进行身份验证。 该方法使用 Microsoft Entra 集成身份验证。 它的工作原理是设置以下环境变量:

Variable Description
AZURE_CLIENT_ID 与工作负荷标识联合的 Microsoft Entra 应用程序 ID。
AZURE_TENANT_ID Microsoft Entra 租户 ID。
AZURE_FEDERATED_TOKEN_FILE 包含已签名工作负荷身份断言的文件,例如 Kubernetes 投射服务帐户(JWT 令牌)。
AZURE_AUTHORITY_HOST Microsoft Entra 授权服务器的基础 URL。 例如 https://login.partner.microsoftonline.cn/

可以使用工作负载标识从 GitHub 或 ArgoCD 等 CI/CD 系统访问 Kubernetes 群集,而无需在外部系统中存储服务主体凭据。 若要从 GitHub 配置 OpenID Connect (OIDC) 联合,请参阅 OIDC 联合示例

工作负载身份验证参数

下表概述了可用于工作负荷标识身份验证的参数:

参数 Description
-l workloadidentity 指定 kubelogin 身份验证方法。

导出 kubeconfig 文件路径

在运行 convert-kubeconfig 子命令之前,请将 kubeconfig 文件路径导出到 KUBECONFIG 环境变量。 例如:

export KUBECONFIG=/path/to/kubeconfig

转换 kubeconfig 文件

运行convert-kubeconfig子命令,将kubeconfig文件转换为使用exec插件,以实现所选身份验证方法。

kubelogin convert-kubeconfig
kubelogin convert-kubeconfig -l azurecli
# Bearer token authentication
kubelogin convert-kubeconfig -l interactive

# Proof-of-Possession (PoP) token authentication
kubelogin convert-kubeconfig -l interactive --pop-enabled --pop-claims "u=/ARM/ID/OF/CLUSTER"
  1. convert-kubeconfig运行子命令以转换 kubeconfig 文件以使用 exec 插件。

    kubelogin convert-kubeconfig -l spn
    
  2. 为客户端 ID 和客户端机密或客户端证书设置环境变量。 例如:

    export AZURE_CLIENT_ID=<service-principal-client-id>
    export AZURE_CLIENT_SECRET=<service-principal-client-secret>
    
# Default managed identity authentication
kubelogin convert-kubeconfig -l msi

# Specific managed identity authentication
kubelogin convert-kubeconfig -l msi --client-id <managed-identity-client-id>
kubelogin convert-kubeconfig -l workloadidentity

删除缓存的令牌

使用 kubelogin remove-tokens 命令删除缓存的令牌。

kubelogin remove-tokens

获取节点信息

使用 kubectl get 命令获取节点信息。

kubectl get nodes

如何将 kubelogin 与 AKS 结合使用

AKS 使用一对第一方 Microsoft Entra 应用程序。 这些应用程序 ID 在所有环境中都是相同的。

服务器端使用的 AKS Microsoft Entra 服务器应用程序 ID(服务器 ID)是 6dae42f8-4368-4678-94ff-3960e28e3630。 必须为此应用程序颁发访问 AKS 群集的访问令牌。 在大多数 kubelogin 身份验证方法中,必须使用 --server-idkubelogin get-token

kubelogin 用来代表用户执行公共客户端身份验证的 AKS Microsoft Entra 客户端应用程序 ID (client-id) 是 80faf920-1908-4b52-b5ef-a8e7bedfc67a。 客户端应用程序 ID 用于设备代码和 Web 浏览器交互式身份验证方法。