1

我想利用 MSI 例如访问托管在 Azure Service Fabric VMSS 中的容器内托管的应用程序(特别是对我而言:Azure Functions 运行时)中的 KeyVault。

我需要做什么才能实现这一目标?

4

1 回答 1

5

基于关于这个问题的提示:

第 1 步 - 将身份添加到 VMSS

Microsoft.Compute/virtualMachineScaleSets为集群资源扩展 ARM 模板。identity在资源的根级别添加元素,例如properties

...
  "identity": {
    "type": "SystemAssigned"
  },      
...

(重新)部署集群。

第 2 步 - 向容器添加路由

在 Windows 容器中,默认情况下,到 MSI 端点的路由不起作用。为此,我添加了一个入口脚本,例如 Entry.PS1(不要忘记添加容器的原始入口点 -ServiceMonitor.exe在我的情况下,因为我有一个 IIS 容器):

Write-Host "adding route for Managed Service Identity"
$gateway = (Get-NetRoute | Where-Object {$_.DestinationPrefix -eq '0.0.0.0/0'}).NextHop
$arguments = 'add','169.254.169.0','mask','255.255.255.0',$gateway
&'route' $arguments

$response = Invoke-WebRequest -Uri 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fvault.azure.net%2F' -Method GET -Headers @{Metadata="true"} -UseBasicParsing
Write-Host "MSI StatusCode :" $response.StatusCode

C:\ServiceMonitor.exe w3svc

并修改了 Dockerfile / containers ENTRY:

...
ENTRYPOINT ["powershell.exe","C:\\entry.PS1"]

背景:route add在入口点级别添加 not 将在构建时执行语句并将路由添加到构建主机/容器

第 3 步 - 可选的重新映像 VMSS 节点

但是,我仍然遇到现有集群的问题。访问令牌端点时

Invoke-WebRequest -Uri 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fvault.azure.net%2F' -Method GET -Headers @{Metadata="true"} -UseBasicParsing

我仍然收到此错误

Invoke-WebRequest : Unable to connect to the remote server
At line:1 char:1
+ Invoke-WebRequest -Uri 'http://169.254.169.254/metadata/identity/oaut ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

为了解决这个问题,我必须重新映像 VMSS 节点

于 2018-09-30T13:05:17.233 回答