对 Azure Kubernetes 服务中的机器学习 Web 服务使用 Azure AD 标识

本操作指南介绍如何将 Azure Active Directory (Azure AD) 标识分配到 Azure Kubernetes 服务中部署的机器学习模型。 Azure AD Pod 标识项目允许应用程序使用托管标识和 Kubernetes 基元通过 Azure AD 安全访问云资源。 这样,Web 服务就可以安全访问你的 Azure 资源,而无需在 score.py 脚本中嵌入凭据或直接在其中管理令牌。 本文解释在 Azure Kubernetes 服务群集中创建和安装 Azure 标识,并将该标识分配到已部署的 Web 服务的步骤。

先决条件

创建并安装 Azure 标识

  1. 若要确定是否为 AKS 群集启用了 Kubernetes RBAC,请使用以下命令:

    az aks show --name <AKS cluster name> --resource-group <resource group name> --subscription <subscription id> --query enableRbac
    

    如果启用了 Kubernetes RBAC,此命令将返回 true 值。 此值确定了要在下一步骤中使用的命令。

  2. 在 AKS 群集上安装 Azure AD Pod 标识

  3. 按照 Azure AD Pod 标识项目页中所述的步骤创建 Azure 标识

  4. 按照 Azure AD Pod 标识项目页中所述的步骤部署 Azure 标识

  5. 按照 Azure AD Pod 标识项目页中所述的步骤部署 Azure 标识绑定

  6. 如果在上一步骤中创建的 Azure 标识不在 AKS 群集所在的节点资源组中,请遵循 Azure AD Pod 标识项目页中所述的角色分配步骤。

将 Azure 标识分配到 Web 服务

以下步骤使用上一部分中创建的 Azure 标识,并通过选择器标签将其分配到 AKS Web 服务。

首先,在要将 Azure 标识分配到的 AKS 群集中,确定部署的名称和命名空间。 可运行以下命令获取此信息。 命名空间应是 Azure 机器学习工作区名称,部署名称应是门户中所示的终结点名称。

kubectl get deployment --selector=isazuremlapp=true --all-namespaces --show-labels

通过编辑部署规范将 Azure 标识选择器标签添加到部署。选择器值应是在部署 Azure 标识绑定的步骤 5 中定义的值。

apiVersion: "aadpodidentity.k8s.io/v1"
kind: AzureIdentityBinding
metadata:
  name: demo1-azure-identity-binding
spec:
  AzureIdentity: <a-idname>
  Selector: <label value to match>

编辑部署以添加 Azure 标识选择器标签。 转到 /spec/template/metadata/labels 下面的以下节。 应会看到类似于 isazuremlapp: “true” 的值。 按如下所示添加 aad-pod-identity 标签。

    kubectl edit deployment/<name of deployment> -n azureml-<name of workspace>
spec:
  template:
    metadata:
      labels:
       aadpodidbinding: "<value of Selector in AzureIdentityBinding>"
      ...

若要验证是否正确添加了该标签,请运行以下命令。 还应看到新创建的 Pod 的状态。

   kubectl get pod -n azureml-<name of workspace> --show-labels

启动并运行 Pod 后,此部署的 Web 服务现在可以通过 Azure 标识访问 Azure 资源,而无需在代码中嵌入凭据。

将角色分配到 Azure 标识

为 Azure 托管标识分配适当的角色,以访问其他 Azure 资源。 确保分配的角色具有正确的数据操作。 例如,存储 Blob 数据读取者角色对存储 Blob 拥有读取权限,而普通的读取者角色可能没有这些权限。

对 Web 服务使用 Azure 标识

将模型部署到 AKS 群集。 score.py 脚本可以包含指向 Azure 标识有权访问的 Azure 资源的操作。 确保为你要尝试访问的资源安装了所需的客户端库依赖项。 下面几个示例演示如何使用 Azure 标识从服务访问不同的 Azure 资源。

从 Web 服务访问 Key Vault

如果为 Azure 标识授予了对 Key Vault 中某个机密的读取访问权限,则 score.py 可以使用以下代码访问该机密。

from azure.identity import DefaultAzureCredential
from azure.keyvault.secrets import SecretClient

my_vault_name = "yourkeyvaultname"
my_vault_url = "https://{}.vault.azure.cn/".format(my_vault_name)
my_secret_name = "sample-secret"

# This will use your Azure Managed Identity
credential = DefaultAzureCredential()
secret_client = SecretClient(
    vault_url=my_vault_url,
    credential=credential)
secret = secret_client.get_secret(my_secret_name)

重要

本例使用 DefaultAzureCredential。 若要使用特定访问策略向标识授予访问权限,请参阅使用 Azure CLI 分配密钥保管库访问策略

从 Web 服务访问 Blob

如果为 Azure 标识授予了对存储 Blob 中的数据的读取访问权限,则 score.py 可以使用以下代码访问此数据。

from azure.identity import DefaultAzureCredential
from azure.storage.blob import BlobServiceClient

my_storage_account_name = "yourstorageaccountname"
my_storage_account_url = "https://{}.blob.core.chinacloudapi.cn/".format(my_storage_account_name)

# This will use your Azure Managed Identity
credential = DefaultAzureCredential()
blob_service_client = BlobServiceClient(
    account_url=my_storage_account_url,
    credential=credential
)
blob_client = blob_service_client.get_blob_client(container="some-container", blob="some_text.txt")
blob_data = blob_client.download_blob()
blob_data.readall()

后续步骤

  • 有关如何使用 Python Azure 标识客户端库的详细信息,请参阅 GitHub 上的存储库