一、背景
-
时间发现
就在事件发生前几天(20240529),服务器无法登陆了,询问运维给的回复是“违规提供域名解析”,我为了方便在家里调试,将 K8S 的 CoreDNS 透出。告知运维是 K8S 内部 DNS,尝试申请解封。3 天后解封立马在防火墙中去掉 53 端口,并且在 Apisix 网关中不进行转发。
-
痛苦调试
解封后发现好多 Pod 无法,在 K3S 中配置镜像等,也无法启动,现实是最新的镜像无法拉取(可能因为在 containerd 配置了镜像)。问题查了好几天睡不好觉,放弃了。
-
得知真相
在 2024 年 06 月的某一天,国内已要求所有提供镜像站和镜像加速服务的机构停止其服务。
在某群里面看到一个付费的服务有在讨论得到真相。也明白了事情缘由。
二、解决方法
2.1 使用公共镜像
风险:可能会随时面临失效
-
public-image-mirror 项目(不推荐、已限流)
源站 替换为 cr.l5d.io l5d.m.daocloud.io docker.elastic.co elastic.m.daocloud.io docker.io docker.m.daocloud.io gcr.io gcr.m.daocloud.io ghcr.io ghcr.m.daocloud.io k8s.gcr.io k8s-gcr.m.daocloud.io registry.k8s.io k8s.m.daocloud.io mcr.microsoft.com mcr.m.daocloud.io nvcr.io nvcr.m.daocloud.io quay.io quay.m.daocloud.io registry.jujucharms.com jujucharms.m.daocloud.io rocks.canonical.com rocks-canonical.m.daocloud.io
2.2 使用 Github Action 同步到阿里云
优点:可以同步大于 40G 的镜像
2.3 使用 Cloudflare Workers 进行转发
个人使用强烈推荐该方式
前提条件:
-
拥有自己的域名(阿里云或者其他的域名,需要配置 DNS 服务器配置 CF 的)
- 可以使用 hosts 绑定 Works 域名,免于绑定自己的域名(待验证,需自己尝试。我是为了方便,注册了一个域名,也不贵)
-
免费版每天有 10 万次免费请求,并且有每分钟 1000 次请求的限制,每个请求最多占用 10 毫秒 CPU 时间。超过限制后,会返回错误。
- 每月 $5 的高级版本,每月可用 1000 万次请求(超出部分 $.5/百万次请求),每个请求最多占用 50 毫秒 CPU 时间。
个人使用免费版足够了,镜像下载的网络路径,支持配置多个源,可以自定义规则。
+-----------+ +-------------+ +--------------+
| +----->+ Cloudflare +---->+ |
| Client | | Workers | | [Docker Hub] |
| +<-----+ [CDN] +<----+ |
+-----------+ +-------------+ +--------------+
-
- 推荐点:支持自定义多种不同的源
-
- 推荐点:同上,同一个大佬开发。也支持不同的源和前缀。
-
hammal 项目
- 推荐点:稳定可靠。
2.4 自建镜像加速服务
可以使用 reigistry
、 harbor
和 Nexus
进行创建,需要部署的服务器有办法拉取到镜像
reigistry
创建 docker-compose 文件
#version: '3' #最新版本docker 不在需要此字段
services:
registry:
image: registry:2
ports:
- "15000:5000"
environment:
REGISTRY_PROXY_REMOTEURL: https://registry-1.docker.io # 上游源
REGISTRY_STORAGE_CACHE_BLOBDESCRIPTOR: inmemory # 内存缓存
volumes:
- ./data:/var/lib/registry
需要注意的是如果仅仅作为镜像源,需要把 push 功能 ban 掉,推荐使用 nginx 反代的时候禁止其他 http method
server {
listen 80;
server_name my-registry-domain.com;
location / {
# 仅允许 GET 请求
limit_except GET {
deny all;
}
proxy_pass http://localhost:5000; # 实际 Docker 运行在本地的端口
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
harbor
harbor 的定位是一个私有镜像仓库,需要 pull 后才能 pull,没有达到自动下载的目的,没有安装尝试,网上教程也很多,不展开介绍。
三、各端配置
3.1 K3S
K3S 中镜像代理需要开始 --embedded-registry
标,Version 大于 2024 年 1 月份发布的版本。
The Embedded Registry Mirror is available as an experimental feature as of January 2024 releases: v1.26.13+k3s1, v1.27.10+k3s1, v1.28.6+k3s1, v1.29.1+k3s1
相关查看文档 Embedded Registry Mirror Private Registry Configuration
-
修改配置文件
vim /etc/rancher/k3s/registries.yaml
mirrors: "docker.io": endpoint: - "https://docker.proxy.xx" # 你要镜像的地址 "k8s.gcr.io": endpoint: - "https://lank8s.cn" # 你要镜像的地址 configs: "docker.io": tls: insecure_skip_verify: true # 私有镜像忽略 SSL 校验(可选),如不确定不要开启
-
手动 pull mirror 镜像到本地
docker pull registry.example.com:5000/rancher/mirrored-pause:3.6
-
打标
docker tag registry.example.com:5000/rancher/mirrored-pause:3.6 docker.io/rancher/mirrored-pause:3.6
-
重启 K3S
systemctl restart k3s.service # Master 上执行 systemctl restart k3s-agent.service # Agent 上执行
3.2 Docker
-
修改
/etc/docker/daemon.json
{ "registry-mirrors": [ "https://docker.proxy.xx", # 你要镜像的地址 "https://mirror.baidubce.com" ] }
-
重启
sudo systemctl daemon-reload sudo systemctl restart docker
三、思考
以前只觉得 Cloudflare 提供的真人验证场景,或多或少也听过一些其他免费的功能,这一次让我大开眼界,收益匪浅。
据说后续 Github CDN 镜像,NPM,Python PIP,OpenWrt OPKG 等未受内容审查的镜像服务器同样也会被下架。可能会有许多收费镜像服务。
评论区