Tự động hóa cập nhật Docker Image: Hướng dẫn về Argo CD Image Updater

DevOps tutorial - IT technology blog
DevOps tutorial - IT technology blog

Hoàn thiện vòng lặp GitOps

GitOps hứa hẹn một “single source of truth” (nguồn sự thật duy nhất), nhưng thực tế thường bao gồm một bước thủ công gây nản lòng: cập nhật image tag. Bạn build một Docker image mới, push nó lên ECR hoặc Docker Hub, và sau đó bị kẹt ở bước chỉnh sửa file values.yaml bằng tay. Đây là một công việc lặp đi lặp lại và dễ dẫn đến sai sót do con người. Trong một môi trường thay đổi nhanh chóng với hơn 20 microservices, việc vá lỗi thủ công này có thể dễ dàng tiêu tốn 4-5 giờ mỗi tuần của một kỹ sư DevOps.

Argo CD Image Updater giải quyết vấn đề này bằng cách giám sát container registry của bạn và tự động push các thay đổi về tag vào Git. Nó thu hẹp khoảng cách giữa CI pipeline và GitOps repository của bạn. Thay vì lập trình viên phải thực hiện một commit nhỏ cho mỗi lần build, controller sẽ đảm nhận phần việc nặng nhọc đó.

Cách thức hoạt động của Controller

Hãy coi Image Updater như một người bạn đồng hành của Argo CD. Nó chạy như một deployment riêng biệt và thăm dò (poll) registry của bạn—cho dù đó là Harbor, GCR hay AWS ECR—để xem liệu có phiên bản image mới nào không. Khi phát hiện một bản khớp dựa trên tiêu chí của bạn, nó sẽ kích hoạt cập nhật.

Chiến lược cập nhật

Bạn xác định thế nào là “mới” bằng cách chọn một chiến lược:

  • SemVer: Đây là tiêu chuẩn vàng cho môi trường production. Nó tuân theo các quy tắc Semantic Versioning. Ví dụ: nếu tag hiện tại của bạn là 1.2.0, nó có thể tự động lấy 1.2.1 nhưng sẽ bỏ qua bản phát hành 2.0.0 có thay đổi gây lỗi (breaking change).
  • Latest: Chiến lược này chỉ đơn giản là chọn image có timestamp bản build gần nhất. Nó hữu ích cho các môi trường dev nơi các tag như latest hoặc develop thường xuyên bị ghi đè.
  • Alphabetical: Công cụ sắp xếp các tag theo thứ tự bảng chữ cái và chọn tag cuối cùng trong danh sách.

Phương thức ghi ngược (Write-back)

Việc quyết định cách áp dụng bản cập nhật là rất quan trọng đối với audit trail (truy vết kiểm toán) của bạn:

  1. Imperative (Argo CD API): Công cụ yêu cầu Argo CD ghi đè tham số trong trạng thái nội bộ của nó. Thay đổi này không bao giờ xuất hiện trong Git. Cách này nhanh, nhưng bạn mất khả năng xem lịch sử thay đổi trong repository của mình.
  2. Git Write-back: Đây là phương pháp được khuyến khích. Công cụ sẽ clone repo của bạn, tạo một commit với tag mới và push ngược trở lại. Lịch sử Git của bạn vẫn là bản ghi xác thực nhất về những gì đang chạy trên production.

Cấu hình từng bước

Tôi giả định rằng bạn đã có một instance Argo CD đang hoạt động. Chúng ta sẽ cài đặt Image Updater và cấu hình nó để theo dõi một ứng dụng mẫu bằng phương thức Git write-back.

1. Cài đặt

Triển khai controller bằng các manifest chính thức. Chạy lệnh sau để lấy phiên bản ổn định (stable):

kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj-labs/argocd-image-updater/stable/manifests/install.yaml

Xác minh cài đặt bằng cách kiểm tra pod đang chạy trong namespace argocd. Nó sẽ sẵn sàng trong khoảng 30 giây.

