使用 Harbor 作為 K3S 的鏡像代理緩存后端


環境參考:使用 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

  1. 右側邊欄 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 清空
  2. 右側邊欄 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,撰寫本文的時候還在討論中,沒有明確接受還是拒絕。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM