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

0 0 0

Người đăng: Nguyễn Hữu Kim

Theo Viblo Asia

👋👋👋 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!

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!

Bình luận

Bài viết tương tự

- vừa được xem lúc

Deploying A Containerized Web Application On Kubernetes

1. Overview. Kubernetes is an open source project (available on kubernetes.io) which can run on many different environments, from laptops to high-availability multi-node clusters; from public clouds to on-premise deployments; from virtual machines to bare metal.

0 0 68

- vừa được xem lúc

Kubernetes - Học cách sử dụng Kubernetes Namespace cơ bản

Namespace trong Kubernetes là gì. Tại sao nên sử dụng namespace.

0 0 123

- vừa được xem lúc

[Kubernetes] Kubectl và các command cơ bản

Mở đầu. Kubectl là công cụ quản trị Kubernetes thông qua giao diện dòng lệnh, cho phép bạn thực thi các câu lệnh trong Kubernetes cluster.

0 0 69

- vừa được xem lúc

Triển khai EFK Stack trên Kubernetes

EFK stack on K8S. Giới thiệu. Một hệ thống có thể chạy nhiều dịch vụ hoặc ứng dụng khác nhau, vì vậy việc. theo dõi hệ thống là vô cùng cần thiết.

0 0 83

- vừa được xem lúc

Thực hành Kubernetes (K8S) bằng cách sử dụng lệnh Command

Bài hướng dẫn hôm nay sẽ hướng dẫn sử dụng K8S bằng cách sử dụng câu lệnh thay vì UI trên web. Có 2 lựa chọn để thực hiện:. . Sử dụng Cloud Shell.

0 0 64

- vừa được xem lúc

Kubernetes best practices - Liveness và Readiness Health checks

Mở đầu. Kubernetes cung cấp cho bạn một framework để chạy các hệ phân tán một cách mạnh mẽ.

0 0 61