使用cr-diagnosis排查镜像推送与拉取异常

更新时间:
复制 MD 格式

cr-diagnosis是面向 ACR 企业版实例的命令行诊断工具。在从 ACR 企业版实例拉取镜像过程中出现问题,且难以判断问题原因的场景中,cr-diagnosis可以执行完整诊断流程,输出结构化诊断报告,快速锁定故障根因。

工具介绍

诊断模式

cr-diagnosis通过提供 DNS 测试、域名连通性测试、自动抓包分析以及镜像拉取验证,快速定位网络连通性、凭据及权限问题。

针对不同的问题场景,cr-diagnosis提供了四种不同的测试:

  • DNS 测试:查询实例域名的解析记录,检测域名解析是否正常。

  • 连通性测试:测试实例域名的连通性,验证 DNS 解析 IP 与实际连接 IP 是否一致。

  • 认证测试:模拟客户端发起镜像拉取请求,分析推拉凭据及 RAM 权限问题。

  • 抓包分析:对ACR服务域名进行抓包分析,检测网络问题。

    连通性测试失败时触发,用户确认后才会执行。

以上四种测试可以通过两种诊断模式执行:

对比项

网络分析模式(通过-m network参数指定)

默认模式(完整诊断)

适用场景

出现request canceled while waiting for connectionno such host等网络和DNS错误。

  • 出现401 Unauthorizedincorrect username or password403 Forbidden 等认证错误。

  • 出现其他无法确定故障原因的错误。

诊断测试

按顺序执行下列测试:

  1. DNS测试

  2. 连通性测试

  3. 抓包分析

按顺序执行下列测试:

  1. DNS测试

  2. 连通性测试

  3. 认证测试

  4. 抓包分析

安全性保证

  • 所有网络请求均为 GET、HEAD 只读操作,不会修改系统配置和存储数据。

  • cr-diagnosis不会存储任何凭据信息,测试过程中仅通过 HTTPS 请求向 ACR 实例发起访问。

  • 进行抓包分析时,cr-diagnosis会精确捕获与诊断目标相关的流量,不获取其他网络活动的信息。

快速开始

  1. 下载cr-diagnosis的预编译二进制文件:

    平台

    架构

    下载链接

    Linux

    AMD64

    cr-diagnosis-linux-amd64

    ARM64

    cr-diagnosis-linux-arm64

    macOS

    AMD64 (Intel)

    cr-diagnosis-darwin-amd64

    ARM64 (Apple Silicon)

    cr-diagnosis-darwin-arm64

  2. 将下方命令中的CR_DIAGNOSIS替换为实际下载的文件名称后执行,添加执行权限:

    chmod +x CR_DIAGNOSIS
  3. 将文件移动到/usr/local/bin目录中:

    mv CR_DIAGNOSIS /usr/local/bin/cr-diagnosis
  4. 验证安装效果:

    cr-diagnosis --help

    预期输出:

    CR-Diagnosis is a comprehensive tool for diagnosing alibaba cloud container registry connectivity and authentication issues.
    It can test DNS resolution, connectivity, authentication flows, and perform packet capture when issues are detected.
    
    Version: v1.0.0-9b51984c
    ...
  5. 工具安装完成后,执行诊断:

    网络分析模式

    使用网络分析模式进行诊断。将下方命令中的ACR_DOMAIN替换为ACR企业版实例的域名后执行。

    cr-diagnosis -m network ACR_DOMAIN

    诊断完成后,根据工具输出的报告判断具体问题。

    请参见典型问题诊断示例,查看部分常见问题的诊断输出。

    默认模式(完整诊断)

    使用默认模式并结合凭据执行完整诊断。将下方命令中的参数替换为实际值后执行:

    • USERNAME:ACR实例访问凭据的用户名。

    • PASSWORD:ACR实例访问凭据的密码。

    • ACR_DOMAIN:ACR实例域名。

    • /NAMESPACE/IMAGE_NAME:TAG:镜像的命名空间、名称和标签。

    cr-diagnosis -u USERNAME -p PASSWORD ACR_DOMAIN /NAMESPACE/IMAGE_NAME:TAG

    诊断完成后,根据工具输出的报告判断具体问题。

    请参见典型问题诊断示例,查看部分常见问题的诊断输出。

典型问题诊断示例

DNS 解析失败

问题现象:域名无法解析,docker pull 报错 no such host

诊断命令

cr-diagnosis -m network ACR_DOMAIN

诊断输出

...

[DNS] DNS-RESOLVER
├─ [ERROR] Error: no such host

[WARN] DIAGNOSIS COMPLETE - Some checks failed

结果解读:DNS 解析失败,域名无法解析为 IP 地址。后续连通性测试和认证测试阶段已跳过。

修复建议

  • 如果使用内网域名,请确认实例是否已配置专有网络的访问控制

  • 检查当前环境的 DNS 配置是否正常,可尝试使用 nslookupdig 命令手动解析域名。

网络丢包或延迟(抓包分析)

问题现象:镜像拉取间歇性失败,怀疑存在网络丢包或延迟,无法判断具体原因。

诊断命令

cr-diagnosis -y -c --save-pcap ./capture.pcap ACR_DOMAIN

