GHCR 不会限速

4 阅读1分钟

GHCR: github container registry

对一下问题: Mirror kindest-node to GHCR 为什么一定要使用 GHCR 的镜像,是为了使用 github 缓存么?

不一定。让我看一下 master 分支的原始设计意图:

Ran terminal command: grep -n "kindest|GHCR|docker pull|docker hub" makefiles/kind.mk | head -30

Ran terminal command: git log --oneline --all | grep -i "mirror|kindest|ghcr" | head -10

原因清晰了:1039e1ae"move kind node image to ghcr to avoid throttling"

结论:使用 GHCR 镜像不是为了缓存,而是为了绕过 Docker Hub 的拉取频率限制(rate limiting)。

GitHub Actions runner 的出口 IP 是共享的,Docker Hub 对匿名/免费账号有 100次/6小时 的限制,多个 workflow 并发时很容易触发 429 Too Many Requests

所以架构是:

Docker Hub (kindest/node) ──[一次性镜像]──▶ ghcr.io/kubeovn/kindest-node  ──▶ CI 拉取

问题在于 ghcr.io/kubeovn/kindest-nodekubeovn 组织的私有包,你的 zbb88888 PAT 没有访问权限。

两种解法:

方案优点缺点
Mirror 到 ghcr.io/zbb88888/kindest-node完全绕过 rate limit,与上游设计一致需要先手动跑一次 mirror workflow
直接从 Docker Hub 拉 kindest/node简单,无需 mirror在高并发 CI 时可能被限流