Compartir a través de

使用自定义 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 容器组”。