Tìm Hiểu Core và Project trong ArgoCD: Một Hướng Dẫn Cơ Bản

KiloKilo
6 min read

Trong hệ sinh thái Kubernetes, việc quản lý hàng chục hoặc thậm chí hàng trăm ứng dụng trở thành một thách thức lớn. Điều này đặc biệt đúng khi các ứng dụng cần được triển khai liên tục và tự động, đồng thời phải đảm bảo tính nhất quán. Để giải quyết các thách thức này, ArgoCD là một công cụ quản lý GitOps mạnh mẽ giúp bạn quản lý các ứng dụng Kubernetes dựa trên Git, cung cấp khả năng triển khai tự động, liên tục, và đáng tin cậy. Trong bài viết này, chúng ta sẽ tìm hiểu về core của ArgoCD và khái niệm Project trong ArgoCD, hai thành phần quan trọng trong việc quản lý ứng dụng Kubernetes.

ArgoCD là gì?

Argo CD là một công cụ triển khai liên tục (Continuous Deployment - CD) dựa trên GitOps, được thiết kế để tự động hóa việc triển khai ứng dụng lên các cụm Kubernetes. Với Argo CD, trạng thái mong muốn của ứng dụng được định nghĩa trong một repository Git, và Argo CD sẽ liên tục so sánh trạng thái này với trạng thái hiện tại của cụm và thực hiện các thay đổi cần thiết để đảm bảo chúng khớp nhau.

Tại sao sử dụng ArgoCD?

  • Tự động hóa: Loại bỏ các thao tác triển khai thủ công, giảm thiểu lỗi và tăng tốc độ triển khai.

  • Quản lý phiên bản: Mọi thay đổi cấu hình đều được quản lý qua Git, giúp dễ dàng theo dõi lịch sử và khôi phục các phiên bản cũ.

  • Kiểm soát truy cập: Sử dụng các cơ chế kiểm soát truy cập của Git để quản lý quyền truy cập vào các ứng dụng.

  • Tích hợp với các công cụ DevOps: Dễ dàng tích hợp với các công cụ CI/CD khác như Jenkins, CircleCI.

Kiến trúc Core của ArgoCD

Core của ArgoCD bao gồm các thành phần chính sau:

  • API Server: Cung cấp giao diện REST API cho người dùng, các công cụ dòng lệnh và giao diện người dùng (UI) để tương tác với ArgoCD.

  • Repository Server: Đảm nhận việc kết nối với các Git repository để tải về cấu hình ứng dụng. Nó phân tích nội dung từ repo và gửi thông tin đến các thành phần khác.

  • Application Controller: Đây là trái tim của ArgoCD, nó so sánh trạng thái hiện tại của ứng dụng trong cluster với trạng thái mong muốn (được định nghĩa trong Git) và tự động điều chỉnh để giữ cho chúng nhất quán.

  • Dex Server: Dex là hệ thống cung cấp xác thực OpenID Connect (OIDC) và LDAP, hỗ trợ tích hợp Single Sign-On (SSO) với các dịch vụ bên ngoài.

  • Redis: Dùng để lưu trữ cache trạng thái của các ứng dụng, tăng tốc độ phản hồi của hệ thống.

Khái niệm cốt lõi của ArgoCD

  • Application: Đại diện cho một ứng dụng được triển khai trên Kubernetes. Một Application bao gồm:

    • Source: Vị trí của manifest định nghĩa ứng dụng trong Git.

    • Destination: Cụm Kubernetes nơi ứng dụng được triển khai.

    • Sync Policy: Các chính sách đồng bộ hóa, ví dụ như tự động đồng bộ hóa khi có thay đổi trong Git.

  • Project: Một nhóm các Application, cung cấp khả năng quản lý và phân quyền cho các nhóm ứng dụng khác nhau.

  • Synchronization: Quá trình so sánh trạng thái mong muốn (định nghĩa trong Git) với trạng thái hiện tại của ứng dụng và thực hiện các thay đổi cần thiết.

  • Health: Trạng thái sức khỏe của ứng dụng, được xác định dựa trên các điều kiện sức khỏe được cấu hình.

Quy trình làm việc của ArgoCD

