Dọn dẹp Docker Private Registry với API


Đợt này công ty tớ triển khai chuyển dần sang sử dụng Kubernetes để build và test, quá trình chuyển sang sử dụng Kubernetes thì vẫn còn nhiều gian nan lắm nhưng bước đầu cũng có những thành công nhất định. Mỗi tội thành công đó là thành công của team Dev vì đã chuyển sang K8s kịp thời gian, còn team DevOps của tớ thì lúc nào cũng vắt chân lên cổ chạy đằng theo sau để phục vụ. Nguyên nhân thì tính sau, nhưng hệ quả là có những task được ra đời kiểu on fly vì chẳng ai lúc làm để ý, dọn dẹp Docker Private Registry là một task như vậy.
alt text

Câu chuyện bắt đầu với việc bọn tớ dụng xong K8s cho team Devs deploy code, trong đó bao gồm 1 Private Registry chứa các image của sản phẩm trong quá trình build. Server được setup thuộc dạng… Monster, với 64 GB RAM, 4vCPU và 200GB ổ cứng, bọn tớ yên tâm sẽ được yên ổn trong một thời gian dài. Nhưng chỉ sau 2 tuần, với các developer nhiệt tình với công việc hết nức thì ổ cứng đã gần đầy, thế là 300GB được thêm vào để phục vụ cho cái sự lười của bọn tớ (hoặc đúng hơn là vì lúc đó đang có task quan trọng hơn phải làm).

Nhưng không, ổ cứng lần này thậm chí đầy chỉ trong 1 tuần… Cạn lời với các bạn Dev, chăm làm đến thế là cùng.

Lần này tớ hi vọng server sẽ ổn trong 2 tuần nữa để chờ mấy thằng đồng nghiệp quay trở lại sau kỳ nghỉ lễ cũng như tớ làm xong cái epic sida kia. Nhưng không, ổ cứng lần này thậm chí đầy chỉ trong 1 tuần… Cạn lời với các bạn Dev, chăm làm đến thế là cùng.
Phải dọn con Private Registry thôi, vậy có bao nhiêu cách để dọn Private Registry?
Có 2 cách để dọn Private Registry, sử dụng API và xoá tay. Do tớ chưa hardcore tới độ dám xoá tay nên cuối cùng chọn sử dụng API.
Đầu tiên phải kiểm tra xem trong cái Private Registry đấy mình có bao nhiêu image có thể xử lý, vào Chrome và access đến URL sau

https://username 334:password/domainname.com/V2/_catalog

Sau khi định vị được image cần xoá thì sử dụng Postman để xoá image với URL sau dùng DELETE method

http://registryhost:reigstryport/v2/${docker_image_name}/manifests/${digest}

Cũng có thể chơi thẳng lệnh curl cho máu

curl -v -X DELETE http://registryhost:reigstryport/v2/${docker_image_name}/manifests/${digest}

NOTE: để sử dụng được mấy cái API này thì trong quá trình start Registry bạn phải truyền parameter REGISTRY_STORAGE_DELETE_ENABLED=true. Nếu không thì xin lỗi, chỉ có cách recreate cái Container sida đó mới giúp bạn thoát thân với nỗi đau về ổ cứng, Docker không chấp nhận thay đổi state của Container on the fly đâu (ahuhu). Thật là tai hại…

Nói thêm về vụ xoá image của mình, tớ phải sử dụng sự hỗ trợ từ người thân tên là Github vì lượng image cần xoá quá khủng, nếu ngồi dùng CURL chắc tớ hết đường về với vợ con. Cụ thể tớ sử dụng tool của thanh niên sau https://github.com/andrey-pohilko/registry-cli, sau đó lên Jenkins tạo 1 cái job nhỏ nhỏ với command

 docker run --rm  anoxis/registry-cli -r https://[REGISTRY_URL]:5000 -i [image name] --dry-run --delete-by-hours 72

Set cho cái job chạy hàng đêm, thế là yên tâm ngồi rung đùi và sáng ngủ dậy thấy tất cả những image hơn 3 ngày tuổi được yên tâm tống vào sọt rác :D.
alt text

Happy clearing! :)

PS: Khi nào rảnh sẽ viết một bài ngắn ngắn về xoá bằng tay sử dụng folder vì sẽ có những trường hợp bắt buộc phải làm vậy :(.