在第一篇文章,我們討論了 ACR 中 Manifest 與 Tag 的關係,並了解到沒有 Tag 的 Image 對於管理與費用都會產生不好的影響,隨後在第二篇文章中透過 acr purge 與 az acr task 建立自動清理的排程來處理這些 Image,詳細內容歡迎參考以下系列文章。
接著在進入正式的生產環境時,常見的作法會希望將 ACR 的外網訪問關閉以建立私人的儲存庫,這種情況的 az acr task 就需要另外搭配專用的代理程式集區執行,可惜的是這項功能截至發文為止處於預覽階段,而且更慘的是還不支援我自己常用的東南亞地區 😭
做為替代方案,我們選擇使用 Retention Policy 來清理這些沒有 Tag 的 Image,本篇文章將紀錄關於保留原則的一些限制與設定過程。
系列文章
將 ACR 升級至 Premium
Retention Policy 最大的限制就是只能在 Premium 等級的 ACR 上啟用,不過對於已經考量到需要關閉外網的生產環境來說不是太大的問題,畢竟要在 ACR 上啟用 Private Endpoint 也需要 Premium 的 SKU。
可以直接使用以下 az acr update 指令來將 ACR 升級到 Premium 等級:
啟用 Retention Policy
在 Premium SKU 的 ACR 上就能直接啟用 Retention Policy 了,一樣使用 Azure CLI 來完成。
其中 --days 可以設定要對沒有 Tag 的 Image 保留多久,可以設定 0 到 365 天。
而目前 Retention Policy 只支援清理沒有 Tag 的 Image,也就是 --type UntaggedManifests,所以目前也只能設定這個值,期待未來會開放更多功能。
回到 Portal 畫面也可以在「原則」→「保留」中看到 Retention Policy 已經被啟用。
驗證 Retention Policy
因為我們剛剛設定的保留天數是 0 天,代表沒有 Tag 的 Image 將會被立即刪除,所以我們可以藉此快速地來驗證 Retention Policy。
首先我們需要將測試用的 Image 放入 ACR,使用以下指令建立 Dockerfile:
使用 az acr build 指令對 Dockerfile 建構並推送 Image 到 ACR 中:
接著回到 Portal 確認 Image 推送成功。
使用 az acr repository untag 指令移除 hello-world 的 v1 標籤:
執行完成後要馬上回到 Portal,可以看到「標籤計數」已經由 1 變成 0。
接著再過幾秒連 hello-world 存放庫也會整個消失,原因是當我們解除 Tag 後,會隨即被 Retention Policy 偵測並移除該 Image,而沒有任何 Image 的存放庫也當然會直接移除,到此測試成功 🙌
總結
對於關閉外網訪問的 ACR 來說,Retention Policy 可以做為 az acr task 的替代方案,而且比起 az acr task 需要背後運行機器的費用,Retention Policy 是一個完全免費的功能。
可惜目前 Retention Policy 除了強制要求 Premium SKU 外,還不能跟 Soft Delete Policy 同時啟用,算是有點嚴苛的限制。
留言
張貼留言