環境參考:使用 k3s 搭建高可用 k8s 集群 (on Alpine 3.13)
部署 Harbor
使用 helm 安裝
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 的鏡像
# 設置 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:Provider Name Endpoint URL Access ID Docker Hub docker.io Quay quay.io https://quay.io 清空 Quay(無誤) gcr.io https://gcr.io 清空 Quay(無誤) k8s.gcr.io https://k8s.gcr.io 清空 Quay(無誤) ghcr.io https://ghcr.io 清空 -
右側邊欄
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
cat >>/etc/hosts <<EOF
127.0.0.1 core.harbor.k8s.local
EOF
創建 /etc/rancher/k3s/registries.yaml
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,撰寫本文的時候還在討論中,沒有明確接受還是拒絕。