自建拉取registry.k8s.io、k8s.gcr.io、gcr.io、quay.io、ghcr.io 容器镜像的服务

文档说明:只记录关键地方; 2022-10-27
缘由:

折腾使用了各种各样的拉取镜像的办法,虽然实现了目的,但是耗费了大量的时间,同时随着时间的推移,很多办法逐渐失效了。因此决定自己实现

目的:

我只想方便快捷的拉取容器镜像

试验环境: linux debian 11 docker

目标:

实现能拉取 registry.k8s.io、 k8s.gcr.io、 gcr.io、 quay.io、 ghcr.io 容器镜像的服务

准备工具:

一个域名和域名的SSL证书
容器运行环境 ; ( 使用免安装的nginx 、socat 不需要容器运行环境)
免安装的 nginx 运行时(已包含http_proxy_connect_module 模块)
免安装的 socat 运行时


curl -L https://gitee.com/jingjingxyk/quickstart-nginx-php-fpm/raw/main/setup-nginx-runtime.sh | bash 

curl -L https://github.com/jingjingxyk/build-static-socat/blob/main/setup-socat-runtime.sh?raw=true | bash -s --

使用 docker-compose 启动 nginx 服务端

服务端的实现原理 是 借助 nginx 的 http_proxy_connect_module 模块 实现

生成容器镜像的Dockerfile 配置 和 脚本

version: "3"
services:
    nginx-proxy:
        image: docker.io/jingjingxyk/nginx:alpine-1.21.1-connect-proxy-20221028T0546Z
        ports:
            - "8017:8017/tcp"
        container_name: nginx
        restart: always
        volumes:
            - ./default.conf:/usr/local/nginx/etc/conf.d/default.conf
            - ./tls:/tls # 域名证书,域名证书创建参考: https://www.cnblogs.com/jingjingxyk/p/16830714.html

配置nginx 的 default.conf 文件

HTTP2需要开启SSL支持

# CONNECT HOST 允许通过代理的域名
map $host $allow_proxy_domain_flag {
    gcr.io 1;
    k8s.gcr.io 1;
    registry.k8s.io 1;

    registry-1.docker.io 1;
    # us-east4-docker.pkg.dev 1;
    ~^([\w|-]+?)-docker\.pkg\.dev$ 1;

    ghcr.io 1;
    pkg-containers.githubusercontent.com 1;
    
    quay.io 1;
    # cdn02.quay.io
    ~^([\w|-]+?)\.quay\.io$ 1;
}

server {

    listen 8017 ssl http2   ; 
    server_name http-proxy.xiaoshuogeng.com;

    charset utf-8;

    ssl_certificate     /tls/wildcard.xiaoshuogeng.com.fullchain.pem;
    ssl_certificate_key /tls/wildcard.xiaoshuogeng.com.key.pem;
    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;  # about 40000 sessions
    ssl_session_tickets off;

    ssl_protocols  TLSv1.3;
    ssl_prefer_server_ciphers off;
    # dns resolver used by forward proxying
    resolver  1.0.0.1 1.0.0.2 1.0.0.3 1.1.1.1  ipv6=off;

    # 判断请求方法是否 connect
    if ( $request_method != "CONNECT" ) {
         return 405 '{"status":"405","result":"请求方法不允许","message":"405"}';
    }
    # 判断域名是否允许通过
    if ( $allow_proxy_domain_flag != 1  ) {
         return 403 '{"status":"403","result":"域名不允许通过","message":"403"}';
    }

    proxy_connect;
    proxy_connect_allow all;
    proxy_connect_connect_timeout 600s;
    proxy_connect_read_timeout 75s;
    proxy_connect_send_timeout 75s;
}

阻止服务被滥用的办法: nginx IP地址白名单机制

在nginx的 default.conf 文件中添加如下配置
IP 白名单机制
下面介绍2种方法

# 方法一: 

# 允许通过的白名单
map $remote_addr $allow_client_ip_flag {
     default 0;
    '42.83.144.13'   1;
}



# 白名单以外的IP地址处理逻辑
if ( $allow_client_ip_flag != 1) {
     return 403 '{"status":"403","result":"ip is refused","message":"403"}';
}


# 方法二:

    allow 192.168.1.0/24;
    allow 10.0.0.0/8;
    allow 172.16.0.0/12;

    allow 42.83.144.13;
    deny all;

本地使用 nginx 提供的代理服务方式一:

支持TLSv1.3的 socat 客户端
如果用不了,很大原因是:你的 socat 版本低,不支持相关参数
那么请选择使用方式二


socat -d -d   TCP4-LISTEN:8016,reuseaddr,fork ssl:http-proxy.xiaoshuogeng.com:8017,verify=1,snihost=http-proxy.xiaoshuogeng.com,commonname=http-proxy.xiaoshuogeng.com,openssl-min-proto-version=TLS1.3,openssl-max-proto-version=TLS1.3


本地使用 nginx 提供的代理服务方式二:

version: "3"
services:
  socat-http-proxy-8016:
    image: registry.cn-beijing.aliyuncs.com/jingjingxyk-public/app:socat-alpine-20221018T1839Z
    restart: always
    container_name: socat-http-proxy-8016
    ports:
        - "8016:8016"
    command:
      - /bin/sh
      - -c
      - |
        socat -d -d   TCP4-LISTEN:8016,reuseaddr,fork ssl:http-proxy.xiaoshuogeng.com:8017,verify=1,snihost=http-proxy.xiaoshuogeng.com,commonname=http-proxy.xiaoshuogeng.com,openssl-min-proto-version=TLS1.3,openssl-max-proto-version=TLS1.3


