大家好,今天给大家介绍一下我的开源项目:registry-proxy。
Registry Proxy,帮助您在 Kubernetes 集群中愉快地拉取国外容器镜像(仅限公有镜像)。
目前支持的境外镜像仓库:
- docker.io
- ghcr.io
- gcr.io
- k8s.gcr.io
- registry.k8s.io
- quay.io
- mcr.microsoft.com
PS:感谢 Docker Proxy 提供的镜像代理服务,本项目才能得以实现。💕
实现原理
使用 Mutating Webhook 准入控制器实现。 当集群中 Pod 创建时,Mutating Webhook 的工作流程如下:
- 判断 Pod 是否属于排除的命名空间,如果是,结束流程;
- 判断 Pod 是否属于包含的命名空间,如果不是,结束流程;
- 依次判断 Pod 中的容器镜像是否属于包含的镜像仓库,如果是,替换为 Docker Proxy 代理镜像;
快速安装
安装 cert-manager
如果集群中已经安装了 cert-manager,可以跳过这一步。
这里提供快速安装的方式:
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.13.0/cert-manager.yaml
# 代理地址
kubectl apply -f https://ghproxy.com/https://github.com/cert-manager/cert-manager/releases/download/v1.13.0/cert-manager.yaml
官方文档: Install cert-manager。
安装 registry-proxy
kubectl apply -f https://raw.githubusercontent.com/ketches/registry-proxy/master/deploy/manifests.yaml
# 代理地址
kubectl apply -f https://ghproxy.com/https://raw.githubusercontent.com/ketches/registry-proxy/master/deploy/manifests.yaml
配置
三个配置参数,以下给出默认配置,只有在命名空间范围内的 Pod,且 Pod 镜像在 Registry 范围内,容器镜像才会修改为 Docker Proxy 代理镜像。
- excludeNamespaces:["kube-system", "kube-public", "kube-node-lease"]
- includeNamespaces: ["*"]
- includeRegistries: ["docker.io", "ghcr.io", "gcr.io", "k8s.gcr.io", "registry.k8s.io", "quay.io", "mcr.microsoft.com"]
通过 ConfigMap 修改默认配置,修改会实时生效。
示例:限定代理命名空间 default、dev 和 staging 中 docker.io 的镜像。
kubectl apply -f - <<EOF
apiVersion: v1
kind: ConfigMap
metadata:
name: registry-proxy-config
namespace: registry-proxy
data:
config.yaml: |
excludeNamespaces:
- kube-system
- kube-public
- kube-node-lease
includeNamespaces:
- default
- dev
- staging
includeRegistries:
- "docker.io"
EOF
使用方式
示例
kubectl apply -f https://raw.githubusercontent.com/ketches/registry-proxy/master/examples/dockerhub-nginx.yaml
# 代理地址
kubectl apply -f https://ghproxy.com/https://raw.githubusercontent.com/ketches/registry-proxy/master/examples/dockerhub-nginx.yaml
示例中的 Pod 镜像为 nginx:latest,经过 registry-proxy 处理后,容器镜像变为 dockerproxy.com/library/nginx:latest。
验证:
kubectl get pod dockerhub-nginx -o=jsonpath='{.spec.containers[*].image}'
卸载&清理
卸载 registry-proxy
kubectl delete -f https://raw.githubusercontent.com/ketches/registry-proxy/master/deploy/manifests.yaml
# 代理地址
kubectl delete -f https://ghproxy.com/https://raw.githubusercontent.com/ketches/registry-proxy/master/deploy/manifests.yaml
清理示例
kubectl delete -f https://raw.githubusercontent.com/ketches/registry-proxy/master/examples/dockerhub-nginx.yaml
# 代理地址
kubectl delete -f https://ghproxy.com/https://raw.githubusercontent.com/ketches/registry-proxy/master/examples/dockerhub-nginx.yaml
代理参考
Docker Hub 官方镜像代理
-
常规镜像代理
- stilleshan/frpc:latest => dockerproxy.com/stilleshan/frpc:latest
-
根镜像代理
- nginx:latest => dockerproxy.com/library/nginx:latest
GitHub Container Registry
- 常规镜像代理
- ghcr.io/username/image:tag => ghcr.dockerproxy.com/username/image:tag
Google Container Registry
- 常规镜像代理
- gcr.io/username/image:tag => gcr.dockerproxy.com/username/image:tag
Google Kubernetes
-
常规镜像代理
- k8s.gcr.io/username/image:tag => k8s.dockerproxy.com/username/image:tag
- registry.k8s.io/username/image:tag => k8s.dockerproxy.com/username/image:tag
-
根镜像代理
- k8s.gcr.io/coredns:1.6.5 => k8s.dockerproxy.com/coredns:1.6.5
- registry.k8s.io/coredns:1.6.5 => k8s.dockerproxy.com/coredns:1.6.5
Quay.io
- 常规镜像代理
- quay.io/username/image:tag => quay.dockerproxy.com/username/image:tag
Microsoft Artifact Registry
- 常规镜像代理
- mcr.microsoft.com/azure-cognitive-services/diagnostic:latest => mcr.dockerproxy.com/azure-cognitive-services/diagnostic:latest
欢迎大家体验或参与该项目。