最近由于 Dockerhub 仓库被封导致常用的镜像无法拉取,好在网上已经有搭建镜像仓库的教程,比如使用 cloudflare-docker-proxy 基于 Cloudflare Workers 搭建镜像代理服务。虽然解决了镜像拉取的问题,但对于部署在 k8s 集群上的应用,管理员需要手动修改 YAML 文件中的镜像地址,如果集群上部署的应用较多这个工作量就会很大。更麻烦的是一些使用 Operator 管理的应用,甚至无法直接修改镜像地址。
image-operator 是基于 Admission Webhook 实现的一个 Operator,工作原理是在 Pod 创建时根据规则重写镜像地址,这个过程对使用者来说是透明的,无需手动修改 YAML 中的镜像地址。
安装 image-operator
image-operator
提供了 Helm Chart 方便安装,首先添加 Helm 仓库:
1 | helm repo add image-operator https://yxwuxuanl.github.io/k8s-image-operator/ |
接着安装 image-operator
:
1 | helm install image-operator image-operator/image-operator -n image-operator --create-namespace |
稍等片刻后查看 image-operator
的状态:
1 | kubectl get pods -n image-operator |
到这里 image-operator
就安装完成了。
重写镜像地址
image-operator
使用 Rule CRD 来配置重写规则,下面来看一个例子:
1 | apiVersion: image.lin2ur.cn/v1 |
将上面的配置保存为 rule.yaml
并应用,然后使用 Dockerhub 仓库的镜像创建一个应用:
1 | kubectl apply -f rule.yaml |
此外 image-operator
还支持对特定的 Pod 进行重写:
1 | apiVersion: image.lin2ur.cn/v1 |
同步镜像
如果只是用到少量 Dockerhub 镜像并且不想大费周章搭建镜像仓库,可以使用 Mirror CRD 将 Dockerhub 上的镜像同步到自己的镜像仓库:
1 | apiVersion: image.lin2ur.cn/v1 |
将上面的配置保存为 mirror.yaml
并应用:
1 | kubectl create -f mirror.yaml |
image-operator
会创建一个 Job 来同步镜像,稍等片刻后查看任务状态:
1 | kubectl get mirror nginx-pq9dg |
同步完成后就可以使用 myregistry.com/nginx:1.27
这个镜像了。