在 Azure 虚拟网络中,可以使用 Azure CLI 中的 az container create
命令部署容器组。 还可以使用 YAML 配置文件向 az container create
命令提供高级配置设置。
本文演示如何使用 YAML 配置文件通过自定义 DNS 设置部署容器组。
有关将容器组部署到虚拟网络的详细信息,请参阅在虚拟网络中部署一文。
一个有效的 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 概述中了解这些区域。
如果有满足这些条件的现有虚拟网络,可以跳到部署容器组。
提示
可以根据需要使用自己的信息修改以下命令。
使用 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
使用 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
记录此命令的输出中的子网 ID 键值对。 稍后在 YAML 配置文件中使用此键值对。 它采用
"id"
:"/subscriptions/<subscription-ID>/resourceGroups/ACIResourceGroup/providers/Microsoft.Network/virtualNetworks/aci-vnet/subnets/aci-subnet"
形式。使用 az network private-dns zone create 命令创建专用 DNS 区域。
az network private-dns zone create -g ACIResourceGroup -n private.contoso.com
使用 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"
。
将以下 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 容器组”。