在 Kubernetes 集群中部署 Registry Proxy,自动帮助您使用镜像代理服务拉取新创建的 Pod 中的外网容器镜像(仅限公有镜像)。
适用场景:
- 无法拉取例如 K8s (registry.k8s.io) 、谷歌 (gcr.io) 等镜像;
- 龟速拉取例如 GitHub(ghcr.io)、RedHat(quay.io) 等镜像;
代理清单:
默认镜像代理服务支持的外网镜像仓库:
- docker.io
- registry.k8s.io
- quay.io
- ghcr.io
- gcr.io
- k8s.gcr.io
- docker.cloudsmith.io
执行以下命令安装 registry-proxy(v1.1.0+ 版本):
export VERSION=$(curl -s https://api.github.com/repos/ketches/registry-proxy/releases/latest | jq -r .tag_name)
kubectl apply -f https://raw.githubusercontent.com/ketches/registry-proxy/$VERSION/deploy/manifests.yaml
# 代理地址
kubectl apply -f https://ghproxy.ketches.cn/https://raw.githubusercontent.com/ketches/registry-proxy/$VERSION/deploy/manifests.yaml
registry-proxy 安装后自动创建 ConfigMap registry-proxy-config
,ConfigMap 内容为默认配置,可以通过修改 ConfigMap 来修改默认配置。
默认配置:
apiVersion: v1
kind: ConfigMap
metadata:
name: registry-proxy-config
namespace: registry-proxy
data:
config.yaml: |
enabled: true
proxies:
docker.io: docker.ketches.cn
registry.k8s.io: k8s.ketches.cn
quay.io: quay.ketches.cn
ghcr.io: ghcr.ketches.cn
gcr.io: gcr.ketches.cn
k8s.gcr.io: k8s-gcr.ketches.cn
docker.cloudsmith.io: cloudsmith.ketches.cn
excludeNamespaces:
- kube-system
- kube-public
- kube-node-lease
- registry-proxy
includeNamespaces:
- *
Notes:
- 默认使用 ketches/cloudflare-registry-proxy 镜像代理服务;
enabled
为true
时,开启 registry-proxy 代理功能,为false
时,关闭 registry-proxy 代理功能;- 默认排除
kube-system
、kube-public
、kube-node-lease
、registry-proxy
命名空间下的 Pod 容器镜像代理;- 修改上述配置实时生效,无需重启 registry-proxy;
- 可以自定义代理地址,例如:
docker.io: docker.m.daocloud.io
;- 可以去除代理地址,免去代理;
- 可以增加代理地址,例如:
mcr.microsoft.com: mcr.dockerproxy.com
;- 可以通过向 ketches/cloudflare-registry-proxy 项目 提交 Issue 来申请添加新的国外镜像代理服务
使用 Mutating Webhook 准入控制器实现。 当集群中 Pod 创建时,Mutating Webhook 的工作流程如下:
- 判断 Pod 是否属于排除的命名空间,如果是,结束流程;
- 判断 Pod 是否属于包含的命名空间,如果不是,结束流程;
- 依次判断 Pod 中的容器镜像是否匹配代理仓库,如果是,替换为代理镜像;
使用 Docker 镜像 nginx 创建一个 Pod:
kubectl apply -f https://raw.githubusercontent.com/ketches/registry-proxy/$VERSION/examples/dockerhub-nginx.yaml
# 代理地址
kubectl apply -f https://ghproxy.ketches.cn/https://raw.githubusercontent.com/ketches/registry-proxy/$VERSION/examples/dockerhub-nginx.yaml
示例中的 Pod 镜像为 nginx:latest
,经过 registry-proxy 自动代理后,容器镜像变为 docker.ketches.cn/library/nginx:latest
。
验证:
kubectl get pod dockerhub-nginx -o=jsonpath='{.spec.containers[*].image}'
卸载 registry-proxy:
# uninstall v1.0.0 version for example
export VERSION=v1.0.0
kubectl delete -f https://raw.githubusercontent.com/ketches/registry-proxy/$VERSION/deploy/manifests.yaml
# 代理地址
kubectl delete -f https://ghproxy.ketches.cn/https://raw.githubusercontent.com/ketches/registry-proxy/$VERSION/deploy/manifests.yaml
清理示例:
kubectl delete -f https://raw.githubusercontent.com/ketches/registry-proxy/$VERSION/examples/dockerhub-nginx.yaml
# 代理地址
kubectl delete -f https://ghproxy.ketches.cn/https://raw.githubusercontent.com/ketches/registry-proxy/$VERSION/examples/dockerhub-nginx.yaml
常规镜像代理
- ketches/registry-proxy:latest => docker.ketches.cn/ketches/registry-proxy:latest
根镜像代理
- nginx:latest => docker.ketches.cn/library/nginx:latest
常规镜像代理
- registry.k8s.io/ingress-nginx/controller:v1.8.2 => k8s.ketches.cn/ingress-nginx/controller:v1.8.2
根镜像代理
- registry.k8s.io/pause:3.9 => k8s.ketches.cn/pause:3.9