# ArgoCD và GitOps cho Kubernetes: Hướng dẫn triển khai liên tục và câu hỏi phỏng vấn 2026 > Tìm hiểu cách sử dụng ArgoCD để triển khai GitOps trên Kubernetes. Bài viết bao gồm cấu hình Application, Sync Waves, ApplicationSet và các câu hỏi phỏng vấn thường gặp. - Published: 2026-06-05 - Updated: 2026-06-05 - Author: SharpSkill - Tags: argocd, gitops, kubernetes, continuous-deployment, devops, interview - Reading time: 10 min --- Trong thế giới DevOps hiện đại, việc quản lý và triển khai ứng dụng trên Kubernetes đã trở thành một thách thức đáng kể khi quy mô hệ thống ngày càng mở rộng. ArgoCD đã nổi lên như một công cụ hàng đầu giúp các đội ngũ kỹ thuật áp dụng phương pháp GitOps một cách hiệu quả. Với khả năng tự động hóa việc đồng bộ trạng thái mong muốn từ Git repository đến Kubernetes cluster, ArgoCD mang đến sự minh bạch, khả năng kiểm soát và tính nhất quán cho quy trình triển khai liên tục. > **GitOps là gì?** > > GitOps là phương pháp vận hành hạ tầng và ứng dụng sử dụng Git làm nguồn chân lý duy nhất (single source of truth). Mọi thay đổi về cấu hình và trạng thái hệ thống đều được thực hiện thông qua Git commits, cho phép theo dõi lịch sử đầy đủ, rollback dễ dàng và tự động hóa triển khai thông qua các công cụ như ArgoCD. ## Hiểu về ArgoCD Application ArgoCD Application là đơn vị cơ bản nhất trong hệ sinh thái ArgoCD. Mỗi Application định nghĩa mối quan hệ giữa một source repository chứa cấu hình Kubernetes và destination cluster nơi các tài nguyên sẽ được triển khai. Việc hiểu rõ cấu trúc của Application manifest là nền tảng quan trọng để làm việc hiệu quả với ArgoCD. ```yaml # argocd-application.yaml apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: my-web-app namespace: argocd spec: project: default source: repoURL: https://github.com/acme/my-web-app-config targetRevision: main path: overlays/production destination: server: https://kubernetes.default.svc namespace: production syncPolicy: automated: prune: true # Remove resources deleted from Git selfHeal: true # Revert manual changes in the cluster syncOptions: - CreateNamespace=true ``` Trong cấu hình trên, trường `syncPolicy.automated` cho phép ArgoCD tự động đồng bộ khi phát hiện sự khác biệt giữa Git và cluster. Tùy chọn `prune: true` đảm bảo rằng các tài nguyên đã bị xóa khỏi Git cũng sẽ được xóa khỏi cluster, trong khi `selfHeal: true` sẽ hoàn tác mọi thay đổi thủ công được thực hiện trực tiếp trên cluster. ## Sync Waves và Resource Hooks Một trong những tính năng mạnh mẽ nhất của ArgoCD là khả năng kiểm soát thứ tự triển khai các tài nguyên thông qua Sync Waves và Resource Hooks. Điều này đặc biệt quan trọng khi cần thực hiện các tác vụ như database migration trước khi triển khai ứng dụng mới. ```yaml # migration-job.yaml apiVersion: batch/v1 kind: Job metadata: name: db-migrate annotations: argocd.argoproj.io/sync-wave: "-1" # Runs before wave 0 argocd.argoproj.io/hook: PreSync # Executes before main sync argocd.argoproj.io/hook-delete-policy: HookSucceeded spec: template: spec: containers: - name: migrate image: acme/my-web-app:latest command: ["python", "manage.py", "migrate"] restartPolicy: Never ``` Annotation `sync-wave: "-1"` đảm bảo rằng Job này sẽ chạy trước các tài nguyên ở wave 0 (mặc định). Hook `PreSync` chỉ định rằng Job sẽ được thực thi trước khi quá trình sync chính bắt đầu. Chính sách `HookSucceeded` sẽ tự động xóa Job sau khi hoàn thành thành công, giữ cho cluster luôn gọn gàng. ## ApplicationSet cho Multi-cluster Deployment Khi quản lý nhiều cluster hoặc môi trường khác nhau, việc tạo và duy trì nhiều Application manifest riêng lẻ trở nên cồng kềnh và dễ xảy ra sai sót. ApplicationSet giải quyết vấn đề này bằng cách cho phép định nghĩa một template duy nhất và tự động tạo ra các Application dựa trên các generators khác nhau. ```yaml # applicationset-clusters.yaml apiVersion: argoproj.io/v1alpha1 kind: ApplicationSet metadata: name: my-web-app-all-clusters namespace: argocd spec: generators: - clusters: selector: matchLabels: env: production template: metadata: name: 'my-web-app-{{name}}' spec: project: default source: repoURL: https://github.com/acme/my-web-app-config targetRevision: main path: 'overlays/{{metadata.labels.region}}' destination: server: '{{server}}' namespace: production syncPolicy: automated: prune: true selfHeal: true ``` Với cấu hình này, ArgoCD sẽ tự động tạo một Application cho mỗi cluster được gắn label `env: production`. Các biến như `{{name}}`, `{{server}}` và `{{metadata.labels.region}}` sẽ được thay thế bằng giá trị thực tế từ mỗi cluster, cho phép triển khai đồng nhất nhưng vẫn có thể tùy chỉnh theo từng vùng hoặc môi trường. ## Cấu trúc Repository được khuyến nghị Việc tổ chức cấu trúc repository một cách hợp lý là yếu tố then chốt để quản lý GitOps hiệu quả. Phương pháp phổ biến nhất là sử dụng Kustomize với cấu trúc base và overlays. ``` # Recommended repository structure my-web-app-config/ base/ deployment.yaml service.yaml kustomization.yaml overlays/ staging/ kustomization.yaml # Patches for staging replica-count.yaml production/ kustomization.yaml # Patches for production replica-count.yaml hpa.yaml ``` Thư mục `base` chứa các manifest chung được chia sẻ giữa tất cả môi trường. Mỗi thư mục trong `overlays` chứa các patches đặc thù cho từng môi trường, cho phép tùy chỉnh số replica, resource limits, hoặc thêm các tài nguyên riêng như HorizontalPodAutoscaler cho production. ## So sánh ArgoCD và Flux Khi lựa chọn công cụ GitOps cho Kubernetes, ArgoCD và Flux là hai ứng cử viên hàng đầu. Mỗi công cụ có những ưu điểm và nhược điểm riêng phù hợp với các trường hợp sử dụng khác nhau. | Feature | ArgoCD 3.4 | Flux 2.8 | |---------|-----------|----------| | Architecture | Centralized server with UI | Distributed controllers per cluster | | Web UI | Built-in, polished dashboard | No built-in UI (third-party options) | | Helm support | Renders templates server-side | Native Helm SDK integration | | Multi-cluster | Hub-and-spoke from single instance | Independent installation per cluster | | RBAC | Application-level with SSO | Kubernetes-native RBAC only | | Image automation | Separate Image Updater component | Built-in image reflector/automation | | Progressive delivery | Argo Rollouts integration | Flagger integration | | Resource footprint | Higher (API server, repo server, Redis) | Lower (only needed controllers) | ArgoCD phù hợp hơn cho các tổ chức cần giao diện web trực quan, quản lý multi-cluster tập trung và tích hợp SSO phức tạp. Trong khi đó, Flux là lựa chọn tốt hơn cho các đội ngũ ưu tiên kiến trúc phân tán, resource footprint thấp và tự động hóa cập nhật image container. > **Cấu hình Webhook** > > Để ArgoCD phản hồi ngay lập tức với các thay đổi trên Git, việc cấu hình webhook từ Git provider (GitHub, GitLab, Bitbucket) là cần thiết. Webhook sẽ thông báo cho ArgoCD mỗi khi có push event, giảm đáng kể thời gian chờ so với cơ chế polling mặc định (3 phút). ## Tạm dừng Reconciliation Trong một số tình huống như bảo trì cluster hoặc debug, việc tạm dừng quá trình reconciliation của ArgoCD là cần thiết. ArgoCD cung cấp annotation đặc biệt để thực hiện điều này ở cấp độ cluster. ```yaml # Pause reconciliation on a specific cluster apiVersion: v1 kind: Secret metadata: name: prod-cluster namespace: argocd labels: argocd.argoproj.io/secret-type: cluster annotations: argocd.argoproj.io/pause-reconciliation: "true" stringData: server: https://prod-cluster.example.com config: | { "tlsClientConfig": { "insecure": false } } ``` Khi annotation `pause-reconciliation` được đặt thành `"true"`, ArgoCD sẽ ngừng đồng bộ tất cả các Application được triển khai đến cluster đó. Đây là tính năng hữu ích khi cần thực hiện các thay đổi thủ công tạm thời hoặc khắc phục sự cố mà không bị ArgoCD tự động hoàn tác. ## Tính năng mới trong ArgoCD 3.4: Value Globs ArgoCD 3.4 giới thiệu tính năng Value Globs cho Helm charts, giúp đơn giản hóa đáng kể việc quản lý nhiều value files. Thay vì phải liệt kê từng file một cách thủ công, giờ đây có thể sử dụng wildcard patterns. ```yaml # Before ArgoCD 3.4 source: helm: valueFiles: - values.yaml - values-production.yaml - values-production-eu.yaml - values-production-eu-secrets.yaml # With ArgoCD 3.4 value globs source: helm: valueFiles: - values.yaml - values-production*.yaml ``` Tính năng này không chỉ giảm độ dài của manifest mà còn tự động bao gồm các value files mới được thêm vào mà không cần cập nhật Application manifest. Điều này đặc biệt hữu ích trong môi trường enterprise với nhiều cấu hình khác nhau cho từng region hoặc customer. ## Câu hỏi phỏng vấn thường gặp về ArgoCD và GitOps > **Chuẩn bị cho phỏng vấn** > > Các câu hỏi dưới đây thường xuất hiện trong các buổi phỏng vấn vị trí DevOps Engineer và Platform Engineer. Việc nắm vững không chỉ lý thuyết mà còn kinh nghiệm thực hành với ArgoCD sẽ tạo lợi thế đáng kể trong quá trình phỏng vấn. **1. GitOps khác gì so với CI/CD truyền thống?** CI/CD truyền thống thường sử dụng mô hình push-based, trong đó pipeline chủ động đẩy thay đổi đến môi trường đích. GitOps áp dụng mô hình pull-based, nơi một operator (như ArgoCD) liên tục so sánh trạng thái thực tế của cluster với trạng thái mong muốn được định nghĩa trong Git và tự động điều chỉnh để đạt được sự đồng nhất. **2. ArgoCD xử lý secrets như thế nào?** ArgoCD không mã hóa secrets một cách native. Các giải pháp phổ biến bao gồm: Sealed Secrets (mã hóa secrets với public key, chỉ có thể giải mã trong cluster), SOPS với Age hoặc AWS KMS, External Secrets Operator (đồng bộ secrets từ HashiCorp Vault, AWS Secrets Manager), và Vault Agent Injector. **3. Làm thế nào để rollback với ArgoCD?** Có nhiều phương pháp rollback: sử dụng Git revert để tạo commit mới hoàn tác thay đổi, sử dụng ArgoCD UI/CLI để sync với revision cũ hơn, hoặc cấu hình revision history limit để giữ lại các phiên bản trước đó. Phương pháp Git revert được khuyến nghị vì đảm bảo Git luôn là nguồn chân lý duy nhất. **4. Sync Waves hoạt động như thế nào?** Sync Waves cho phép kiểm soát thứ tự triển khai các tài nguyên. Mỗi tài nguyên có thể được gán một wave number thông qua annotation. ArgoCD sẽ triển khai theo thứ tự wave từ thấp đến cao, chờ mỗi wave hoàn thành và healthy trước khi tiến hành wave tiếp theo. Wave numbers có thể là số âm. **5. ArgoCD ApplicationSet generators có những loại nào?** Các generators phổ biến bao gồm: List (danh sách tĩnh), Cluster (dựa trên registered clusters), Git Directory (dựa trên cấu trúc thư mục), Git File (dựa trên file JSON/YAML), Matrix (kết hợp nhiều generators), và Merge (hợp nhất kết quả từ nhiều generators). **6. Làm thế nào để đảm bảo zero-downtime deployment với ArgoCD?** Kết hợp ArgoCD với Argo Rollouts để thực hiện canary hoặc blue-green deployment. Cấu hình proper readiness và liveness probes, sử dụng PodDisruptionBudget, và đảm bảo rolling update strategy được cấu hình đúng trong Deployment manifest. **7. ArgoCD Projects dùng để làm gì?** Projects cung cấp logical grouping và security boundaries cho các Applications. Chúng cho phép định nghĩa: allowed source repositories, allowed destination clusters và namespaces, allowed/denied Kubernetes resources, và RBAC policies riêng cho từng project. ## Kết luận ArgoCD đã khẳng định vị thế là công cụ GitOps hàng đầu cho Kubernetes với bộ tính năng phong phú và cộng đồng phát triển mạnh mẽ. Qua bài viết này, các điểm quan trọng cần ghi nhớ bao gồm: - **Application manifest** là đơn vị cơ bản định nghĩa mối quan hệ giữa Git repository và Kubernetes cluster - **Sync Waves và Hooks** cho phép kiểm soát chính xác thứ tự triển khai, đặc biệt quan trọng cho database migrations - **ApplicationSet** là giải pháp tối ưu cho multi-cluster và multi-environment deployment - **Cấu trúc repository** với Kustomize base/overlays giúp quản lý cấu hình hiệu quả và tái sử dụng cao - **So sánh với Flux** cho thấy mỗi công cụ có ưu điểm riêng phù hợp với các nhu cầu khác nhau - **Tính năng mới** như Value Globs trong ArgoCD 3.4 tiếp tục cải thiện trải nghiệm người dùng Việc nắm vững ArgoCD không chỉ giúp triển khai ứng dụng một cách nhất quán và an toàn mà còn là kỹ năng quan trọng được nhiều nhà tuyển dụng đánh giá cao trong lĩnh vực DevOps và Platform Engineering. --- Source: SharpSkill (https://sharpskill.dev), tech interview preparation for your real stack. HTML version of this page: https://sharpskill.dev/vi/blog/devops/argocd-gitops-kubernetes-continuous-deployment-interview-questions