【问题标题】:Access Azure Instance Metadata Service (169.254.169.254) from Windows docker container从 Windows docker 容器访问 Azure 实例元数据服务 (169.254.169.254)
【发布时间】:2020-08-05 22:40:28
【问题描述】:

Azure VM 可以查询位于169.254.159.254Instance Metadata Service 以获取数据。但是,这在 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

【问题讨论】:

    标签: azure docker networking containers


    【解决方案1】:

    恐怕我们无法从 Azure VM 上的 Windows 容器访问 Azure Instance Metadata Service 端点,因为 docker 上的容器与 VM 网络隔离在不同的网络中,并且 IMDS 只能从来自 VM 级别的不可路由的 IP 地址。

    Azure 的 IMDS 是一个 REST 端点,可在知名的 不可路由的IP地址(169.254.169.254),只能访问 从虚拟机内部。 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

    编辑

    来自Known issues and FAQ

    元数据调用必须从分配给 VM 的主网卡。

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

    【讨论】:

    猜你喜欢
    • 2017-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    相关资源
    最近更新 更多