使用自定义 DNS 设置部署容器组

Azure 虚拟网络中,可以使用 Azure CLI 中的 az container create 命令部署容器组。 还可以使用 YAML 配置文件向 az container create 命令提供高级配置设置。

本文演示如何使用 YAML 配置文件通过自定义 DNS 设置部署容器组。

有关将容器组部署到虚拟网络的详细信息,请参阅在虚拟网络中部署一文。

重要

以前,在虚拟网络上部署容器组的过程会将网络配置文件用于配置。 但是,网络配置文件自 2021-07-01 API 版本起已停用。 建议使用最新的 API 版本,该版本依赖于子网 ID

先决条件

  • 一个有效的 Azure 订阅。 如果没有有效的 Azure 订阅,请在开始前创建一个试用版订阅

  • Azure CLI。 本文中的命令行示例使用 Azure CLI,并采用适用于 Bash shell 的格式。 可以在本地安装 Azure CLI

  • 一个资源组,用于管理在本操作指南中使用的所有资源。 在本文中,我们使用示例资源组名称 ACIResourceGroup。

    az group create --name ACIResourceGroup --location chinaeast2
    

限制

即使应用自定义 DNS 配置,Azure DNS 解析程序 IP 168.63.129.16 也会自动添加到容器实例中的 /etc/resolve.conf 文件中。 存在 Azure DNS 解析程序 IP 可能会导致使用 musl-libc(如 Alpine Linux)分发版的 DNS 解析不正确。 这种不正确的解决方法是因为 musl-libc 会并行发送 DNS 查询,并缓存最快的响应。 为了避免此问题,我们建议使用按顺序处理 DNS 查询的分发版,例如 Ubuntu 和 RHEL,后者使用 glibc 而不是 musl-libc。

有关其他网络方案和限制,请参阅 Azure 容器实例的虚拟网络方案和资源

重要

在大多数提供 Azure 容器实例的区域中,在虚拟网络上部署容器组都适用于 Linux 容器。 有关详细信息,请参阅区域和资源可用性。 本文中的示例已针对 Bash shell 设置了格式。 对于 PowerShell 或命令提示符,请相应地调整行继续符。

创建虚拟网络

你需要一个虚拟网络来部署具有自定义 DNS 配置的容器组。 此虚拟网络需要一个具有创建 Azure 容器实例资源的权限的子网和一个链接的专用 DNS 区域来测试名称解析。

本指南使用名为 aci-vnet 的虚拟网络、名为 aci-subnet 的子网和名为 private.contoso.com 的专用 DNS 区域。 我们使用 Azure 专用 DNS 区域,你可在专用 DNS 概述中了解这些区域。

如果有满足这些条件的现有虚拟网络,可以跳到部署容器组

提示

可以根据需要使用自己的信息修改以下命令。

  1. 使用 az network vnet create 命令创建虚拟网络。 以无类别域际路由选择 (CIDR) 格式输入地址前缀(例如:10.0.0.0/16)。

    az network vnet create \
      --name aci-vnet \
      --resource-group ACIResourceGroup \
      --location chinaeast2 \
      --address-prefix 10.0.0.0/16
    
  2. 使用 az network vnet subnet create 命令创建子网。 以下命令在你的虚拟网络中创建一个子网,该子网具有一个允许其创建容器组的委派。 有关使用子网的详细信息,请参阅添加、更改或删除虚拟网络子网。 有关子网委派的详细信息,请参阅“虚拟网络方案和资源”一文中有关委派子网的部分

    az network vnet subnet create \
      --name aci-subnet \
      --resource-group ACIResourceGroup \
      --vnet-name aci-vnet \
      --address-prefixes 10.0.0.0/24 \
      --delegations Microsoft.ContainerInstance/containerGroups
    
  3. 记录此命令的输出中的子网 ID 键值对。 稍后在 YAML 配置文件中使用此键值对。 它采用 "id": "/subscriptions/<subscription-ID>/resourceGroups/ACIResourceGroup/providers/Microsoft.Network/virtualNetworks/aci-vnet/subnets/aci-subnet" 形式。

  4. 使用 az network private-dns zone create 命令创建专用 DNS 区域。

    az network private-dns zone create -g ACIResourceGroup -n private.contoso.com
    
  5. 使用 az network private-dns link vnet create 命令将 DNS 区域链接到虚拟网络。 仅需要 DNS 服务器来测试名称解析。 -e 标志启用自动主机名注册,这是不需要的,因此我们将其设置为 false

    az network private-dns link vnet create \
      -g ACIResourceGroup \
      -n aciDNSLink \
      -z private.contoso.com \
      -v aci-vnet \
      -e false
    

