使用 Harbor 作为 K3S 的镜像代理缓存后端 - roy2220 - 博客园
Excerpt
环境参考:使用 k3s 搭建高可用 k8s 集群 (on Alpine 3.13) 部署 Harbor 使用 helm 安装 helm repo add harbor https://helm.goharbor.io helm upgrade –install harbor harbor/harb
环境参考:使用 k3s 搭建高可用 k8s 集群 (on Alpine 3.13)
部署 Harbor#
使用 helm 安装
1 | helm repo add harbor https://helm.goharbor.io helm upgrade --install harbor harbor/harbor \ -n harbor --create-namespace \ --set expose.tls.enabled=false \ --set expose.ingress.hosts.core=core.harbor.k8s.local \ --set expose.ingress.hosts.notary=notary.harbor.k8s.local \ --set externalURL=http://core.harbor.k8s.local |
(可选)配置 Harbor 访问外网的 HTTP(S) 代理#
不使用外网代理无法获取 gcr.io / k8s.gcr.io 的镜像
1 | # 设置 HTTP_PROXY、HTTPS_PROXY 条目 kubectl edit -n harbor configmaps/harbor-core # 重启 harbor-core 让设置生效 kubectl rollout restart -n harbor deployments/harbor-core kubectl rollout status -n harbor deployments/harbor-core |
创建 Harbor 代理缓存项目#
使用用户名 admin
密码 Harbor12345
登入 Harbor 管理后台 http://core.harbor.k8s.local
右侧边栏
Administration
=>Registries
=>New Endpoint
创建 5 个 Endpoint:右侧边栏
Projects
=>New Project
创建 5 个项目:Project Name Access Level Proxy Cache docker.io Public ☑️ ☑️ Endpoint: docker.io quay.io Public ☑️ ☑️ Endpoint: quay.io gcr.io Public ☑️ ☑️ Endpoint: gcr.io k8s.gcr.io Public ☑️ ☑️ Endpoint: k8s.gcr.io ghcr.io Public ☑️ ☑️ Endpoint: ghcr.io
配置 K3S 仓库镜像#
添加 ingress 的本地 hosts 解析条目 core.harbor.k8s.local
1 | cat >>/etc/hosts <<EOF 127.0.0.1 core.harbor.k8s.local EOF |
创建 /etc/rancher/k3s/registries.yaml
1 | cat >/etc/rancher/k3s/registries.yaml <<EOF mirrors: docker.io: endpoint: - http://core.harbor.k8s.local rewrite: "(^.+\$)": "docker.io/\$1" quay.io: endpoint: - http://core.harbor.k8s.local rewrite: "(^.+\$)": "quay.io/\$1" gcr.io: endpoint: - http://core.harbor.k8s.local rewrite: "(^.+\$)": "gcr.io/\$1" k8s.gcr.io: endpoint: - http://core.harbor.k8s.local rewrite: "(^.+\$)": "k8s.gcr.io/\$1" ghcr.io: endpoint: - http://core.harbor.k8s.local rewrite: "(^.+\$)": "ghcr.io/\$1" EOF # 注意:\$ 是为了 bash 转义 $ ,如果是手工编辑保存要把转义符 \ 去掉 # 需要重启 k3s server 让设置生效 rc-service k3s restart # 确认配置已经生效 crictl info |
实现的关键在于 rewrite
规则,在镜像名前面加上 harbor 项目名作为前缀,拉取镜像的请求才能被正确的路由。这一点至关重要。
值得一提的是 rewrite
特性并不是 containerd 官方版本的特性,由 rancher 魔改版本实现。rancher 给 containerd 提交了 Pull Request,撰写本文的时候还在讨论中,没有明确接受还是拒绝。