对容器应用进行故障排除

查看 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

查看日志

查找容器应用问题时要采取的第一步是查看日志消息。 可以查看控制台和系统日志的输出。 容器应用的控制台日志会捕获应用的 stdoutstderr 流。 容器应用为服务级别事件生成系统日志

  1. 登录 Azure 门户
  2. 在“搜索”栏中,输入容器应用的名称。
  3. 在“资源”部分下,选择容器应用的名称。
  4. 在左侧导航栏中,展开“监视”,然后选择“日志流”(而非“日志”)。
  5. 如果“日志流”页显示“此修订将缩放为零。”,请选择“转到修订管理”按钮。 部署缩放到最小副本计数为 1 的新修订。 有关详细信息,请参阅 Azure 容器应用中的缩放
  6. 在“日志流”页中,将“日志”设置为“控制台”或“系统”。

使用诊断和解决问题工具

可以使用诊断和解决问题工具来查找容器应用的运行状况、配置和性能问题。

  1. 登录 Azure 门户
  2. 在“搜索”栏中,输入容器应用的名称。
  3. 在“资源”部分下,选择容器应用的名称。
  4. 在导航窗格中,选择“诊断并解决问题”。
  5. 在“诊断并解决问题”页中,选择故障排除类别之一。
  6. 选择导航栏中的一个类别,以查找解决容器应用问题的方法。

验证容器映像的可访问性

如果在尝试部署新修订时收到错误消息,请确认容器应用能够拉取容器映像。

  • 确保容器环境防火墙不会阻止访问容器注册表。 有关详细信息,请参阅使用用户定义的路由控制出站流量
  • 如果现有 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 容器应用环境中的网络

查看入口配置

容器应用的入口设置是通过一组规则实施的,这些规则控制如何将外部和内部流量路由到容器应用。 如果无法连接到容器应用,请查看这些入口设置,确保入口设置不会阻止请求。

  1. 登录 Azure 门户
  2. 在“搜索”栏中,输入容器应用的名称。
  3. 在“资源”下,选择容器应用的名称。
  4. 在导航栏中,展开“设置”并选择“入口”。
问题 操作
入口是否启用? 确认已选中“启用”复选框。
是否允许外部入口? 确认“入口流量”设置为“接受来自任何位置的流量”。 如果容器应用不侦听 HTTP 流量,请将“入口流量”设置为“仅限容器应用环境”。
客户端是否使用 HTTP 或 TCP 访问容器应用? 确认“入口类型”已设置为正确的协议(HTTPTCP)。
客户端是否支持 mTLS? 确认仅在客户端支持 mTLS 时才将“客户端证书模式”设置为“需要”。 有关详细信息,请参阅配置客户端证书身份验证。
客户端是否使用 HTTP/1 或 HTTP/2? 确认“传输”已设置为正确的 HTTP 版本(HTTP/1HTTP/2)。
目标端口是否已正确设置? 确认“目标端口”已设置为容器应用正在侦听的同一端口,或容器应用的 Dockerfile 公开的相同端口。
客户端 IP 地址是否被拒绝? 如果“IP 安全限制模式”未设置为“允许所有流量”,请确认客户端没有被拒绝的 IP 地址。

有关详细信息,请参阅 Azure 容器应用中的入口

检查网络配置

Azure 递归解析程序使用 IP 地址 168.63.129.16 解析请求。

  1. 如果 VNet 使用自定义 DNS 服务器而非默认 Azure 提供的 DNS 服务器,请将 DNS 服务器配置为将未解析的 DNS 查询转发给 168.63.129.16
  2. 配置 NSG 或防火墙时,请勿阻止 168.63.129.16 地址。

有关详细信息,请参阅 Azure 容器应用环境中的网络

检查运行状况探测配置

对于使用 TCP 作为传输的所有运行状况探测类型(运行情况、就绪情况和启动),请确认其端口号与为容器应用配置的入口目标端口匹配。

  1. 登录 Azure 门户
  2. 在“搜索”栏中,输入容器应用的名称。
  3. 在“资源”下,选择容器应用的名称。
  4. 在导航栏中,展开“应用程序”并选择“容器”。
  5. 在“容器”页中,选择“运行状况探测”。
  6. 展开“运行情况探测”、“就绪情况探测”和“启动探测”。
  7. 对于每个探测,请确认“端口”值正确。

更新“端口”值,如下所示:

  1. 选择“编辑和部署”以创建新的修订。
  2. 在“创建和部署新修订”页中,选中容器映像旁边的复选框,然后选择“编辑”。
  3. 在“编辑容器”窗口中,选择“运行状况探测”。
  4. 展开“运行情况探测”、“就绪情况探测”和“启动探测”。
  5. 对于每个探测,请编辑“端口”值。
  6. 选择保存按钮。
  7. 在“创建和部署新修订”页中,选择“创建”按钮。

为延长启动时间配置运行状况探测

如果启用了入口,则以下默认探测会自动添加到主应用容器(如果未为每个类型定义任何探测)。

下面是每个探测类型的默认值。

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 中很常见),则可能需要相应地自定义运行情况和就绪情况探测初始延迟秒属性。 可以查看日志以查看容器应用的典型启动时间。

  1. 登录 Azure 门户
  2. 在“搜索”栏中,输入容器应用的名称。
  3. 在“资源”下,选择容器应用的名称。
  4. 在导航栏中,展开“应用程序”并选择“容器”。
  5. 在“容器”页中,选择“运行状况探测”。
  6. 选择“编辑和部署”以创建新的修订。
  7. 在“创建和部署新修订”页中,选中容器映像旁边的复选框,然后选择“编辑”。
  8. 在“编辑容器”窗口中,选择“运行状况探测”。
  9. 展开“运行情况探测”。
  10. 如果选择“启用运行情况探测”,请增加“初始延迟秒”的值。
  11. 展开“就绪情况探测”。
  12. 如果选择“启用就绪情况探测”,请增加“初始延迟秒”的值。
  13. 选择“保存”。
  14. 在“创建和部署新修订”页中,选择“创建”按钮。

然后,可以查看日志以查看容器应用是否成功启动。

有关详细信息,请参阅使用运行情况探测

确认流量路由到正确的修订

如果容器应用的行为不符合预期,问题可能是请求被路由到过时的修订。

  1. 登录 Azure 门户
  2. 在“搜索”栏中,输入容器应用的名称。
  3. 在“资源”下,选择容器应用的名称。
  4. 在导航栏中,展开“应用程序”并选择“修订”。

如果“修订模式”设置为 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。

  1. 确定尝试删除的环境正在使用的 VNet。 将 <PLACEHOLDERS> 替换为你的值。

    az containerapp env show --resource-group <RESOURCE_GROUP> --name <ENVIRONMENT>
    

    在输出中,查找 infrastructureSubnetId 并记下 VNet ID。 例如,vNet::myVNet.id 便是一个 VNet ID。

  2. 手动删除 VNet:

    az network vnet delete --resource-group <RESOURCE_GROUP> --name <VNET_ID>
    
  3. 删除 Azure 容器应用环境:

    az containerapp env delete --resource-group <RESOURCE_GROUP> --name <ENVIRONMENT> --yes
    

后续步骤