诊断输出

═══════════════════════════════════════════════════════════════
                       PACKET CAPTURE REPORT                      
═══════════════════════════════════════════════════════════════
  [Capture Info]
    Interface: en0
    Duration: 10.001s
    Target Domains: xxx.cr.aliyuncs.com
    Target IPs: 8.xxx.xxx.xxx
  [Packet Statistics]
    Total Packets: 5
    Total Bytes: 390
    TCP Packets: 5
    UDP Packets: 0
    DNS Packets: 0
    TLS Packets: 0
  [TCP Handshake]
    SYN: 5, SYN-ACK: 0, RST: 0, FIN: 0
    Attempts: 1, Succeeded: 0, Failed: 0
  [Key Packets]
    15:07:29.873 30.xxx.xxx.xxx:61593 -> 8.xxx.xxx.xxx:443 [SYN] TCP Handshake: SYN
    15:07:30.872 30.xxx.xxx.xxx:61593 -> 8.xxx.xxx.xxx:443 [SYN] TCP Handshake: SYN
    15:07:31.874 30.xxx.xxx.xxx:61593 -> 8.xxx.xxx.xxx:443 [SYN] TCP Handshake: SYN
    15:07:32.874 30.xxx.xxx.xxx:61593 -> 8.xxx.xxx.xxx:443 [SYN] TCP Handshake: SYN
    15:07:33.874 30.xxx.xxx.xxx:61593 -> 8.xxx.xxx.xxx:443 [SYN] TCP Handshake: SYN
  [Diagnosis]
    SYN packets sent but no SYN-ACK received. Target may be unreachable or firewalled. | TCP handshake failed. Check network connectivity and firewall rules.

结果解读:TCP 握手过程中持续发送 SYN 包但未收到 SYN-ACK 响应,表明目标不可达或存在防火墙拦截。可能的原因包括:实例入口访问控制阻止了连接、网络链路存在丢包或限速。

修复建议

  • 检查 ACR 实例的网络访问控制策略,确认当前 IP 是否已列入白名单。

  • 使用保存的 pcap 文件通过 Wireshark 等工具进行深入分析。

  • 检查网络链路是否存在瓶颈或拥塞。

  • 确认是否存在网络限速策略。

认证失败(凭据错误)

问题现象:网络连通正常,但认证测试不通过。

诊断命令

cr-diagnosis -u USERNAME -p PASSWORD ACR_DOMAIN /NAMESPACE/IMAGE_NAME:TAG

诊断输出

[AUTH] AUTH-FLOW
├─ [ERROR] token request with credentials failed: token request failed with status 401: {"error":"incorrect username or password"}
├─ Realm Domain: dockerauth.cn-hangzhou.aliyuncs.com
│  ├─ Actual IP: 120.xxx.xxx.xxx (IPv4)
│  └─ [OK] IP Match
├─ Token Request: [WARN] 401 Unauthorized
│  ├─ URL: https://dockerauth.cn-hangzhou.aliyuncs.com/auth?service=registry.aliyuncs.com:cn-hangzhou:china:cri-xxx9&scope=
│  └─ [ERROR] token request with credentials failed: token request failed with status 401: {"error":"incorrect username or password"}

结果解读:认证服务可达,但使用凭据获取 Token 失败(HTTP 401),返回错误信息 incorrect username or password,说明用户名或密码不正确。

修复建议

  • 确认用户名和密码是否正确。

  • 若使用临时凭据,确认凭据未过期。

权限不足

问题现象:认证测试通过,但无法拉取镜像。

诊断命令

cr-diagnosis -y -u USERNAME -p PASSWORD ACR_DOMAIN /NAMESPACE/IMAGE_NAME:TAG

诊断输出

[AUTH] AUTH-FLOW
├─ Realm Domain: dockerauth-xxx.aliyuncs.com
├─ Anonymous Token Test: [OK] 200 OK
├─ Token Request: [OK] 200 OK
├─ Token Validation: [ERROR] 403 Forbidden
│  └─ [ALERT] Insufficient permissions for the target resource

[WARN] DIAGNOSIS COMPLETE - Some checks failed

结果解读:凭据有效且认证成功(Token Request 返回 200),但在验证 Token 访问目标资源时返回 403 Forbidden,说明当前凭据无权访问目标资源。

修复建议

  • 确认命名空间和镜像名称拼写正确。

  • 检查 RAM 用户的权限策略,确认用户是否拥有 cr:PullRepositorycr:PushRepositoryACR相关权限。如果尚未配置权限,请参见管理权限策略授权更新授权配置。

cr-diagnosis 参数参考

参数

类型

必填

默认值

说明

实例域名

string

-

ACR 企业版实例域名,可附加命名空间、镜像名称和标签(格式:<域名>[/<命名空间>/<镜像>:<标签>]

-u

string

-

ACR 实例访问凭据用户名

-p

string

-

ACR 实例访问凭据密码

-m

string

不指定(完整诊断)

诊断模式,可选值:network(仅网络层面诊断)

-y

flag

false

跳过所有确认提示

-c

flag

false

启用抓包分析(连通性测试失败时触发,用户确认后才会执行)

--save-pcap

string

./capture.pcap

抓包分析结果保存路径