在Azure VM上运行的Docker容器中使用Azure托管标识

3htmauhk  于 2023-01-14  发布在  Docker
关注(0)|答案(2)|浏览(244)

我遇到了一个问题,我无法通过Azure容器示例和Azure容器应用程序访问我公司的容器注册表,这与VNET和公司注册表的私有链接有关,而且动态启动的容器无法链接。最终,我想使用Kubernetes作为我的批处理作业工作负载的平台,但现在我必须找到一个快速的解决方案,使它能够有至少一个容器运行,也许手动缩放这些必要的时候(一个可能是足够的大部分时间)。
现在,我的目标是通过简单地启动一个VM(必要时可能会启动更多),并在这个VM上运行一个带有(Python)应用程序代码的Docker容器来实现这一点。
现在,我想知道Docker容器是否可以使用分配给VM的(系统/用户分配的)托管标识,如果可以,如何使用。当分配给ACI容器时,如果启动时分配了用户托管标识,我可以轻松地编写如下代码:

default_credential = DefaultAzureCredential()
q_client = QueueClient(
  credential=default_credential,
  queue_name='Queuename',
  accounrt_url='someurl'
)

并且能够访问-例如-这个队列。不需要请求任何类型的令牌,不需要指定任何类型的环境变量。
现在,我怀疑这是否适用于在VM中运行的、分配了用户标识的Docker容器,因为用户标识实际上并没有直接分配给Docker容器。有什么方法仍然可以实现这一点吗?或者这是一个愚蠢的差事,我现在应该只使用环境变量吗?我真的不喜欢后者的想法。但我还没有找到一种方法来使用托管身份这种特殊的方式。

jyztefdp

jyztefdp1#

·是的,您可以通过一种方法在虚拟机上部署的Docker容器上使用分配给虚拟机的托管标识。请按照以下步骤操作,您肯定可以在Docker容器中使用分配给虚拟机的托管标识:-
a)因此,到get an access token to authenticate a request to an Azure resource using a managed identity, you have to call a special URL: - https://169.254.169.254/metadata/identity/oauth2/token . Also, to ensure that the authentication token and regarding networking works in a container, you will have to use a tool which is intended to be run as Windows service on the container host and uses file-based communication to wait for requests by monitoring a folder. The container puts a request file in that folder, the service requests a token and responds to the container with a response file。容器然后可以使用该令牌针对您需要的任何Azure资源进行身份验证。
B)要执行上述操作,您必须在Azure中部署VM并通过RDP连接到它,然后执行以下命令以启动容器:-

docker run -ti -v c:\miat-helper:c:\miat-helper mcr.microsoft.com/powershell:6.2.3-nanoserver-1809

使用以下命令,您将在容器内获得一个PowerShell会话,您可以在其中使用“helper”工具获得访问令牌

$access_token = Invoke-Expression "c:\miat-helper\bin\client.exe --folder c:\miat-helper --resource https://management.azure.com/"

c)你可以使用该访问令牌调用Azure API。因此,要获取有关生成的VM的详细信息,请确保将资源组名称和虚拟机名称替换为以下值:-

$vmInfo = (Invoke-WebRequest -Uri 'https://management.azure.com/subscriptions/ 94670b10-08d0-4d17-bcfe-e01f701be9ff/resourceGroups/<resource group name>/providers/Microsoft.Compute/ virtualMachines/<virtual machine name>?api-version=2017-12-01' -Method GET -ContentType "application/json" -Headers @{ Authorization ="Bearer $access_token"}).content
  Write-Host $vmInfo

以上命令的执行应该为你提供必要的工具,以便从容器中干净地处理Azure资源的身份验证。此外,在ARM模板部署期间为VM分配托管身份,并为该托管身份分配角色以允许对VM进行读取访问。完成这些操作后,you make a ‘GET’ request to the token endpoint from the VM and you get an access token. Then, the helper tool will run as a Windows service and is configured to listen on a particular folder post which the client creates a ‘.request’ file in that folder with the targeted resource as content
d)然后,“helper”服务通过一个事件得到通知,该事件读取文件并请求在同一个类中创建响应文件所依据的令牌,并将令牌写入文件。然后,客户端挑选响应文件,读取令牌,并将其写入标准输出。这样,我们可以想到任何更好的方法,同时具有同样非常低的设置量和高稳定性。
有关这方面的更多详细信息,请参阅以下链接:-
https://tobiasfenster.io/using-azure-managed-identities-in-containers

whitzsjs

whitzsjs2#

我偶然发现了这个问题,因为原来的问题“在Azure VM上运行的Docker容器中使用Azure托管身份
我是这样做的。
先决条件:

  • Azure虚拟机上安装了Linux和Docker
  • 虚拟机具有分配给它的托管标识

在Docker中启动Azure cli主机网络很重要,因为我们需要到达Azure提供的本地终结点。

docker run --network host -it mcr.microsoft.com/azure-cli

在容器内,您现在可以运行:

az login --identity

相关问题