自建拉取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 服务端
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
- 安装msys2
- msys2环境下安装依赖 pacman -S gcc make openssl-devel
- 下载socat最新源码包(
http://www.dest-unreach.org/socat/download/socat-1.7.4.4.tar.gz
) - 编译 socat
- tar -zxvf socat-1.7.4.4.tar.gz
- cd socat-1.7.4.4
- ./configure
- make
- make install
- 就可以使用socat了
参考文档
- nginx 使用http_proxy_connect_module模块配置代理服务
- nginx TLSv1.3配置
- MySSL相关术语
- 使用acme.sh自助签发Let's Encrypt 的SSL证书
- 构建能让socat支持TLSv.13特性的容器环境
- docker容器设置代理
- 自建容器镜像加速和缓存服务
- 自建docker hub 容器缓存加速器,只加速官方镜像版的 nginx 的配置
- kubernetes kubeadm 初始化准备
- linux 快速安装docker
- Nginx与安全有关的几个配置
- Nginx的几个常用配置和技巧
- 保留的 IP 地址
- 判断某个IP是公共IP还是保留IP
- IPV4的保留地址汇总
- 拷贝容器镜像内的文件到容器外
- socat
- msys2
- MSYS2 镜像
- MSYS2 镜像
- 虚拟机有哪些?PVE qemu kvm VirtualBox Harvester
容器镜像仓库
- quay.io container
- docker.io
- k8s.gc.io google-containers
- hub docker official-images
- Docker Official Images
- Docker Official Images
实践文档
曾经带我入门的教程
- 烂泥:docker.io、gcr.io、quay.io镜像加速(20200413更新)
- Google Container Registry(gcr.io) 中国可用镜像(长期维护)
- google gcr.io、k8s.gcr.io 国内镜像
- Docker 镜像加速
- Docker 镜像加速教程