如何将托管服务标识添加到托管在 Azure VM 规模集或 Service Fabric 中的容器?
How can I add Managed Service Identity to a container hosted inside Azure VM Scaleset or Service Fabric?
我想使用 MSI,例如访问托管在 Azure Service Fabric VMSS 中的容器内的应用程序(尤其是对我而言:Azure Functions 运行时)中的 KeyVault。
我需要做什么才能实现这一目标?
基于对此 issue 的提示:
第 1 步 - 将身份添加到 VMSS
为集群 Microsoft.Compute/virtualMachineScaleSets
资源扩展 ARM 模板。在资源的根级别添加 identity
元素,就像 properties
...
"identity": {
"type": "SystemAssigned"
},
...
(重新)部署集群。
步骤 2 - 将路由添加到容器
在 Windows 容器中,到 MSI 端点的路由默认情况下不工作。为此,我添加了一个入口脚本,例如Entry.PS1(不要忘记添加容器的原始 ENTRYPOINT - 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 条目:
...
ENTRYPOINT ["powershell.exe","C:\entry.PS1"]
Background: adding the route add
not at entry point level will execute the statement at build time and add the route to the build host/container
步骤 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
要解决这个问题,我必须 re-image the VMSS nodes
我想使用 MSI,例如访问托管在 Azure Service Fabric VMSS 中的容器内的应用程序(尤其是对我而言:Azure Functions 运行时)中的 KeyVault。
我需要做什么才能实现这一目标?
基于对此 issue 的提示:
第 1 步 - 将身份添加到 VMSS
为集群 Microsoft.Compute/virtualMachineScaleSets
资源扩展 ARM 模板。在资源的根级别添加 identity
元素,就像 properties
...
"identity": {
"type": "SystemAssigned"
},
...
(重新)部署集群。
步骤 2 - 将路由添加到容器
在 Windows 容器中,到 MSI 端点的路由默认情况下不工作。为此,我添加了一个入口脚本,例如Entry.PS1(不要忘记添加容器的原始 ENTRYPOINT - 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 条目:
...
ENTRYPOINT ["powershell.exe","C:\entry.PS1"]
Background: adding the
route add
not at entry point level will execute the statement at build time and add the route to the build host/container
步骤 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
要解决这个问题,我必须 re-image the VMSS nodes