使用Spring Cloud Azure时无法通过托管标识读取Azure Key Vault
问题描述
我运行一个Spring Boot 3应用,通过Spring Cloud Azure依赖访问Azure Key Vault。已创建用户分配的托管标识,并在Key Vault的访问策略中为其授予机密和属性的Get/List权限。但将应用部署到与Key Vault同订阅的Azure Kubernetes集群后启动时,出现以下异常:
Caused by: java.util.concurrent.ExecutionException: com.azure.identity.CredentialUnavailableException: ManagedIdentityCredential authentication unavailable. Connection to IMDS endpoint cannot be established. at java.base/java.util.concurrent.CompletableFuture.reportGet(Unknown Source) at java.base/java.util.concurrent.CompletableFuture.get(Unknown Source) at com.microsoft.aad.msal4j.AcquireTokenByAppProviderSupplier.fetchTokenUsingAppTokenProvider(AcquireTokenByAppProviderSupplier.java:76) ... 7 common frames omitted Caused by: com.azure.identity.CredentialUnavailableException: ManagedIdentityCredential authentication unavailable. Connection to IMDS endpoint cannot be established. at com.azure.identity.implementation.IdentityClient.lambda$authenticateToIMDSEndpoint$57(IdentityClient.java:1139) at reactor.core.publisher.MonoCallable.call(MonoCallable.java:72) at reactor.core.publisher.FluxFlatMap.trySubscribeScalarMap(FluxFlatMap.java:174) at reactor.core.publisher.MonoFlatMap.subscribeOrReturn(MonoFlatMap.java:53) at reactor.core.publisher.Mono.subscribe(Mono.java:4470) at reactor.core.publisher.Mono.subscribeWith(Mono.java:4551) at reactor.core.publisher.Mono.toFuture(Mono.java:5063) at com.azure.identity.implementation.IdentityClientBase.lambda$getManagedIdentityConfidentialClient$3(IdentityClientBase.java:362) at com.microsoft.aad.msal4j.AcquireTokenByAppProviderSupplier.fetchTokenUsingAppTokenProvider(AcquireTokenByAppProviderSupplier.java:75) ... 7 common frames omitted
注意到使用其他托管标识时一切正常,问题应该出在我创建的这个托管标识上,但找不到原因。
我的Spring Boot配置如下:
azure: keyvault: secret: property-sources: - endpoint: https://our-amazing-vault.vault.azure.net/ credential: client-id: xxxx managed-identity-enabled: true profile: tenant-id: xxxx property-source-enabled: true enabled: true
排查与解决方案
针对该问题,按以下步骤逐一排查:
1. 确认托管标识与K8s Pod的关联
用户分配的托管标识需明确绑定到Pod,仅创建标识无效:
- 检查AKS集群是否已启用托管标识支持
- 在部署YAML中添加注解,指定托管标识的Client ID:
metadata: annotations: azure.workload.identity/client-id: "你的托管标识Client ID" - 通过Azure CLI或Portal验证Pod的服务账户已与托管标识建立关联
2. 测试IMDS端点访问
异常提示无法连接实例元数据服务(IMDS),这是托管标识获取令牌的核心路径:
- 在Pod内执行命令测试访问:
curl http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fvault.azure.net - 若无法访问,检查集群网络策略是否阻止了对169.254.169.254的请求,或节点防火墙规则是否限制了IMDS端点
3. 验证托管标识的权限配置
确认Key Vault访问策略无遗漏:
- 核对配置中的
client-id与托管标识的Client ID完全一致,无拼写错误 - 确认访问策略应用到整个Key Vault,权限包含
机密:Get、机密:List、属性:Get、属性:List,且已保存生效
4. 检查依赖版本兼容性
Spring Boot 3需搭配兼容的Spring Cloud Azure版本:
- 使用Spring Cloud Azure 4.x系列版本(与Spring Boot 3.x适配)
- 避免项目中混用不同版本的Azure SDK组件
5. 简化配置测试
暂时简化配置,排除冗余项干扰:
azure: keyvault: secret: endpoint: https://our-amazing-vault.vault.azure.net/ client-id: xxxx managed-identity-enabled: true
重启应用后观察异常是否消失,再逐步添加其他配置项排查问题
内容的提问来源于stack exchange,提问作者hashpyrit
相关产品推荐
相关产品推荐

