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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 15:43:22