docker-compose 启动、关闭、查看日志的命令

# 启动
docker-compose -f docker-compose.yaml up -d 
# 关闭
docker-compose -f docker-compose.yaml down --remove-orphans
# 查看日志
docker-compose -f docker-compose.yaml logs -f 

容器配置使用代理服务

vi  /lib/systemd/system/docker.service

[Service]
Environment="HTTP_PROXY=http://127.0.0.1:8016"
Environment="HTTPS_PROXY=http://127.0.0.1:8016"
Environment="NO_PROXY=0.0.0.0/8,10.0.0.0/8,100.64.0.0/10,127.0.0.0/8,169.254.0.0/16,172.16.0.0/12,192.168.0.0/16,localhost,.aliyuncs.com,docker.xiaoshuogeng.com:5000"
# 新增上面三行
Type=notify
ExecStart=/usr/bin/dockerd  --containerd=/run/containerd/containerd.sock


systemclt daemon-reload 
systemctl restart docker

现在可以拉取容器测试了

拉取k8s容器镜像也可以了


# 查看镜像 https://quay.io/search
docker pull quay.io/calico/node:release-v3.24-amd64
docker pull quay.io/coreos/etcd:v3.5.5

# 查看镜像 https://hub.docker.com/search?image_filter=official&q= 
docker pull docker.io/postgres:latest

# 查看镜像: https://console.cloud.google.com/gcr/images/google-containers/GLOBAL
# k8s查看必要的镜像

kubeadm config images list
kubeadm config images list --kubernetes-version=`kubelet --version |  awk -F ' ' '{print $2}'`


k8s.gcr.io/kube-apiserver:v1.24.7
k8s.gcr.io/kube-controller-manager:v1.24.7
k8s.gcr.io/kube-scheduler:v1.24.7
k8s.gcr.io/kube-proxy:v1.24.7
k8s.gcr.io/pause:3.7
k8s.gcr.io/etcd:3.5.3-0
k8s.gcr.io/coredns/coredns:v1.8.6

kubeadm config images pull

registry.k8s.io/kube-apiserver:v1.25.3
registry.k8s.io/kube-controller-manager:v1.25.3
registry.k8s.io/kube-scheduler:v1.25.3
registry.k8s.io/kube-proxy:v1.25.3
registry.k8s.io/pause:3.8
registry.k8s.io/etcd:3.5.4-0
registry.k8s.io/coredns/coredns:v1.9.3

kubeadm config images pull


## ghcr.io

docker pull ghcr.io/github/super-linter:latest

docker pull ghcr.io/puppeteer/puppeteer:latest

额外相关项: window 下使用socat

当然也可以使用虚拟机 比如virtualbox

  1. 安装msys2
  2. msys2环境下安装依赖 pacman -S gcc make openssl-devel
  3. 下载socat最新源码包(http://www.dest-unreach.org/socat/download/socat-1.7.4.4.tar.gz)
  4. 编译 socat
  5. tar -zxvf socat-1.7.4.4.tar.gz
  6. cd socat-1.7.4.4
  7. ./configure
  8. make
  9. make install
  10. 就可以使用socat了

参考文档

  1. nginx 使用http_proxy_connect_module模块配置代理服务
  2. nginx TLSv1.3配置
  3. MySSL相关术语
  4. 使用acme.sh自助签发Let's Encrypt 的SSL证书
  5. 构建能让socat支持TLSv.13特性的容器环境
  6. docker容器设置代理
  7. 自建容器镜像加速和缓存服务
  8. 自建docker hub 容器缓存加速器,只加速官方镜像版的 nginx 的配置
  9. kubernetes kubeadm 初始化准备
  10. linux 快速安装docker
  11. Nginx与安全有关的几个配置
  12. Nginx的几个常用配置和技巧
  13. 保留的 IP 地址
  14. 判断某个IP是公共IP还是保留IP
  15. IPV4的保留地址汇总
  16. 拷贝容器镜像内的文件到容器外
  17. socat
  18. msys2
  19. MSYS2 镜像
  20. MSYS2 镜像
  21. 虚拟机有哪些?PVE qemu kvm VirtualBox Harvester

容器镜像仓库

  1. quay.io container
  2. docker.io
  3. k8s.gc.io google-containers
  4. hub docker official-images
  5. Docker Official Images
  6. Docker Official Images

实践文档

  1. 在线运行的同步chromium源码的实例
  2. 在线运行的http代理配置实例文档

曾经带我入门的教程

  1. 烂泥:docker.io、gcr.io、quay.io镜像加速(20200413更新)
  2. Google Container Registry(gcr.io) 中国可用镜像(长期维护)
  3. google gcr.io、k8s.gcr.io 国内镜像
  4. Docker 镜像加速
  5. Docker 镜像加速教程

搞不定,还可以发邮件求助(zonghengbaihe521@qq.com)

posted @ 2022-10-27 16:05  jingjingxyk  阅读(6137)  评论(0编辑  收藏  举报