如何在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
- 获取AKS集群的OIDC Issuer URL:
az aks show -g <resource-group-name> -n <aks-cluster-name> --query "oidcIssuerProfile.issuerUrl" -o tsv
- 创建联邦身份凭据,关联托管身份与目标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>
- 配置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
相关产品推荐
相关产品推荐

