昨天我們簡單看了 Istio,讓我們能夠在不修改程式碼的情況下掌控微服務間的流量。這些工具都專注在「如何更好地運行和管理應用」。
但在實際的企業環境中,還有一個基礎問題需要解決:容器映像檔要存放在哪裡? 在開發和測試階段,我們習慣直接從 Docker Hub 拉取公開的映像檔。但在生產環境中,情況變得複雜:公司的應用程式不能公開、需要控制誰可以存取哪些映像檔、要確保映像檔的安全性和完整性、還要能追蹤映像檔的使用情況。今天我們要探討的 Harbor,就是專門解決這些問題的企業級私有映像檔倉庫。
Docker Hub 很方便,但它是公開的服務,有幾個問題在企業環境中很難接受。首先是 安全性問題,應用程式映像檔包含了業務邏輯、配置資訊,甚至可能有敏感數據,這些不能公開到網路上。其次是 存取控制,我們需要精確控制誰可以拉取或推送映像檔,不同的團隊可能需要不同的權限。再來是 合規性要求,許多企業有資料不出境的規定,映像檔必須存放在內部網路。最後是 穩定性考量,生產環境不能依賴外部網路,必須有本地的映像檔快取。
Docker 官方提供了 Docker Registry,這是一個基礎的私有倉庫實作。但它功能陽春,只提供映像檔的存儲和分發,缺乏權限管理、安全掃描、映像檔簽名等企業級功能。Harbor 在 Docker Registry 的基礎上,加入了大量實用的功能,成為一個完整的企業級解決方案。
Harbor 提供的不只是映像檔存儲,而是一整套映像檔生命週期管理方案。專案管理(Project) 讓想我嗎可以按照團隊或應用來組織映像檔,每個專案可以設定為公開或私有,控制誰可以訪問。基於角色的存取控制(RBAC) 提供細緻的權限管理,可以設定專案管理員、開發者、訪客等不同角色,每個角色有不同的操作權限。
映像檔複製(Replication) 功能讓我們可以在多個 Harbor 實例之間同步映像檔,這在多資料中心或混合雲環境中特別有用。比如我們可以將生產環境的映像檔自動複製到災備中心,確保業務連續性。漏洞掃描(Vulnerability Scanning) 整合了 Trivy 等安全掃描工具,可以自動掃描映像檔中的已知漏洞,在推送或定期掃描時發出警告。
映像檔簽名(Content Trust) 基於 Docker Notary,確保映像檔的完整性和來源可信。垃圾回收(Garbage Collection) 可以清理未使用的映像檔層,節省存儲空間。審計日誌(Audit Log) 記錄所有操作,方便追蹤和合規審查。這些功能組合起來,讓 Harbor 成為企業級容器平台的核心組件。
Harbor 本身是一個容器化的應用,使用 Docker Compose 來編排多個服務。核心服務包括 Harbor Core,這是主要的 API 和 Web UI 服務,處理用戶認證、權限控制、專案管理等。Registry 是實際存儲映像檔的 Docker Registry 服務。Job Service 負責處理非同步任務,如映像檔複製、垃圾回收、掃描等。
PostgreSQL 用來存儲元數據,如用戶資訊、專案配置、映像檔清單等。Redis 作為快取和任務佇列。如果啟用了漏洞掃描,還會有 Trivy 或 Clair 服務。所有這些服務透過 Nginx 作為前端代理,統一對外提供服務。
這種微服務架構的好處是每個組件可以獨立擴展和升級。比如如果掃描任務很多,可以增加 Scanner 的副本數;如果存儲容量不足,可以擴展 Registry 的後端存儲。
基礎的推送拉取只是 Harbor 功能的冰山一角,它還有很多實用的進階功能。
映像檔複製功能讓我們可以在多個 Harbor 實例之間自動同步映像檔。比如我們有一個中心 Harbor(在總部),多個區域 Harbor(在各個分公司),可以設定規則自動將映像檔從中心複製到區域,或者雙向同步。
在 Harbor Web UI 中,進入 "Administration" → "Replications",點擊 "NEW REPLICATION RULE"。選擇來源(本地或遠端 Harbor)、目標、觸發條件(手動、定時、或推送時自動觸發)、要複製的映像檔(可以用正則表達式過濾)。設定完成後,Harbor 會按照規則自動複製映像檔。
Harbor 整合了 Trivy 等安全掃描工具,可以自動掃描映像檔中的已知漏洞。在專案設定中啟用"自動掃描",每次推送映像檔時都會自動觸發掃描。掃描完成後,在映像檔詳情頁面可以看到漏洞報告,包括漏洞的嚴重程度、CVE 編號、受影響的套件等。
我們還可以設定策略,比如「禁止部署包含高危漏洞的映像檔」。當 Kubernetes 嘗試拉取一個有高危漏洞的映像檔時,Harbor 會拒絕請求,強制開發者修復漏洞後再部署。
隨著時間推移,Harbor 中會累積大量的映像檔和標籤,佔用大量存儲空間。映像檔保留策略可以自動清理舊的或不需要的映像檔。比如可以設定「保留最新的 10 個標籤」、「刪除 30 天未使用的映像檔」、「保留所有帶 prod
標籤的映像檔」等規則。
在專案設定中配置保留策略後,可以執行"Dry Run"來預覽哪些映像檔會被刪除,確認沒問題後再真正執行。
Harbor 支援 Webhook,可以在特定事件發生時發送通知到外部系統。比如當映像檔被推送時,可以觸發 CI/CD 流水線;當發現高危漏洞時,可以發送告警到 Slack 或郵件。
在專案設定中配置 Webhook,指定事件類型(推送、拉取、掃描完成、配額超限等)和目標 URL。Harbor 會以 POST 請求的方式發送事件資訊到指定 URL。
在實際使用 Harbor 的過程中,有一些最佳實踐值得注意。
首先是 憑證管理。生產環境務必使用正式的 SSL 憑證,而不是自簽名憑證。可以使用 Let's Encrypt 等免費的憑證頒發機構,或者使用企業內部的 CA。自簽名憑證雖然能用,但會給客戶端配置帶來麻煩,每個節點都需要手動信任 CA。
其次是密碼策略。安裝後立即修改預設的 admin 密碼,設定強密碼。定期輪換密碼,啟用密碼複雜度要求。如果環境允許,考慮整合 LDAP 或 Active Directory,使用統一的身份認證系統。
再來是網路隔離。Harbor 應該部署在內部網路,不要直接暴露到公網。如果需要從外部訪問,使用 VPN 或堡壘機。對 Harbor 的各個端口(HTTPS、HTTP、健康檢查等)進行適當的防火牆配置。
Harbor 的儲存需求會隨著映像檔數量快速增長。一個中等規模的企業,可能在幾個月內就會積累數百 GB 甚至數 TB 的映像檔。因此在部署前要做好儲存規劃。
建議將 /docker_data/harbor/data
掛載到獨立的大容量磁碟或存儲陣列上,而不是使用系統盤。如果使用雲端平台,可以使用塊存儲服務(如 AWS EBS、Azure Disk)並定期擴容。對於大型部署,還可以考慮使用物件存儲(如 S3、MinIO)作為後端,這樣儲存容量幾乎沒有限制。
定期執行垃圾回收來清理未使用的映像檔層。在 Harbor Web UI 中進入 "Administration" → "Garbage Collection",可以手動執行或設定定時任務。垃圾回收會暫時影響效能,建議在業務低峰期執行。
Harbor 的效能瓶頸通常在磁碟 I/O 和網路頻寬上。使用 SSD 可以大幅提升映像檔的推送和拉取速度。如果有多個叢集或地理分散的團隊,可以部署多個 Harbor 實例並使用複製功能,讓每個團隊訪問最近的實例。
對於頻繁訪問的映像檔,Harbor 會自動使用 Redis 進行快取。確保 Redis 有足夠的記憶體。如果 Redis 記憶體不足,可以在 docker-compose.yml
中調整 Redis 容器的記憶體限制。
生產環境中,需要對 Harbor 進行監控。關鍵的監控指標包括:服務可用性(各個容器是否正常運行)、儲存使用率(避免磁碟滿)、推送拉取請求的成功率和延遲、掃描任務的執行狀況、複製任務的延遲等。
Harbor 提供了 Prometheus 格式的 metrics 端點,可以很容易地整合到現有的監控系統中。在 harbor.yml
中啟用 metrics:
metric:
enabled: true
port: 9090
path: /metrics
重啟 Harbor 後,訪問 http://master.example.com:9090/metrics
就可以看到各種指標數據。配置 Prometheus 定期採集這些數據,然後在 Grafana 中創建儀表板進行視覺化展示。
對於關鍵告警(如儲存空間即將用盡、掃描發現高危漏洞、複製任務持續失敗等),設定告警規則發送通知到運維團隊。
Harbor 作為關鍵基礎設施,需要有完善的災備方案。定期備份是基礎,但單純的備份還不夠,還要定期測試恢復流程,確保備份是可用的。
對於高可用需求,可以部署多個 Harbor 實例,使用負載均衡器分散流量。但要注意 Harbor 本身不是設計為多活架構,多個實例需要透過複製功能來同步數據。另一種方案是使用 Harbor 的高可用部署模式,將資料庫和 Redis 部署為叢集,但這增加了複雜度。
對於大型企業,建議在主要資料中心和災備資料中心各部署一套 Harbor,並設定雙向複製。這樣即使主資料中心完全故障,災備中心的 Harbor 也有完整的映像檔,業務可以繼續運行。
Harbor 的專案功能很適合多團隊協作。為每個團隊或產品創建獨立的專案,設定適當的成員和權限。例如開發團隊成員可以推送映像檔,而測試團隊成員只能拉取。
使用命名規範來組織映像檔。比如可以約定:<project>/<service>:<environment>-<version>
,例如 ecommerce/payment-service:prod-v2.1.0
。清晰的命名讓映像檔更容易管理和追蹤。
在專案中使用標籤(Labels)來分類映像檔,比如 environment=production
、team=backend
、compliance=pci-dss
等。這些標籤可以用於過濾、搜尋、以及自動化策略。
今天一樣持續刷 CKAD 的題,先把 Harbor 的概念摸熟,待 CKAD 考古之後再來補上實作內容!