从Windows Docker容器访问Azure实例元数据服务(169.254.169.254)

时间:2020-08-05 22:40:28

标签: azure docker networking containers

Azure VM可以查询位于169.254.159.254的{​​{3}}来获取数据。但是,这无法从在VM上运行的Windows容器中进行。

Windows容器如何查询只能从主机VM访问的实例元数据服务?

例如,在使用Windows容器时,例如:docker run -it --rm mcr.microsoft.com/windows/servercore:ltsc2019

并查询以下数据:Invoke-RestMethod -Headers @{"Metadata"="true"} -Method GET -Uri http://169.254.169.254/metadata/instance?api-version=2019-06-01

结果:

At line:1 char:1
+ Invoke-RestMethod -Headers @{"Metadata"="true"} -Method GET -Uri http ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-RestMethod], WebExc
   eption
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand

1 个答案:

答案 0 :(得分:1)

恐怕我们无法从Azure VM上的Windows容器访问Azure实例元数据服务终结点,因为docker上的容器与VM网络位于不同的网络中,并且IMDS仅可用于来自VM级别的不可路由的IP地址。

Azure的IMDS是一个REST端点,可在著名的 不可路由的IP地址(169.254.169.254),只能访问 从VM内部。 VM和IMDS之间的通信永不离开 主机。

只能从内部访问实例元数据服务终结点 在不可路由的IP地址上运行的虚拟机实例。在 此外,带有X-Forwarded-For标头的任何请求都会被拒绝 服务。

下图描述了与现有VM集成的容器。获取更多详细信息here

enter image description here

在Azure VM上生成容器化的应用程序时,容器通过默认的docker虚拟化nat NIC与该容器的外部通信。例如,在Azure VM上,有一个额外的IP地址172.22.48.1用于docker实例与网络172.18.4.0/24中的来宾OS连接。

enter image description here

编辑

Known issues and FAQ

元数据调用必须从分配给的主IP地址进行 虚拟机的主网卡。

当您在Azure VM上从容器中调用元数据时,它实际上是在使用NAT nic(它与主要nic具有不同的MAC地址)而不是主要nic。

相关问题