+2

[ArgoCD] Phần 5: Deploy ứng dụng dùng kustomize với ArgoCD

👋👋👋 Hello hello, xin chào tất cả anh em. Anh em nào đã lỡ vào đây rồi thì comment chào nhau một cái nhé cho đông vui nhé! Nhận dịp MayFest 2025, mình lại tiếp tục quay trở lại với Series: GitOps với ArgoCD - Phần 5: Deploy ứng dụng dùng kustomize với ArgoCD.

Kustomize là gì?

Kustomize là một công cụ mạnh mẽ và linh hoạt giúp quản lý cấu hình Kubernetes một cách hiệu quả, đặc biệt khi bạn cần duy trì nhiều phiên bản cấu hình khác nhau cho cùng một ứng dụng. Ví dụ bạn muốn deploy một ứng dụng trên 3 môi trường: dev, staging và production. Khi đó bạn có thể tổ chức lưu các file theo mẫu sau:

whoami:
├── base
├── dev
├── production
└── staging

Trong đó:

  • base: Là folder chứa các file YAML bạn muốn tái sử dụng để deploy lên cả 3 môi trường.
  • dev: Là folder chứa các file YAML chỉ deploy cho môi trường dev, kế thừa từ base.
  • staging: Là folder chứa các file YAML chỉ deploy cho môi trường Staging, kế thừa từ base.
  • production: Là folder chứa các file YAML chỉ deploy cho môi trường Production, kế thừa từ base.
  • Dĩ nhiên, kustomize cho phép bạn thực hiện ghi đè các giá trị cho các tài nguyên được định nghĩa trong base. Ví dụ, trong base Deploymentreplicas: 1 nhưng trong staging bạn có thể sửa replicas: 2production thì thiết lập là replicas: 5.

Để cài đặt kustomize, mình khuyến nghị các bạn đang dùng Linux hoặc MacOS thì cài bằng Homebrew theo lệnh sau:

brew install kustomize
kustomize version

Version của mình đang là bản v5.6.0.

Lưu cấu hình trong GitOps Repository

ArgoCD có hỗ trợ sẵn kustomize, do đó bạn chỉ cần trỏ source của application vào Git repo là được. Ví dụ, repository của mình có URL là https://github.com/teguru-labs/fleet-infra. Nếu bạn quên cách kết nối tới private repository thì nghé lại [ArgoCD] Phần 2: Kết nối đến Private Repository nhé.

Ví dụ, trong repository mình đang bố trí các thư mục gồm các file và thư mục như này:

apps/whoami
├── production.app.yaml -> File khai báo ArgoCD Application cho Production
├── staging.app.yaml    -> File khai báo ArgoCD Application cho Staging
├── base
│   ├── deployment.yaml        -> Khai báo K8s Deployment
│   ├── kustomization.yaml     -> File khai báo của kustomize
│   └── service.yaml           -> Khai báo K8s Service
├── production
│   ├── deployment-patch.yaml  -> File vá cho Deployment, sửa replicas=5
│   └── kustomization.yaml     -> File khai báo của kustomize
└── staging
    ├── deployment-patch.yaml    -> File vá cho Deployment, sửa replicas=2
    └── kustomization.yaml       -> File khai báo của kustomize

Khai báo Application cho từng môi trường

Nếu các bạn còn nhớ thì trong Phần 3: Bootstrap cluster sử dụng App of Apps pattern mình có bố trí một thư mục bootstrap và sử dụng App of Apps pattern để tự động deploy bất kỳ K8s Resource nào có trong thư mục bootstrap. Application gốc có tên là argocd-bootstrap.

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: argocd-bootstrap
  namespace: argocd
spec:
  destination:
    namespace: argocd
    name: in-cluster
  source:
    path: bootstrap
    repoURL: "https://github.com/teguru-labs/fleet-infra"
    targetRevision: main
    directory:
      recurse: true
      exclude: "argocd/*"
  project: default
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
      - CreateNamespace=true
      - ApplyOutOfSyncOnly=true

Bây giờ, mình sẽ tạo các file khai báo Application để cho mỗi môi trường Staging và Production rồi bỏ vào trong bootstrap là xong.

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: whoami-production
  namespace: argocd
  finalizers:
    - resources-finalizer.argocd.argoproj.io
spec:
  project: default
  destination:
    name: teguru-production
    namespace: whoami
  source:
    repoURL: https://github.com/teguru-labs/fleet-infra
    path: apps/whoami/production
    targetRevision: main
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
      - CreateNamespace=true
      - ApplyOutOfSyncOnly=true
  ignoreDifferences:
    - group: argoproj.io
      jsonPointers:
        - /status
      kind: Application

Chỗ này các bạn để ý:

  • spec.destination.name: Chỉ định deploy lên cluster có tên là teguru-production.
  • spec.source.repoURL: Chính là cái Git repository của mình.
  • spec.source.targetRevision: Chỉ định tên branch trong repository sẽ dùng.
  • spec.source.path: Chính là đường dẫn tới folder kustomize production.

Đối với Staging làm khai báo tương tự:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: whoami-staging
  namespace: argocd
  finalizers:
    - resources-finalizer.argocd.argoproj.io
spec:
  project: default
  destination:
    name: teguru-staging
    namespace: whoami
  source:
    repoURL: https://github.com/teguru-labs/fleet-infra
    path: apps/whoami/staging
    targetRevision: main
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
      - CreateNamespace=true
      - ApplyOutOfSyncOnly=true
  ignoreDifferences:
    - group: argoproj.io
      jsonPointers:
        - /status
      kind: Application

Cuối cùng là commit lại vào Git repository và push lên GitHub là xong! 👋👋👋

Thành quả thu được

Application argocd-bootstrap sẽ tạo thêm 2 Application khác là:

  • whoami-staging: Deploy Kustomization tại thư mục apps/whoami/staging.
  • whoami-production: Deploy Kustomization tại thư mục apps/whoami/production.

Dưới đây, các bạn có thể thấy whoami-production đã deploy được các tài nguyên gồm Deployment, Service lên cluster. Như vậy là thành công rồi!

image.png

Ngoài ra, các bạn cũng thế sử dụng kustomize để deploy Helm Chart nữa. Nó sẽ được ứng dụng trong các tình huống các bạn deploy ứng dụng bằng helm chart có sẵn và phải KÈM THEO một số resource khác nữa. Một ví dụ thực tế khi triển khai Cert Manager + Let's Encrypt để cấu hình HTTPs với Ingress.

Chúng ta sẽ deploy Cert Manager sử dụng Helm Chart được cung cấp sẵn bởi Jetstack. Cái chart đó sẽ cài Cert Manager và CustomResources của nó. Chúng ta phải deploy thêm Issuer hoặc ClusterIssuer kèm theo để generate TLS certificate với Let's Encrypt. Lúc này có thể dùng theo hướng sử dụng Helm Chart trong kustomize lại hợp lý. 😃

Cách thức thực hiện thì mình cũng đã hướng dẫn và ứng dụng trong Phần 3: Bootstrap cluster sử dụng App of Apps pattern. Các bạn có thể tham khảo lại nhé.

Nếu các bạn vướng mắc ở bước nào có thể để lại comment phía dưới nhé! Cảm ơn các bạn đã đọc bài!


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.