是否有可能有一個故障轉移/備份 docker 系統資料庫?
自從上週quay.io 失敗以來,公司裡的每個人都認識到服務的重要性。這在我腦海中提出了這個問題:
如果再次發生這種情況,我的基礎設施如何準備好使用輔助 docker 容器系統資料庫以防第一個不可用?
到目前為止,docker 引擎有一個
--registry-mirror
選項,但僅適用於配置 Docker hub 的鏡像。關於是否或如何調整它以允許鏡像其他註冊管理機構存在一些未解決的問題,但沒有足夠的牽引力來做出這種改變。如果您的上游系統資料庫是 docker hub,使用此標誌指向本地記憶體或鏡像非常有用,因為對集線器的請求會首先自動嘗試此鏡像,失敗時將嘗試上游系統資料庫。這意味著您無需調整圖像名稱或擔心本地中斷。Containerd 也有類似的選擇,它支持任何上游註冊中心,所以我相信這就是我們最終將要做的。但是,如果您使用的是 docker,即使使用了 containerd,我相信 docker 引擎仍在進行圖像推送和拉取。
由於無法在 containerd 中進行配置,我已經看到了一些用於記憶體來自其他系統資料庫的圖像的選項:
- 配置像 squid 這樣的 HTTP 記憶體代理。您確實希望確保這會定期刷新可變響應,例如圖像清單。圖層本身應保持不變,以便您可以將它們記憶體很長時間。
- 直接從另一個鏡像或記憶體系統資料庫中提取。
- 使用一些 DNS/TLS 劫持將請求發送到您的記憶體或鏡像。
通過記憶體系統資料庫配置拉取非常簡單:
docker run -p 5000:5000 -e REGISTRY_PROXY_REMOTEURL=<upstream-url> registry:2
但是,我傾向於執行鏡像,因為通過記憶體配置了7 天的條目過期時間。因此,如果發生中斷並且您的條目最近從您的拉取記憶體中過期,您將受到該中斷的影響。
執行鏡像涉及執行系統資料庫,就像通過記憶體拉取一樣,然後複製您想要鏡像的那些圖像。想到Harbor,一些註冊中心提供鏡像作為一項功能。您指定要鏡像到或從哪些遠端系統資料庫。我個人使用 shell 腳本進行鏡像,因為它允許我備份舊圖像(如果標籤在上游被替換,大多數鏡像將替換標籤,讓您沒有恢復選項)。然後,我將該腳本包含在我的 CI/CD 工作流程中,以便在適當的時間執行,例如在 sprint 開始時或每週一早上。此鏡像腳本的範例在我的展示文稿儲存庫中。
在本地系統資料庫中獲得可用映像後,您需要將 docker 配置為從該系統資料庫中提取。如果沒有該
--registry-mirror
選項,您要麼需要調整映像名稱,要麼在網路/docker 主機上配置 DNS/TLS,以將請求指向本地系統資料庫而不是上游系統資料庫。後一個選項看起來很有吸引力,因為它允許您在不進行任何更改的情況下執行 docker 命令,圖像建構、組合堆棧、掌舵圖等都可以像與遠端系統資料庫對話一樣工作。但是,管理您自己的 TLS 證書和自簽名 CA 更容易出錯,您網路上的所有主機都需要配置為信任。所以對我來說最簡單的選擇就是調整系統資料庫名稱。在我的 Dockerfile 中,我會有類似的東西:ARG REGISTRY=docker.io FROM ${REGISTRY}/library/alpine:3.9
這允許該圖像由網路之外的其他人建構。然後在我的網路上的建構命令中,我將用我的本地鏡像覆蓋 arg:
docker build --build-arg REGISTRY=local-mirror:5000 .
我在
docker-compose.yml
帶有變數的文件中做同樣的事情:image: ${REGISTRY:-docker.io}/my/repo:and-tag
然後在本地部署,例如:
REGISTRY=local-mirror:5000 docker-compose up -d
我在我的 DockerCon 展示文稿中介紹了這一點。幻燈片發佈在我的 github 上:https ://github.com/sudo-bmitch/presentations/tree/master/registry