ArgoCD hoạt động theo cơ chế GitOps bằng cách liên tục theo dõi repository Git để phát hiện các thay đổi. Khi có một thay đổi mới, ArgoCD sẽ so sánh trạng thái hiện tại của cluster với trạng thái mong muốn (trong Git) và tự động điều chỉnh cluster Kubernetes để phù hợp với các thay đổi đó. Điều này giúp đảm bảo tính nhất quán giữa môi trường thực tế và cấu hình Git, đồng thời giảm thiểu rủi ro do lỗi cấu hình thủ công.

Khái niệm Project trong ArgoCD

Project là một khái niệm quan trọng trong ArgoCD, giúp bạn quản lý và phân quyền cho nhiều ứng dụng cùng lúc. Trong một hệ thống lớn với nhiều ứng dụng và đội ngũ phát triển khác nhau, việc giới hạn và phân tách quyền quản lý trở nên cần thiết. Project cho phép tạo các "khung" quản lý để phân nhóm các ứng dụng dựa trên các yếu tố như namespace, cluster, hoặc repository Git.

Một Project trong ArgoCD có các tính năng quản lý chính sau:

  • Application Whitelisting: Cho phép chỉ định các repository Git nào được phép deploy ứng dụng vào Kubernetes thông qua ArgoCD. Điều này giúp bảo mật hệ thống khi chỉ những nguồn tin cậy mới được phép triển khai.

  • Cluster Restrictions: Bạn có thể định nghĩa danh sách các cluster mà Project có thể deploy ứng dụng. Ví dụ, một team có thể chỉ được deploy ứng dụng của họ vào một cluster phát triển riêng biệt.

  • Namespace Restrictions: Giới hạn việc triển khai ứng dụng vào các namespace nhất định trong cluster.

  • Sync Policy: Bạn có thể áp dụng các chính sách đồng bộ (sync policy) cho từng project, như quy định việc tự động deploy khi phát hiện có sự thay đổi hoặc yêu cầu phải được chấp thuận trước khi deploy.

Ví dụ:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: ingress-nginx
  annotations:
    argocd.argoproj.io/manifest-generate-paths: /infra/deployments/infra/ingress-nginx
    argocd.argoproj.io/sync-wave: "10"
  finalizers:
    - resources-finalizer.argocd.argoproj.io
spec:
  project: default

  ignoreDifferences:
  - group: argoproj.io
    kind: Application
    jsonPointers:
    - /status
  - group: apps
    kind: Deployment
    jsonPointers:
    - /status
  destination:
    server: {{ .Values.infra.destination.server }}
    namespace: infra
  source:
    repoURL: {{ .Values.infra.source.repoURL }}
    targetRevision: {{ .Values.infra.source.targetRevision }}
    path: infra/deployments/infra/ingress-nginx
    helm:
      valueFiles:
        - values.yaml
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
      - ApplyOutOfSyncOnly=true
      - PruneLast=true
      - CreateNamespace=true
      - Validate=false

finalizers:

ignoreDifferences:

Đây là phần cấu hình giúp bỏ qua một số sự khác biệt giữa trạng thái hiện tại và trạng thái mong muốn của ứng dụng trong quá trình đồng bộ:

  • group: argoproj.io, kind: Application, jsonPointers: - /status: Bỏ qua các khác biệt trong trường status của tài nguyên Application.

  • group: apps, kind: Deployment, jsonPointers: - /status: Tương tự, bỏ qua các khác biệt về status trong các tài nguyên Deployment. Phần status thường thay đổi động dựa trên trạng thái hiện tại của ứng dụng, nên có thể không cần đồng bộ.

syncPolicy:

Chính sách đồng bộ của ArgoCD cho ứng dụng này:

  • automated:

    • prune: true: Tự động xóa các tài nguyên dư thừa không còn được định nghĩa trong Git repository.

    • selfHeal: true: Tự động sửa chữa ứng dụng khi phát hiện sự khác biệt giữa trạng thái hiện tại và trạng thái mong muốn.

  • syncOptions: Các tùy chọn bổ sung khi đồng bộ:

    • ApplyOutOfSyncOnly=true: Chỉ áp dụng đồng bộ khi tài nguyên bị phát hiện không đồng bộ.

    • PruneLast=true: Xóa các tài nguyên dư thừa sau khi đồng bộ các tài nguyên khác.

    • CreateNamespace=true: Tự động tạo namespace nếu nó chưa tồn tại.

    • Validate=false: Bỏ qua việc xác thực cấu hình trước khi áp dụng (để tăng tốc độ triển khai hoặc khi không cần xác thực).

0
Subscribe to my newsletter

Read articles from Kilo directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Kilo
Kilo