完成前述步骤后,应会看到输出,其中包含一个最终键值对,显示为 "virtualNetworkLinkState": "Completed"

部署容器组

备注

Azure 门户中当前未提供用于容器组部署的自定义 DNS 设置。 必须使用 YAML 文件、资源管理器模板、REST APIAzure SDK 提供它们。

将以下 YAML 复制到一个名为 custom-dns-deploy-aci.yaml 的新文件中。 使用你的值编辑以下配置:

  • dnsConfig:容器组中容器的 DNS 设置。
    • nameServers:要用于 DNS 查找的名称服务器的列表。
    • searchDomains:要为 DNS 查找而追加的 DNS 后缀。
  • ipAddress:容器组的专用 IP 地址设置。
    • ports:要打开的端口(如果有)。
    • protocol:打开的端口的协议(TCP 或 UDP)。
  • subnetIDs:虚拟网络中的子网的网络设置。
    • id:前面获取的子网的完整资源管理器资源 ID。

备注

此时不会自动查询 DNS 配置字段,因此必须显式填写这些字段。

apiVersion: '2021-07-01'
location: chinaeast2
name: pwsh-vnet-dns
properties:
  containers:
  - name: pwsh-vnet-dns
    properties:
      command:
      - /bin/bash
      - -c
      - echo hello; sleep 10000
      environmentVariables: []
      image: mcr.microsoft.com/powershell:latest
      ports:
      - port: 80
      resources:
        requests:
          cpu: 1.0
          memoryInGB: 2.0
  dnsConfig:
    nameServers:
    - 10.0.0.10 # DNS Server 1
    - 10.0.0.11 # DNS Server 2
    searchDomains: contoso.com # DNS search suffix
  ipAddress:
    type: Private
    ports:
    - port: 80
  subnetIds:
    - id: /subscriptions/<subscription-ID>/resourceGroups/ACIResourceGroup/providers/Microsoft.Network/virtualNetworks/aci-vnet/subnets/aci-subnet
  osType: Linux
tags: null
type: Microsoft.ContainerInstance/containerGroups

使用 --file 参数指定 YAML 文件名,通过 az container create 命令部署容器组:

az container create --resource-group ACIResourceGroup \
  --file custom-dns-deploy-aci.yaml

完成部署后,运行 az container show 命令以显示容器组的状态。 示例输出:

az container show --resource-group ACIResourceGroup --name pwsh-vnet-dns -o table
Name              ResourceGroup    Status    Image                                       IP:ports     Network    CPU/Memory       OsType    Location
---------------- ---------------  -------- ------------------------------------------  ----------- ---------  --------------- --------  ----------
pwsh-vnet-dns     ACIResourceGroup  Running   mcr.microsoft.com/powershell                10.0.0.5:80  Private    1.0 core/2.0 gb  Linux     chinaeast2

状态显示 Running 后,执行 az container exec 命令以获取容器内的 bash 访问权限。

az container exec --resource-group ACIResourceGroup --name pwsh-vnet-dns --exec-command "/bin/bash"

验证 DNS 是否按预期在容器内工作。 例如,阅读 /etc/resolv.conf 文件,以确保 YAML 文件中提供的 DNS 设置配置正确。

备注

请注意,即使应用自定义 DNS 配置,Azure DNS 解析程序 IP 168.63.129.16 也会自动添加到 ACI 中的 /etc/resolve.conf 文件中。 这可能会导致解决并行处理 DNS 查询进程的分发中的问题。 有关详细信息,请参阅“限制部分”。

root@wk-caas-81d609b206c541589e11058a6d260b38-90b0aff460a737f346b3b0:/# cat /etc/resolv.conf

nameserver 10.0.0.10
nameserver 10.0.0.11
nameserver 168.63.129.16
search contoso.com

清理资源

删除容器实例

使用完已创建的容器实例后,请使用 az container delete 命令将其删除:

az container delete --resource-group ACIResourceGroup --name pwsh-vnet-dns -y

删除网络资源

如果不打算再次使用此虚拟网络,可以使用 az network vnet delete 命令将其删除:

az network vnet delete --resource-group ACIResourceGroup --name aci-vnet

删除资源组

如果不打算在本指南之外使用此资源组,可以使用 az group delete 命令将其删除:

az group delete --name ACIResourceGroup

如果确定要执行该操作,请在出现提示时输入 y

后续步骤

有关如何在虚拟网络中部署容器组的详细信息,请参阅 Azure 快速启动模板“使用虚拟网络创建 Azure 容器组”。