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-node 是 kubeovn 组织的私有包,你的 zbb88888 PAT 没有访问权限。
两种解法:
| 方案 | 优点 | 缺点 |
|---|---|---|
Mirror 到 ghcr.io/zbb88888/kindest-node | 完全绕过 rate limit,与上游设计一致 | 需要先手动跑一次 mirror workflow |
直接从 Docker Hub 拉 kindest/node | 简单,无需 mirror | 在高并发 CI 时可能被限流 |