对容器应用进行故障排除
查看 Azure 容器应用日志和配置设置可能会揭示容器应用不正常时的根本问题。 使用以下指南帮助查找和查看有关容器应用的详细信息。
方案
下表列出了在使用 Azure 容器应用时可能会遇到的问题,以及可以执行的解决操作。
场景 | 说明 | 操作 |
---|---|---|
所有情况 | 查看日志 使用诊断并解决问题 |
|
部署新修订时出错 | 尝试部署新修订时会收到错误消息。 | 确认容器应用可以拉取容器映像 |
预配时间过长 | 部署新修订后,新修订无限显示预配状态为正在预配,运行状态为正在处理。 | 确认运行状况探测已正确配置 |
修订已降级 | 预配新修订需要 10 分钟以上。 它最终的预配状态为已预配,但运行状态为已降级。 运行状态工具提示读取 Details: Deployment Progress Deadline Exceeded. 0/1 replicas ready. |
确认运行状况探测已正确配置 |
对终结点的请求失败 | 容器应用终结点不响应请求。 | 查看入口配置 |
请求返回状态 403 | 容器应用终结点以 HTTP 错误 403(访问被拒绝)响应请求。 | 确认网络配置正确 |
响应不符合预期 | 容器应用终结点响应请求,但响应不符合预期。 | 确认流量路由到正确的修订 确认在将映像部署到容器注册表时使用唯一标记 |
缺少参数错误 | 在 Azure CLI 中运行命令或从 Azure PowerShell 中的 Az.App 模块运行 az containerapp cmdlet 时,会收到有关缺少参数的错误消息。 |
验证是否已安装最新版本的 Azure 容器应用扩展 |
预览功能不可用 | 在 Azure CLI 中运行 az containerapp 命令时,预览功能不可用。 |
验证 Azure 容器应用扩展是否允许预览功能 |
删除应用或环境不起作用 | 此问题通常伴有 provisioningState: ScheduledForDelete 等消息。 | 手动删除关联的 VNet |
查看日志
查找容器应用问题时要采取的第一步是查看日志消息。 可以查看控制台和系统日志的输出。 容器应用的控制台日志会捕获应用的 stdout
和 stderr
流。 容器应用为服务级别事件生成系统日志。
- 登录 Azure 门户。
- 在“搜索”栏中,输入容器应用的名称。
- 在“资源”部分下,选择容器应用的名称。
- 在左侧导航栏中,展开“监视”,然后选择“日志流”(而非“日志”)。
- 如果“日志流”页显示“此修订将缩放为零。”,请选择“转到修订管理”按钮。 部署缩放到最小副本计数为 1 的新修订。 有关详细信息,请参阅 Azure 容器应用中的缩放。
- 在“日志流”页中,将“日志”设置为“控制台”或“系统”。
使用诊断和解决问题工具
可以使用诊断和解决问题工具来查找容器应用的运行状况、配置和性能问题。
- 登录 Azure 门户。
- 在“搜索”栏中,输入容器应用的名称。
- 在“资源”部分下,选择容器应用的名称。
- 在导航窗格中,选择“诊断并解决问题”。
- 在“诊断并解决问题”页中,选择故障排除类别之一。
- 选择导航栏中的一个类别,以查找解决容器应用问题的方法。
验证容器映像的可访问性
如果在尝试部署新修订时收到错误消息,请确认容器应用能够拉取容器映像。
- 确保容器环境防火墙不会阻止访问容器注册表。 有关详细信息,请参阅使用用户定义的路由控制出站流量。
- 如果现有 VNet 使用自定义 DNS 服务器而不是默认 Azure 提供的 DNS 服务器,请确认 DNS 服务器已正确配置,并且容器注册表的 DNS 查找不会失败。 有关详细信息,请参阅 DNS。
- 如果使用容器应用云生成功能为你生成容器映像(请参阅 Azure 容器应用的代码到云路径,则无法公开访问映像,因此这一部分不适用。
对于可作为控制台应用程序运行的 Docker 容器,请在提升的命令提示符中运行以下命令来验证映像是否可公开访问。 在运行以下命令之前,请将使用 <>
括起来的占位符替换为你的值。
docker run --rm <YOUR_CONTAINER_IMAGE>
验证 Docker 是否运行映像而不报告任何错误。 如果在 Windows 上运行 Docker,请确保 Docker 引擎在运行。
如果映像不可公开访问,可能会收到以下错误。
docker: Error response from daemon: pull access denied for <YOUR_CONTAINER_IMAGE>, repository does not exist or may require 'docker login azure --cloud-name AzureChinaCloud': denied: requested access to the resource is denied. See 'docker run --help'.
有关详细信息,请参阅 Azure 容器应用环境中的网络。
查看入口配置
容器应用的入口设置是通过一组规则实施的,这些规则控制如何将外部和内部流量路由到容器应用。 如果无法连接到容器应用,请查看这些入口设置,确保入口设置不会阻止请求。
- 登录 Azure 门户。
- 在“搜索”栏中,输入容器应用的名称。
- 在“资源”下,选择容器应用的名称。
- 在导航栏中,展开“设置”并选择“入口”。
问题 | 操作 |
---|---|
入口是否启用? | 确认已选中“启用”复选框。 |
是否允许外部入口? | 确认“入口流量”设置为“接受来自任何位置的流量”。 如果容器应用不侦听 HTTP 流量,请将“入口流量”设置为“仅限容器应用环境”。 |
客户端是否使用 HTTP 或 TCP 访问容器应用? | 确认“入口类型”已设置为正确的协议(HTTP 或 TCP)。 |
客户端是否支持 mTLS? | 确认仅在客户端支持 mTLS 时才将“客户端证书模式”设置为“需要”。 有关详细信息,请参阅配置客户端证书身份验证。 |
客户端是否使用 HTTP/1 或 HTTP/2? | 确认“传输”已设置为正确的 HTTP 版本(HTTP/1 或 HTTP/2)。 |
目标端口是否已正确设置? | 确认“目标端口”已设置为容器应用正在侦听的同一端口,或容器应用的 Dockerfile 公开的相同端口。 |
客户端 IP 地址是否被拒绝? | 如果“IP 安全限制模式”未设置为“允许所有流量”,请确认客户端没有被拒绝的 IP 地址。 |
有关详细信息,请参阅 Azure 容器应用中的入口。
检查网络配置
Azure 递归解析程序使用 IP 地址 168.63.129.16
解析请求。
- 如果 VNet 使用自定义 DNS 服务器而非默认 Azure 提供的 DNS 服务器,请将 DNS 服务器配置为将未解析的 DNS 查询转发给
168.63.129.16
。 - 配置 NSG 或防火墙时,请勿阻止
168.63.129.16
地址。
有关详细信息,请参阅 Azure 容器应用环境中的网络。
检查运行状况探测配置
对于使用 TCP 作为传输的所有运行状况探测类型(运行情况、就绪情况和启动),请确认其端口号与为容器应用配置的入口目标端口匹配。
- 登录 Azure 门户。
- 在“搜索”栏中,输入容器应用的名称。
- 在“资源”下,选择容器应用的名称。
- 在导航栏中,展开“应用程序”并选择“容器”。
- 在“容器”页中,选择“运行状况探测”。
- 展开“运行情况探测”、“就绪情况探测”和“启动探测”。
- 对于每个探测,请确认“端口”值正确。
更新“端口”值,如下所示:
- 选择“编辑和部署”以创建新的修订。
- 在“创建和部署新修订”页中,选中容器映像旁边的复选框,然后选择“编辑”。
- 在“编辑容器”窗口中,选择“运行状况探测”。
- 展开“运行情况探测”、“就绪情况探测”和“启动探测”。
- 对于每个探测,请编辑“端口”值。
- 选择保存按钮。
- 在“创建和部署新修订”页中,选择“创建”按钮。
为延长启动时间配置运行状况探测
如果启用了入口,则以下默认探测会自动添加到主应用容器(如果未为每个类型定义任何探测)。
下面是每个探测类型的默认值。
properties | 启动 | 就绪 | 运行情况 |
---|---|---|---|
协议 | TCP | TCP | TCP |
端口 | 入口目标端口 | 入口目标端口 | 入口目标端口 |
超时 | 3 秒 | 5 秒 | n/a |
周期 | 1 秒 | 5 秒 | n/a |
初始延迟 | 1 秒 | 3 秒 | n/a |
成功阈值 | 1 | 1 | n/a |
失败阈值 | 240 | 48 | n/a |
如果容器应用需要较长的时间才能启动(这在 Java 中很常见),则可能需要相应地自定义运行情况和就绪情况探测初始延迟秒属性。 可以查看日志以查看容器应用的典型启动时间。
- 登录 Azure 门户。
- 在“搜索”栏中,输入容器应用的名称。
- 在“资源”下,选择容器应用的名称。
- 在导航栏中,展开“应用程序”并选择“容器”。
- 在“容器”页中,选择“运行状况探测”。
- 选择“编辑和部署”以创建新的修订。
- 在“创建和部署新修订”页中,选中容器映像旁边的复选框,然后选择“编辑”。
- 在“编辑容器”窗口中,选择“运行状况探测”。
- 展开“运行情况探测”。
- 如果选择“启用运行情况探测”,请增加“初始延迟秒”的值。
- 展开“就绪情况探测”。
- 如果选择“启用就绪情况探测”,请增加“初始延迟秒”的值。
- 选择“保存”。
- 在“创建和部署新修订”页中,选择“创建”按钮。
然后,可以查看日志以查看容器应用是否成功启动。
有关详细信息,请参阅使用运行情况探测。
确认流量路由到正确的修订
如果容器应用的行为不符合预期,问题可能是请求被路由到过时的修订。
- 登录 Azure 门户。
- 在“搜索”栏中,输入容器应用的名称。
- 在“资源”下,选择容器应用的名称。
- 在导航栏中,展开“应用程序”并选择“修订”。
如果“修订模式”设置为 Single
,则默认情况下,所有流量都会路由到最新修订。 “活动修订”选项卡应仅列出一个“流量”值为 100%
的修订。
如果“修订模式”设置为 Multiple
,请确认未将流量路由到过时的修订。
有关配置流量拆分的详细信息,请参阅 Azure 容器应用中的流量拆分。
验证是否已安装最新版本的 Azure 容器应用扩展
如果你在 Azure CLI 中运行 az containerapp
命令或者在 Azure PowerShell 中运行 Az.App
模块中的 cmdlet 时收到有关缺少参数的错误,请确保你已安装了 Azure 容器应用扩展的最新版本。
az extension add --name containerapp --upgrade
验证 Azure 容器应用扩展是否允许预览功能
如果在 Azure CLI 中运行 az containerapp
命令时预览功能不可用,请在 Azure 容器应用扩展上启用预览功能。
az extension add --name containerapp --upgrade --allow-preview true
手动删除 Azure 容器应用环境正在使用的 VNet
如果收到消息 provisioningState: ScheduledForDelete,但环境无法实际删除,请确保手动删除关联的 VNet。
确定尝试删除的环境正在使用的 VNet。 将 <PLACEHOLDERS> 替换为你的值。
az containerapp env show --resource-group <RESOURCE_GROUP> --name <ENVIRONMENT>
在输出中,查找
infrastructureSubnetId
并记下 VNet ID。 例如,vNet::myVNet.id
便是一个 VNet ID。手动删除 VNet:
az network vnet delete --resource-group <RESOURCE_GROUP> --name <VNET_ID>
删除 Azure 容器应用环境:
az containerapp env delete --resource-group <RESOURCE_GROUP> --name <ENVIRONMENT> --yes