2. Cấp quyền truy cập Git

Để công cụ có thể commit các thay đổi, nó cần một Personal Access Token (PAT). Hãy tạo một Kubernetes secret để lưu trữ các thông tin xác thực này một cách an toàn:

kubectl create secret generic git-creds \
  --from-literal=username=devops-bot \
  --from-literal=password=ghp_your_secret_token_here \
  -n argocd

3. Thêm Annotation cho Application

Image Updater hoạt động theo cơ chế opt-in. Nó chỉ theo dõi các ứng dụng có các annotation cụ thể. Các annotation này cho công cụ biết image nào cần theo dõi và sử dụng chiến lược nào.

Dưới đây là một đoạn mã cho manifest Application theo dõi một ứng dụng web bằng SemVer:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: inventory-api
  namespace: argocd
  annotations:
    # Theo dõi image inventory
    argocd-image-updater.argoproj.io/image-list: my-app=docker.io/org/inventory:~
    # Sử dụng chiến lược SemVer
    argocd-image-updater.argoproj.io/my-app.update-strategy: semver
    # Sử dụng phương thức Git write-back
    argocd-image-updater.argoproj.io/write-back-method: git
    # Tham chiếu secret chứa thông tin xác thực Git của chúng ta
    argocd-image-updater.argoproj.io/write-back-repository: [email protected]:org/infra-repo.git
spec:
  source:
    repoURL: https://github.com/org/infra-repo.git
    targetRevision: HEAD
    path: apps/inventory

Ký tự ~ trong danh sách image là một cách viết tắt. Nó yêu cầu updater duy trì trong cùng phiên bản minor hiện tại, chẳng hạn như nâng cấp từ 1.1.5 lên 1.1.9.

Kết nối với Private Registry

Các registry công khai hoạt động ngay lập tức, nhưng các registry riêng tư yêu cầu xác thực. Bạn có thể định nghĩa thông tin xác thực trên toàn hệ thống trong ConfigMap argocd-image-updater-config. Ngoài ra, bạn có thể sử dụng một secret cho một ứng dụng cụ thể:

argocd-image-updater.argoproj.io/my-app.pull-secret: secret:argocd/registry-creds

Xử lý sự cố và Thực hành tốt nhất

Nếu các tag của bạn không cập nhật, đừng đoán mò. Hãy kiểm tra log ngay lập tức. Sử dụng lệnh kubectl logs -n argocd deployment/argocd-image-updater để xem liệu có lỗi 401 Unauthorized hoặc các vấn đề về giới hạn tần suất (rate-limiting) hay không.

  • Theo dõi giới hạn: Docker Hub có các giới hạn pull nghiêm ngặt. Hãy thiết lập khoảng thời gian thăm dò (polling interval) thành 5 hoặc 10 phút trong ConfigMap để tránh bị chặn.
  • Bảo vệ nhánh (Branch Protection): Đảm bảo token Git của bạn có quyền bỏ qua bảo vệ nhánh. Nếu nhánh main của bạn yêu cầu commit có chữ ký hoặc phê duyệt PR, công cụ sẽ không thể push.
  • File ghi đè: Khi sử dụng Git write-back, hãy tìm file có tên .argocd-source-<appname>.yaml. Đây là nơi công cụ lưu trữ các giá trị ghi đè. Hãy giữ nó trong repository của bạn.

Lời kết

Tự động hóa cập nhật image giúp loại bỏ rào cản thủ công cuối cùng trong hầu hết các quy trình GitOps. Nó đảm quả cluster của bạn luôn đồng bộ với registry mà không cần sự can thiệp của con người. Hãy bắt đầu bằng cách chuyển đổi một dịch vụ staging duy nhất sang chiến lược SemVer. Khi quá trình tự động hóa đã ổn định, bạn có thể triển khai nó trên toàn bộ các microservices production để đạt được quy trình Continuous Delivery thực thụ.

Share: