👋👋👋 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é! Tiếp tục bài viết số 2 để đủ điều kiện nhận quà Viblo MayFest 2025, trong phần này mình sẽ đề cập cách để Deploy Helm Chart với ArgoCD.
Các cách deploy ứng dụng trong ArgoCD
Để bắt đầu nội dung ngày hôm nay. Mình sẽ tóm lược lại các cách để deploy ứng dụng với ArgoCD Application thành danh sách gồm 4 cách dưới đây. Trong đó, có 3 cách mình đã đề cập và sử dụng từ đầu Series tới giờ.
Cách 1: Dùng trực tiếp các file YAML thuần túy
Cách này ít dùng và mình có đề cập ngay từ bài viết đầu tiên. Lúc này Application trỏ trực tiếp tới thư mục chứa các file YAML thuần túy: Deployment, Service, Ingress, etc.
Cách này thì không tái sử dụng lại các file YAML đã tạo trước đó được. Các thông tin bị fix cứng. Với mỗi môi trường Staging, Production lại cần phải viết lại YAML mới.
Cách 2: Sử dụng Kustomize
Nâng cấp hơn một chút, chúng ta chuyển các file YAML ở cách 1 vào Kustomization và deploy bằng Kustomize. Cách này cho phép sử dụng lại được các các file YAML đã tạo trước đó. Có thêm nhiều tính năng linh hoạt.
Nhược điểm đó là phải tìm hiểu thêm về các tính năng của Kustomize như: components, transformer, generator, .etc.
Cách 3: Sử dụng Kustomize + Helm Chart
Cách này sẽ sử dụng Kustomize để deploy Helm Chart. Vừa tận dụng được các Helm Chart có sẵn, vừa deploy luôn các tài nguyên kèm theo. Đặc biệt là các tài nguyên kèm CRD chỉ có sau khi đã cài Helm Chart.
Mình lấy lại ví dụ khi deploy Cert Manager kèm theo luôn ClusterIssuer cho nó - Đây là CRD chỉ có sau khi cài chart cert-manager
. Nhược điểm là khá cồng kềnh, không ghi đè được values cho Helm chart khi thực hiện overlay.
Cách 4: Sử dụng Helm Chart
Application sẽ deploy thẳng Helm Chart. Ưu điểm là đơn giản hơn, linh hoạt nhưng với ArgoCD <= v2.5 khi chưa có tính năng multi-sources thì file values.yaml
và chart phải cùng chung một repo. Hoặc là phải khai báo inline-values ngay trong spec của Application hoặc phải cài theo dạng sub-chart (tức bạn phải viết lại một cái chart mới trong Git Repository chứa cái chart đang cần cài 🤦).
Deploy Helm Chart
ArgoCD <= v2.5
Trước khi tính năng Multi-Sources xuất hiện trong v2.6 thì các phiên bản trước đó khi muốn deploy Helm Chart mình sẽ phải tạo Application và inline-values vào trong đó như này:
project: infra
destination: namespace: ingress-nginx name: teguru-production
syncPolicy: automated: prune: true selfHeal: true syncOptions: - CreateNamespace=true - ApplyOutOfSyncOnly=true
ignoreDifferences: - group: argoproj.io kind: Application jsonPointers: - /status
source: repoURL: https://kubernetes.github.io/ingress-nginx targetRevision: 4.12.2 chart: ingress-nginx helm: releaseName: ingress-nginx values: controller: replicaCount: 2
Nguyên nhân là do Application chỉ chấp nhận 1 source. Application trên của mình thì source.repoURL
đang trỏ tới Helm Repository của Ingress Nginx. Trong khi các file custom.values.yaml
của mình cần thì lại ở trong Git Repository. Dù có chỉ định helm.valueFiles
thì sẽ ăn ngay quả báo lỗi không tìm thấy file custom.values.yaml
trong repo. Nó chỉ tìm thấy khi file custom.values.yaml
phải được đóng gói ngay sẵn trong Chart.
Lúc đấy mọi người thường tạo lại Chart trong GitOps Repository. Ví dụ như cái ingress-nginx trên mình sẽ tạo lại chart như sau:
apiVersion: v2
name: ingress-nginx
version: 4.12.2 dependencies:
- name: ingress-nginx repository: https://kubernetes.github.io/ingress-nginx version: 4.12.2
Chỉ cài một chart đơn giản mà lúc đấy thực tế trông nó nhiều file như thế này:
ArgoCD v2.6+
Phiên bản ArgoCD ở thời điểm viết bài này đang là v3.0.2, chúng ta sẽ không còn phải làm như trên để deploy Helm chart nữa do ArgoCD v2.6 đã cho phép Application đọc từ nhiều nguồn khác nhau (Multi-Sources).
Chúng ta sẽ setup Application có:
- 1 source đọc từ Helm Repository để sử dụng Helm Chart.
- 1 source đọc từ Git Repository để đọc các file
custom.values.yaml
.
Mình sẽ viết lại spec
cho Application như sau:
project: infra
destination: namespace: ingress-nginx name: teguru-production
syncPolicy: automated: prune: true selfHeal: true syncOptions: - CreateNamespace=true - ApplyOutOfSyncOnly=true
ignoreDifferences: - group: argoproj.io kind: Application jsonPointers: - /status
sources: - repoURL: https://kubernetes.github.io/ingress-nginx targetRevision: 4.12.2 chart: ingress-nginx helm: releaseName: ingress-nginx valueFiles: - $values/apps/infra/ingress-nginx/production.values.yaml - repoURL: https://github.com/teguru-labs/fleet-infra targetRevision: main ref: values
Ở cái source thứ 2, các bạn sẽ thấy mình trỏ tới Git Repository, đặt tên reference cho nó là values
. Đặt reference để mang qua dùng cho cái source đầu tiên. Mình chỉ định các file values tùy chỉnh thông qua trường helm.valueValues
. Cú pháp $values
ở đầu đường dẫn thư mục chính là để reference sang source có ref: values
.
Tổng kết
Kết quả sau commit vào trong Git rồi đợi ArgoCD đồng bộ mình các bạn sẽ thu được kết quả tương tự như mình dưới đây:
Nếu bạn bấm vào Details > Sources thì sẽ thấy nhiều nguồn được hiển thị ra, kiểu như này:
Như vậy, trong bài viết này mình thống kê lại các cách để cách bạn có thể lựa chọn và deploy ứng dụng lên K8s thông qua ArgoCD. Nếu các bạn có thắc mắc nào khác có thể comment xuống phía dưới để mình cùng thảo luận nha. Cảm ơn các bạn đã đọc bài!