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
答案 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。
在Azure VM上生成容器化的应用程序时,容器通过默认的docker虚拟化nat NIC与该容器的外部通信。例如,在Azure VM上,有一个额外的IP地址172.22.48.1
用于docker实例与网络172.18.4.0/24
中的来宾OS连接。
元数据调用必须从分配给的主IP地址进行 虚拟机的主网卡。
当您在Azure VM上从容器中调用元数据时,它实际上是在使用NAT nic(它与主要nic具有不同的MAC地址)而不是主要nic。