Skip to main content

工作负载身份 (Workload Identity) 身份验证

warning

本教程由社区贡献,不属于 Open WebUI 官方团队的支持范畴。它仅作为如何根据您的特定用例自定义 Open WebUI 的演示。想贡献代码?请查看贡献教程。

概述

本指南说明了如何在 Azure Kubernetes 服务 (AKS) 上为 Open WebUI 配置 Azure OpenAI 的工作负载身份 (Workload Identity) 身份验证。

工作负载身份允许您的 AKS Pod 使用 Azure Entra ID(原 Azure AD)向 Azure 服务进行身份验证,而无需在集群中存储凭据。这为访问 Azure OpenAI 提供了一个安全且受管理的身份解决方案。

前提条件

OpenWebUI

Terraform 配置

下面是设置工作负载身份身份验证的完整 Terraform 配置:

1. 创建 Kubernetes 命名空间

我们首先需要创建一个 Kubernetes 命名空间,以便在接下来的步骤中以编程方式将其分配给我们的 Helm 部署,以及我们的用户分配标识和联合身份凭据。

resource "kubernetes_namespace" "this" {
metadata {
name = var.kubernetes_namespace
}
}

2. 创建用户分配标识 (User Assigned Identity)

我们首先创建一个 Azure 用户分配标识,您的 Open WebUI Pod 将使用该标识向 Azure 服务进行身份验证。

resource "azurerm_user_assigned_identity" "uai" {
location = var.location
name = var.workload_identity_name
resource_group_name = var.resource_group_name
}

3. 创建联合身份凭据 (Federated Identity Credential)

联合身份凭据在 Kubernetes 服务帐户和 Azure 用户分配标识之间建立信任关系,允许 Pod 将 Kubernetes 令牌交换为 Azure 令牌。

resource "azurerm_federated_identity_credential" "federated_identity" {
name = "federated-identity"
resource_group_name = var.resource_group_name
audience = ["api://AzureADTokenExchange"]
issuer = data.terraform_remote_state.aks.outputs.oidc_issuer_url
parent_id = azurerm_user_assigned_identity.uai.id
subject = "system:serviceaccount:${kubernetes_namespace.this.metadata[0].name}:${var.kubernetes_service_account_name}"
}

4. 为访问 Azure OpenAI 分配 RBAC 角色

建立 Azure 与我们的用户分配标识之间的信任关系后,我们现在可以为该标识分配角色。在这种情况下,我们分配 Cognitive Services OpenAI User 角色,但如果您想使用其他 Azure 功能,以后当然可以添加更多角色分配。

note

默认情况下,我们的用户分配标识没有任何访问权限,需要被赋予 Azure RBAC 角色才能访问各种 Azure 资源。

warning

请务必将 YOUR_COGNITIVE_ACCOUNT_ID 替换为您的 Azure OpenAI 实例的认知账户 ID。

resource "azurerm_role_assignment" "workload_identity_azure_openai" {
scope = "YOUR_COGNITIVE_ACCOUNT_ID"
role_definition_name = "Cognitive Services OpenAI User"
principal_id = azurerm_user_assigned_identity.uai.principal_id
}

5. 通过 Helm 部署 Open WebUI

这会将 Open WebUI 部署到您的 AKS 集群,并附带必要的服务帐户注释和 Pod 标签,以启用工作负载身份身份验证。

resource "helm_release" "openwebui" {
name = "open-webui"
repository = "https://helm.openwebui.com/"
chart = "open-webui"
version = "7.2.0"
namespace = kubernetes_namespace.this.metadata[0].name
atomic = true

values = [
"${file("helm.values.yaml")}"
]

set {
name = "image.tag"
value = "v0.6.33"
}

set {
name = "serviceAccount.name"
value = var.kubernetes_service_account_name
}

set {
name = "serviceAccount.annotations.azure\\.workload\\.identity/client-id"
value = azurerm_user_assigned_identity.uai.client_id
}
}

6. UI 配置

部署 Open WebUI 后,您可以按照以下步骤配置 Azure OpenAI 连接:

  1. 导航到 管理员面板 (Admin Panel)连接 (Connections)
  2. 点击 添加连接 (Add Connection)
  3. 选择 Azure OpenAI 作为提供商
  4. 选择 Entra ID 作为身份验证类型
  5. 配置您的 Azure OpenAI 端点和部署详情
  6. 保存连接

关键组件说明

服务帐户注释 (Service Account Annotations)

服务帐户必须具有以下注释,以便将其与 Azure 用户分配标识链接起来:

azure.workload.identity/client-id: <USER_ASSIGNED_IDENTITY_CLIENT_ID>

Pod 标签 (Pod Labels)

Pod 必须包含以下标签以启用工作负载身份:

azure.workload.identity/use: "true"

联合身份凭据 (Federated Identity Credential)

联合身份凭据在以下各项之间创建信任关系:

  • AKS 集群的 OIDC 发行者 (OIDC Issuer)
  • Kubernetes 服务帐户
  • Azure 用户分配标识

subject 字段遵循以下格式:

system:serviceaccount:<namespace>:<service-account-name>

故障排除

常见问题

  1. 身份验证失败

    • 验证 AKS 集群上是否启用了 OIDC 发行者
    • 检查 AKS 集群上是否启用了工作负载身份
    • 确认联合身份凭据的 subject 与命名空间和服务帐户名称匹配
  2. 权限错误

    • 确保已将 Cognitive Services OpenAI User 角色分配给用户分配标识
    • 验证角色分配的范围是否包含您的 Azure OpenAI 资源
  3. Pod 身份问题

    • 检查 Pod 是否具有标签 azure.workload.identity/use: "true"
    • 验证服务帐户是否具有正确的 azure.workload.identity/client-id 注释
    • 确认服务帐户名称与联合凭据配置匹配

验证命令

检查服务帐户注释:

kubectl get serviceaccount <service-account-name> -n <namespace> -o yaml

查看 Pod 标签:

kubectl get pod <pod-name> -n <namespace> -o yaml