Day26 說了 CI/CD 與 GitOps 如何部署服務。當 YAML 指定要使用 api-a:v2,接著就有一個問題:這個 image 要放在哪裡,叢集又要去哪裡取得?
registry 就是存放與提供 image 的地方。今天要說的 Harbor,除了提供 registry,也能管理存取權限、掃描弱點,以及把 image 複寫到其他站點。
開發時,image 可以先放在自己的電腦。等到 CI 要發布、不同 Node 要啟動服務,就需要一個大家能連線取得 image 的位置。
Harbor 是開源的 registry 平台,可以自行架設。適合想把 image 留在自己的環境,並一起管理下面幾件事的團隊:Harbor 官方介紹
Project 分組管理 repository,決定誰可以上傳、下載。Private Project 的內容需要具備權限才能取得。Harbor 的 Project 是 registry 內的分組,和 Kubernetes Namespace 分別管理。Image 拉取權限可以透過 Kubernetes 的 imagePullSecrets 提供。
如果現有 registry 已符合需求,就可以繼續沿用。導入 Harbor 時,也要安排儲存空間、備份、憑證、升級與帳號管理。
可以把流程分成三個工作:
例如 harbor-a.example.com/team/api-a:v2,包含 registry 位址、Harbor Project team、repository api-a 與 tag v2。
Harbor 負責保存與提供這個 image;前一天的 GitLab CD、kapp-controller 或 Argo CD,則負責把部署設定套用到叢集。Kubernetes Images

假設站點 A、B 各有一套相同版本的 Harbor,希望 B 的叢集能從當地取得 api-a:v2。可以在 A 建立 Push-based + Event Based 的 replication 規則:

這個例子假設兩端都保留 team/api-a:v2 的路徑。Harbor 有 Destination Namespace 與 Flattening 設定,實際路徑要依複寫規則安排,B 的 YAML 也要使用對應位址。
複寫透過背景工作執行,完成時間會受到 image 大小、頻寬、工作排隊與重試影響。第一次建立規則時,可以先手動執行複寫,補上來源已存在的 image,再交給後續事件處理。
沿用 A 的 image 要送到 B 的情境,先看由哪一端發起:
兩種方式的 image 都是從 A 到 B。接著才是「什麼時候執行」:
| 觸發方式 | 如何執行 | 適合用途 |
|---|---|---|
| Manual | 手動按下 Replicate | 首次同步、補跑或測試規則 |
| Scheduled | 依 cron 排程執行 | 定期複寫符合條件的內容 |
| Event Based | 本地上傳或 retag 等事件觸發 | 來源有更新時安排複寫 |
跨站保存 image 時,可以先決定 B 是要跟著 A 清理,還是另外保留版本:
Delete remote resources when locally deleted,讓來源刪除 artifact 時,也刪除目的端對應內容;保留關閉則由目的端自行安排清理。
版本名稱也要管理。同一個 tag 可以重新指向不同內容,v2 適合辨識版本,digest 則用來識別實際內容。正式版本可以搭配 tag immutability,保護符合規則的 tag,避免被覆蓋或刪除。
如果使用 Override 複寫同名資源,目的端仍會依權限與 immutability 等規則處理。兩邊都有人上傳相同 tag 時,先訂好哪一端負責發布這個版本,會比較好維護。
可以依照流程查看三個地方:
ImagePullBackOff 的原因可以從 Pod events 查看。Harbor 的 replication 不會複製 Project 成員資訊,B 的權限要自行設定;自簽憑證的 CA 信任也要分別安排在複寫端與 Node 的 container runtime。Configuring Replication
跨站複寫讓 B 提前準備好需要的 image。服務更新由 CD 或 GitOps 負責,流量切換則交給入口與站點切換機制。把這幾段串起來,就能清楚知道發布流程卡在哪裡。