侧边栏壁纸
博主头像
另起一行(hang)博主等级

胡编一通,乱写一气

  • 累计撰写 28 篇文章
  • 累计创建 29 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

解决方案 | Docker 国内镜像被封禁问题

Wissy
2024-06-27 / 0 评论 / 1 点赞 / 439 阅读 / 6404 字

一、背景

  • 时间发现

    就在事件发生前几天(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 的镜像

参考地址(原址)

参考地址(Archive)

2.3 使用 Cloudflare Workers 进行转发

个人使用强烈推荐该方式

前提条件:

  • 拥有自己的域名(阿里云或者其他的域名,需要配置 DNS 服务器配置 CF 的)

    • 可以使用 hosts 绑定 Works 域名,免于绑定自己的域名(待验证,需自己尝试。我是为了方便,注册了一个域名,也不贵)
  • 免费版每天有 10 万次免费请求,并且有每分钟 1000 次请求的限制,每个请求最多占用 10 毫秒 CPU 时间。超过限制后,会返回错误。

    • 每月 $5 的高级版本,每月可用 1000 万次请求(超出部分 $.5/百万次请求),每个请求最多占用 50 毫秒 CPU 时间。

个人使用免费版足够了,镜像下载的网络路径,支持配置多个源,可以自定义规则。

+-----------+      +-------------+     +--------------+
|           +----->+  Cloudflare +---->+              |
|  Client   |      |   Workers   |     | [Docker Hub] |
|           +<-----+    [CDN]    +<----+              |
+-----------+      +-------------+     +--------------+                       

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

  1. 修改配置文件

    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 校验(可选),如不确定不要开启
    
  2. 手动 pull mirror 镜像到本地

    docker pull registry.example.com:5000/rancher/mirrored-pause:3.6

  3. 打标

    docker tag registry.example.com:5000/rancher/mirrored-pause:3.6 docker.io/rancher/mirrored-pause:3.6

  4. 重启 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 等未受内容审查的镜像服务器同样也会被下架。可能会有许多收费镜像服务。

1
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区