Harbor Webhook 投递延迟或未发送

问题描述

在 Harbor 项目中发生事件后(例如推送镜像),配置的 Webhook 端点未能及时收到通知。症状包括:

  • Webhook 消费方(例如 CI/CD 流水线中的制品触发器)响应延迟很长(几分钟或更久),或者完全没有响应。
  • 在 Harbor UI → Job Service Dashboard 中,可以看到 WEBHOOK 作业在待处理队列中的数量不断增加。

根本原因

Harbor 通过以下路径投递 Webhook:

  1. harbor-core 会为每个事件将一个 key 入队到 Redis。
  2. harbor-jobservice 消费队列并调用已配置的 Webhook 端点。
  3. 如果 HTTP 调用失败,harbor-jobservice 会重试最多 10 次,然后才丢弃该事件。

以下两种常见情况会导致流水线积压:

  • 不可达的 Webhook 端点持续累积重试。 当项目中配置的一个或多个端点已不再可达时(例如服务已下线、URL 配置错误、防火墙规则变更),针对这些端点的每个事件都会消耗完全部 10 次重试后才被丢弃。如果存在足够多的无效端点,jobservice 大部分时间都会用来重试这些失效目标,正常的 Webhook 会排在它们后面等待。
  • harbor-jobservice 被重启(例如因 OOM 被杀死)。 如果 Pod 在内存压力下反复重启,正在执行的作业会被中断,队列会持续增长。

故障排查

步骤 1 - 检查 Job Service Dashboard

在 Harbor UI 中,打开 Job Service Dashboard,查看 Type = WEBHOOK 的作业。重点关注:

  • Pending Count —— 等待发送的 Webhook 作业数量。
  • Latency —— 最早的待处理作业已经等待了多长时间。

Pending Count 持续增长通常表明重试正在不断堆积。

步骤 2 - 检查 jobservice 健康状态

确认 harbor-jobservice 没有发生崩溃循环:

kubectl -n <NAMESPACE> get pods -l component=jobservice
kubectl -n <NAMESPACE> describe pod <RELEASE>-harbor-jobservice-xxxxx

如果在 Pod 状态中看到频繁重启,或者出现 OOMKilled 原因,说明 jobservice 资源不足。请在 Harbor CR 中增加其 CPU/内存 request 和 limit。

步骤 3 - 检查 jobservice 日志中的失败端点

kubectl -n <NAMESPACE> logs <RELEASE>-harbor-jobservice-xxxxx | grep -i webhook

如果同一个 URL 反复失败,说明该端点不可达,需要清理。

步骤 4 - 手动验证端点

从一个网络访问条件与 jobservice 类似的 Pod 中,测试受影响项目上配置的每个 Webhook URL:

curl -v -X POST <WEBHOOK_URL>

在这里超时或返回错误的 URL,都可以视为需要移除的候选项。

解决方案

1. 删除无效的 Webhook 配置

在 Harbor UI 中,打开受影响的项目 → Webhooks,删除在步骤 4 中识别出的所有不可达端点。这样可以阻止新的事件继续进入重试循环。

2. 清理卡住的队列

Job Service Dashboard 中,选中处于待处理状态的 WEBHOOK 作业并点击 STOP。完成后,WEBHOOKPending Count 应降为 0,正常事件即可恢复投递。

3. 如果队列未恢复,则重启 jobservice

如果停止作业后队列仍然卡住,请重启 harbor-jobservice

kubectl -n <NAMESPACE> rollout restart deployment <RELEASE>-harbor-jobservice

4. 重新评估 jobservice 资源规格

如果步骤 2 显示 Pod 发生了 OOMKilled,请提高 Harbor CR 中的资源限制,使 jobservice 有足够的内存处理其工作集。对于一个处于活跃使用状态的小型 Harbor,jobservice 通常至少需要 4 CPU / 8 Gi 内存 才能保持稳定。

注意事项

  • 即使采取了以上三种缓解措施,Webhook 投递仍然是尽力而为。消费者不能假设每个事件都会被送达——重试预算是有限的(10 次),超过后事件会被丢弃。
  • 在设计依赖 Harbor Webhook 的集成时,应优先使用具备幂等性的消费者,并定期基于 Harbor API 进行对账,而不要仅依赖单次通知。