You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在AKS集群Pod中通过Managed Identity连接Azure存储

实现AKS Pod通过托管身份访问Azure文件存储

一、绑定托管身份到AKS Pod

前提准备

确保你的AKS集群已启用OIDC Issuer和Azure AD Workload Identity(若未开启,执行以下命令):

az aks update -g <resource-group-name> -n <aks-cluster-name> --enable-oidc-issuer --enable-workload-identity

关联托管身份与ServiceAccount

  1. 获取AKS集群的OIDC Issuer URL:
az aks show -g <resource-group-name> -n <aks-cluster-name> --query "oidcIssuerProfile.issuerUrl" -o tsv
  1. 创建联邦身份凭据,关联托管身份与目标ServiceAccount:
az identity federated-credential create \
  --name <credential-name> \
  --identity-name <managed-identity-name> \
  --resource-group <resource-group-name> \
  --issuer <aks-oidc-issuer-url> \
  --subject system:serviceaccount:<namespace>:<service-account-name>
  1. 配置Pod使用该ServiceAccount,修改Pod的YAML配置:
apiVersion: v1
kind: Pod
metadata:
  name: flask-app-pod
  namespace: <your-namespace>
spec:
  serviceAccountName: <service-account-name>
  containers:
  - name: flask-container
    image: <your-flask-image>

分配存储权限给托管身份

给托管身份分配Azure文件存储的对应权限,例如使用Azure CLI:

az role assignment create \
  --role "Storage File Data SMB Share Contributor" \
  --assignee <managed-identity-client-id> \
  --scope "/subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/Microsoft.Storage/storageAccounts/<storage-account-name>/fileServices/default/shares/<share-name>"

(也可在Azure门户的存储账户IAM页面直接添加角色分配)

二、Flask应用代码修改

安装依赖包

除了azure-storage-file-share,还需安装身份认证包:

pip install azure-storage-file-share azure-identity

替换访问密钥认证为托管身份认证

修改原有使用存储访问密钥的代码,改用DefaultAzureCredential自动获取托管身份令牌:

from flask import Flask
from azure.storage.fileshare import ShareClient
from azure.identity import DefaultAzureCredential

app = Flask(__name__)

@app.route('/list-files')
def list_share_files():
    # 替换为你的存储账户名和文件共享名
    STORAGE_ACCOUNT = "<your-storage-account-name>"
    SHARE_NAME = "<your-file-share-name>"

    # 自动使用AKS Pod绑定的托管身份获取令牌
    credential = DefaultAzureCredential()
    token = credential.get_token("https://storage.azure.com/.default")

    # 创建ShareClient并执行操作
    share_client = ShareClient(
        account_url=f"https://{STORAGE_ACCOUNT}.file.core.windows.net",
        share_name=SHARE_NAME,
        credential=token.token
    )

    # 示例:列出共享中的文件和目录
    items = list(share_client.list_directories_and_files())
    return f"Items in share: {[item.name for item in items]}"

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

说明:DefaultAzureCredential在AKS环境中会自动识别Workload Identity,无需额外配置环境变量;本地调试时,会自动使用你本地az login的身份,方便测试。

三、排查要点

  • 确认托管身份的角色分配范围正确(可限定到特定文件共享或整个存储账户)
  • 检查ServiceAccount的命名空间、名称与联邦身份凭据中的subject参数完全匹配
  • 验证Pod已正确关联指定的ServiceAccount,可通过kubectl describe pod <pod-name>查看
  • 若遇到权限错误,可在Pod内执行az login --identity测试身份是否能正常获取令牌

内容的提问来源于stack exchange,提问作者tiger t

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 02:22:46