👋👋👋 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ườngdev
, kế thừa từbase
.staging
: Là folder chứa các file YAML chỉ deploy cho môi trườngStaging
, kế thừa từbase
.production
: Là folder chứa các file YAML chỉ deploy cho môi trườngProduction
, 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ụ, trongbase
Deployment córeplicas: 1
nhưng trongstaging
bạn có thể sửareplicas: 2
vàproduction
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ênbranch
trong repository sẽ dùng.spec.source.path
: Chính là đường dẫn tới folder kustomizeproduction
.
Đố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ụcapps/whoami/staging
.whoami-production
: Deploy Kustomization tại thư mụcapps/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!