【发布时间】:2018-08-10 05:01:28
【问题描述】:
我在 Azure 中有一个使用 AKS 预览版的 k8s 集群。
我还在虚拟机上启用了 MSI。如果我 ssh 到虚拟机,我可以看到 MSI 服务正在运行:
curl http://localhost:50342/oauth2/token --data "resource=https://vault.azure.net" -H Metadata:true
根据文档,我收到的回复符合您的预期。
但是,我无法弄清楚如何让我的 aspnet 核心应用程序根据需要使用 AzureServiceTokenProvider。在本地它可以工作,一旦部署在 kubernetes 的 pod 中,它就找不到所需的授权。
我得到的错误是:
Microsoft.Azure.Services.AppAuthentication.AzureServiceTokenProviderException:参数:Connectionstring:[未指定连接字符串],资源:https://vault.azure.net,授权:https://login.windows.net/9d93c307-6856-4bab-8fa9-99690e0fabaf。异常消息:尝试了以下 3 种方法来获取访问令牌,但都没有奏效。 参数:连接字符串:[未指定连接字符串],资源:https://vault.azure.net,权限:https://login.windows.net/9d93c307-6856-4bab-8fa9-99690e0fabaf。异常消息:尝试使用托管服务标识获取令牌。无法连接到托管服务标识 (MSI) 端点。请检查您是否在具有 MSI 设置的 Azure 资源上运行。 参数:连接字符串:[未指定连接字符串],资源:https://vault.azure.net,权限:https://login.windows.net/9d93c307-6856-4bab-8fa9-99690e0fabaf。异常消息:尝试使用 Visual Studio 获取令牌。无法获取访问令牌。未设置环境变量 LOCALAPPDATA。 参数:连接字符串:[未指定连接字符串],资源:https://vault.azure.net,权限:https://login.windows.net/9d93c307-6856-4bab-8fa9-99690e0fabaf。异常消息:尝试使用 Azure CLI 获取令牌。无法获取访问令牌。 /bin/bash: az: 没有这样的文件或目录 ```
是否有人能够使用类似代码从 pod 中的 KeyVault 读取数据?
AzureServiceTokenProvider azureServiceTokenProvider = new
AzureServiceTokenProvider();
KVC = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));
var baseUrl = config.GetValue<string>("Azure:VaultURL");
var secretLocation = config.GetValue<string>("Azure:SecretLocation");
location = $"{baseUrl}{secretLocation}";
KVC.GetSecretAsync(location).Result.Value;
【问题讨论】:
-
localhost不是你在 pod 中的容器本身,而不是虚拟机吗? -
是的。我已经设置了一个带有主机网络的守护程序集,以访问 VM localhost。我不知道如何设置 MSI_SECRET 和 MSI_ENDPOINT 。我的计划是代理节点上 pod 的守护程序集。 SSH 到节点,我没有看到那些环境变量集。但我可以使用 oauth 服务。
-
似乎有点过分。为什么不将 Azure AD 应用注册的 client_id 和 client_secret 作为机密存储在集群中,然后将它们作为环境变量传递到任何需要它们的 pod 中。在这种情况下,您需要通过客户端凭据流从 login.microsoftonline.com 获取访问令牌。
-
我想完全避免这些秘密。我的理解是 MSI 的目的是消除对硬编码机密的需要。我最后的手段是硬编码和存储这些值。
-
试试这个 - github.com/Azure/acs-engine/blob/master/docs/kubernetes/…。有点阿尔法,但可能就足够了。
标签: c# azure azure-keyvault azure-aks