0

Lab 4 — Deploy Application with ArgoCD

🎯 1. Mục tiêu

Sau Lab này, bạn sẽ:

  • Hiểu cách ArgoCD lấy Kubernetes Manifest từ Git.
  • Tạo một ArgoCD Application để deploy Todo App.
  • Thực hiện Manual SyncAutomatic Sync.
  • Hiểu trạng thái Synced, OutOfSync, Healthy.
  • Biết cách kiểm tra khi ArgoCD deploy application không thành công.

Prerequisites

  • Đã hoàn thành Lab 1–3.
  • Có Kubernetes Cluster đang chạy.
  • Đã cài ArgoCD.
  • Đã có Todo App hoặc một Kubernetes application có Manifest.
  • Có Git Repository chứa Kubernetes Manifest.

🤔 2. Vấn đề thực tế

Giả sử bạn có Todo App gồm:

Frontend
Backend
PostgreSQL

Nếu deploy thủ công, mỗi lần thay đổi configuration bạn có thể phải chạy:

kubectl apply -f namespace.yaml
kubectl apply -f backend.yaml
kubectl apply -f frontend.yaml
kubectl apply -f postgres.yaml

Lúc đầu không có vấn đề gì.

Nhưng khi team bắt đầu phát triển:

Developer A ──┐
Developer B ──┼──► Git
Developer C ──┘
                 │
                 ▼
            Kubernetes

Bạn sẽ bắt đầu gặp các câu hỏi:

  • Manifest hiện tại trên Kubernetes có giống Git không?
  • Ai đã thay đổi Deployment?
  • Thay đổi đó có được commit không?
  • Nếu Pod bị sửa thủ công thì làm sao đưa về trạng thái chuẩn?
  • Có cần SSH vào server để deploy không?

Đây chính là vấn đề mà GitOps muốn giải quyết.

Với ArgoCD, flow sẽ trở thành:

Developer
    │
    │ git push
    ▼
┌───────────────┐
│ Git Repository│
│               │
│ Kubernetes    │
│ Manifests     │
└───────┬───────┘
        │
        │ Watch
        ▼
┌───────────────┐
│    ArgoCD     │
└───────┬───────┘
        │
        │ Sync
        ▼
┌───────────────┐
│  Kubernetes   │
│               │
│ Todo App      │
└───────────────┘

Điểm quan trọng:

Bạn không còn nói với Kubernetes: "Hãy chạy file YAML này."

Thay vào đó, bạn nói với ArgoCD: "Application của tôi được định nghĩa trong Git. Hãy đảm bảo Kubernetes giống Git."


🧠 3. Hiểu nhanh

3.1. ArgoCD Application là gì?

ArgoCD Application là một resource mô tả:

Deploy cái gì, lấy từ Git ở đâu và deploy vào Kubernetes nào.

Có thể hình dung:

              ArgoCD Application
                     │
       ┌─────────────┼─────────────┐
       │             │             │
       ▼             ▼             ▼
    Git Repo       Path        Kubernetes
       │                           │
       │                           │
       ▼                           ▼
 manifests/                  todo-app

Ví dụ:

spec:
  source:
    repoURL: https://github.com/example/gitops.git
    path: apps/todo
  destination:
    server: https://kubernetes.default.svc
    namespace: todo-app

Bạn chỉ cần hiểu 3 thông tin chính:

Thành phần Ý nghĩa
repoURL Git Repository chứa Manifest
path Folder chứa Application
destination Kubernetes Cluster + Namespace cần deploy

3.2. Git là Source of Truth

Trong GitOps, Git được xem là Source of Truth.

Ví dụ Git có:

replicas: 3

thì Kubernetes được kỳ vọng có:

replicas = 3

Nếu Kubernetes đang có:

replicas = 5

ArgoCD phát hiện:

Git              Kubernetes
replicas: 3      replicas: 5
     │                 │
     └───── Diff ─────┘
              │
              ▼
         OutOfSync

Đây là một trong những ý tưởng quan trọng nhất của GitOps.


🏗️ 4. Architecture

Trong Lab này, chúng ta sử dụng mô hình:

                    GitHub
                      │
                      │ Kubernetes YAML
                      ▼
              ┌───────────────┐
              │ Git Repository│
              │               │
              │ apps/         │
              │   todo/       │
              └───────┬───────┘
                      │
                      │ Watch / Pull
                      ▼
              ┌───────────────┐
              │    ArgoCD     │
              │               │
              │ Application   │
              └───────┬───────┘
                      │
                      │ Sync
                      ▼
              ┌───────────────┐
              │   Kubernetes  │
              │               │
              │ namespace     │
              │ deployment    │
              │ service       │
              └───────┬───────┘
                      │
                      ▼
                  Todo App

Có một điểm rất đáng chú ý:

ArgoCD không cần bạn SSH vào Kubernetes Node để deploy.

ArgoCD chạy bên trong Kubernetes và sử dụng Kubernetes API để tạo/update resources.


📁 5. Chuẩn bị Git Repository

5.1. Tạo cấu trúc Repository

Tạo một Git Repository dành cho GitOps.

Ví dụ:

gitops-repo/
│
└── apps/
    │
    └── todo/
        ├── namespace.yaml
        ├── backend.yaml
        ├── frontend.yaml
        ├── postgres.yaml
        └── services.yaml

Trong production, repository thường được tổ chức rõ ràng hơn:

gitops-repo/
│
├── apps/
│   ├── todo/
│   └── nginx/
│
├── environments/
│   ├── dev/
│   ├── staging/
│   └── production/
│
└── README.md

Nhưng trong Lab này, chúng ta bắt đầu đơn giản.


5.2. Kiểm tra Manifest

Ví dụ:

kubectl apply --dry-run=client -f apps/todo/

Nếu Manifest hợp lệ, bạn có thể commit:

git add .
git commit -m "Add todo application manifests"
git push

💡 Tại sao nên kiểm tra trước?

ArgoCD sẽ đọc Manifest từ Git.

Nếu YAML sai:

Git
 │
 ▼
ArgoCD
 │
 ▼
Invalid Manifest
 │
 ▼
❌ Sync Failed

Vì vậy:

Git commit không có nghĩa là application chắc chắn deploy thành công.


🚀 6. Tạo ArgoCD Application

Bây giờ chúng ta nói với ArgoCD:

"Hãy lấy Todo App từ Git Repository này và deploy vào Kubernetes."

Có hai cách tạo Application:

CLI
 │
 └── argocd app create

Manifest
 │
 └── Application YAML

Trong GitOps, cách thứ hai thường phù hợp hơn vì chính Application definition cũng có thể được quản lý bằng Git.

Nhưng để hiểu bản chất, Lab này sẽ bắt đầu bằng CLI.


6.1. Kiểm tra ArgoCD

Kiểm tra ArgoCD:

kubectl get pods -n argocd

Bạn cần thấy các Pod chính đang chạy:

argocd-server
argocd-repo-server
argocd-application-controller

Nếu các thành phần này chưa chạy, quay lại Lab 3 — Install ArgoCD.


6.2. Đăng nhập ArgoCD CLI

Kiểm tra:

argocd version

Nếu chưa login:

argocd login localhost:8080

Trong trường hợp ArgoCD Server đang được port-forward:

kubectl port-forward svc/argocd-server \
  -n argocd 8080:443

Sau đó:

argocd login localhost:8080 --insecure

Đăng nhập bằng account đã tạo trong Lab 3.


🧩 7. Tạo Application

Giả sử Git Repository của bạn là:

https://github.com/<your-user>/gitops-repo.git

Tạo Application:

argocd app create todo-app \
  --repo https://github.com/<your-user>/gitops-repo.git \
  --path apps/todo \
  --dest-server https://kubernetes.default.svc \
  --dest-namespace todo-app

Hãy đọc command này theo cách đơn giản:

todo-app
   │
   ├── Repo: GitHub repository
   │
   ├── Path: apps/todo
   │
   ├── Cluster: Kubernetes hiện tại
   │
   └── Namespace: todo-app

Không cần học thuộc command.

Điều quan trọng là hiểu:

Git Repository
      +
    Path
      +
 Destination
      ↓
ArgoCD Application

🔍 8. Kiểm tra Application

Chạy:

argocd app list

Bạn có thể thấy:

NAME       CLUSTER                         NAMESPACE   STATUS
todo-app   https://kubernetes.default.svc  todo-app    OutOfSync

Tại sao OutOfSync?

Bởi vì:

Git
 │
 │ manifests tồn tại
 ▼
ArgoCD
 │
 │ chưa deploy
 ▼
Kubernetes
 │
 └── chưa giống Git

Đây là trạng thái hoàn toàn bình thường.


🔄 9. Sync Application

Bây giờ hãy yêu cầu ArgoCD đồng bộ:

argocd app sync todo-app

ArgoCD sẽ thực hiện:

Git
 │
 │ Read Manifest
 ▼
ArgoCD
 │
 │ Compare
 ▼
Kubernetes
 │
 │ Apply
 ▼
Todo App

Sau đó kiểm tra:

argocd app get todo-app

Bạn muốn thấy:

Sync Status:    Synced
Health Status:  Healthy

👀 10. See Result — Kiểm tra Kubernetes

Kiểm tra namespace:

kubectl get ns

Kiểm tra resources:

kubectl get all -n todo-app

Ví dụ:

NAME                              READY   STATUS
pod/todo-backend-xxxxx            1/1     Running
pod/todo-frontend-xxxxx           1/1     Running
pod/todo-postgres-xxxxx           1/1     Running

NAME                    TYPE        CLUSTER-IP
service/todo-backend    ClusterIP   10.x.x.x
service/todo-frontend   ClusterIP   10.x.x.x
service/todo-postgres   ClusterIP   10.x.x.x

Điều quan trọng ở đây:

Bạn không chạy:

kubectl apply -f ...

nhưng application vẫn được deploy.

Lý do:

Git
 ↓
ArgoCD
 ↓
Kubernetes

📊 11. Quan sát Application trên ArgoCD UI

Mở ArgoCD UI.

Bạn sẽ thấy:

todo-app

Sync:   Synced
Health: Healthy

ArgoCD cũng hiển thị dependency giữa các resource:

todo-app
   │
   ├── Namespace
   │
   ├── Deployment
   │      │
   │      └── ReplicaSet
   │              │
   │              └── Pod
   │
   └── Service

Đây là một trong những điểm rất hay của ArgoCD:

Thay vì phải chạy nhiều kubectl get ..., bạn có thể nhìn application từ góc nhìn tổng thể.


🧪 12. Exercise — Thay đổi Application

Bây giờ chúng ta thử điều quan trọng nhất của GitOps.

Giả sử Deployment đang có:

spec:
  replicas: 1

Thay thành:

spec:
  replicas: 2

Commit:

git add .
git commit -m "Scale todo backend to 2 replicas"
git push

Nếu Application đang sử dụng Manual Sync, ArgoCD sẽ phát hiện:

Git                    Kubernetes

replicas: 2             replicas: 1
     │                       │
     └─────── Diff ──────────┘
                  │
                  ▼
              OutOfSync

Kiểm tra:

argocd app get todo-app

Bạn sẽ thấy:

Sync Status: OutOfSync

🔄 13. Sync lần nữa

Chạy:

argocd app sync todo-app

Sau đó:

kubectl get deployment -n todo-app

Bạn sẽ thấy:

READY
2/2

Flow lúc này:

Developer
    │
    │ git push
    ▼
Git
    │
    ▼
ArgoCD
    │
    │ detect change
    ▼
Sync
    │
    ▼
Kubernetes
    │
    ▼
2 replicas

Đây chính là GitOps workflow cơ bản.


⚡ 14. Bật Automatic Sync

Manual Sync nghĩa là:

Git change
    │
    ▼
ArgoCD detects
    │
    ▼
Developer
    │
    │ argocd app sync
    ▼
Kubernetes

Trong production, chúng ta thường muốn giảm thao tác thủ công.

Có thể bật:

Automatic Sync

Bằng command:

argocd app set todo-app --sync-policy automated

Kiểm tra:

argocd app get todo-app

🧪 15. Exercise — Test Automatic Sync

Tiếp tục thay đổi:

replicas: 3

Commit:

git add .
git commit -m "Scale todo backend to 3 replicas"
git push

Lần này không chạy:

argocd app sync todo-app

Chờ ArgoCD phát hiện Git thay đổi.

Kiểm tra:

kubectl get deployment -n todo-app

Nếu Automatic Sync hoạt động:

READY
3/3

Bạn vừa tạo được flow:

git push
   │
   ▼
ArgoCD
   │
   │ automatic sync
   ▼
Kubernetes

Đây mới là trải nghiệm GitOps mà chúng ta muốn hướng tới.


🛡️ 16. Self-Healing — ArgoCD tự sửa Drift

Đây là một tính năng rất quan trọng.

Drift nghĩa là:

Kubernetes đã khác với trạng thái được định nghĩa trong Git.

Ví dụ Git:

replicas: 3

Nhưng một developer chạy:

kubectl scale deployment todo-backend \
  --replicas=1 \
  -n todo-app

Bây giờ:

Git              Kubernetes

3 replicas       1 replica
    │                 │
    └──── Drift ──────┘

ArgoCD sẽ phát hiện:

OutOfSync

Nếu bật Self-Healing:

argocd app set todo-app \
  --sync-policy automated \
  --self-heal

ArgoCD có thể tự đưa Kubernetes về trạng thái Git:

Git
 │
 │ replicas = 3
 ▼
ArgoCD
 │
 │ detect drift
 ▼
Kubernetes
 │
 └── replicas = 3

💡 Tư duy quan trọng

GitOps không chỉ là:

"Deploy application bằng Git."

Mà còn là:

"Đảm bảo hệ thống luôn hướng về trạng thái được định nghĩa trong Git."


🧹 17. Prune — Xóa Resource không còn trong Git

Giả sử Git có:

Deployment
Service
ConfigMap

Sau đó bạn xóa:

ConfigMap

khỏi Git.

Nếu chỉ sync thông thường, resource cũ có thể vẫn tồn tại tùy policy.

Trong GitOps, chúng ta thường muốn:

Git
 │
 ├── Deployment
 └── Service

       ↓

Kubernetes
 │
 ├── Deployment
 └── Service

Resource không còn được Git quản lý sẽ được loại bỏ khi prune được bật.

Có thể bật:

argocd app set todo-app \
  --sync-policy automated \
  --auto-prune

⚠️ Production Warning

auto-prune rất mạnh.

Nếu bạn vô tình xóa resource khỏi Git:

Git
 │
 │ resource deleted
 ▼
ArgoCD
 │
 │ auto-prune
 ▼
Kubernetes
 │
 └── resource deleted

Vì vậy:

Không nên bật auto-prune một cách thiếu kiểm soát trên production.

Cần có:

  • Pull Request review.
  • Branch protection.
  • CI validation.
  • Permission phù hợp.
  • Backup đối với dữ liệu quan trọng.

🔎 18. Exercise — Tạo Drift

Đây là bài thực hành quan trọng nhất của Lab.

Bước 1 — Kiểm tra Git

Giả sử:

replicas: 3

Bước 2 — Thay đổi trực tiếp Kubernetes

kubectl scale deployment todo-backend \
  --replicas=1 \
  -n todo-app

Bước 3 — Kiểm tra

kubectl get deployment -n todo-app

Bạn sẽ thấy:

1/1

Bước 4 — Kiểm tra ArgoCD

argocd app get todo-app

Nếu Self-Healing chưa bật:

Sync Status: OutOfSync

Nếu đã bật Self-Healing:

ArgoCD
   │
   │ detect drift
   ▼
Auto Sync
   │
   ▼
replicas = 3

Kiểm tra lại:

kubectl get deployment -n todo-app

Kết quả mong đợi:

3/3

🎯 Bạn vừa tận mắt thấy GitOps Self-Healing hoạt động.


🧠 19. Hiểu trạng thái của ArgoCD

Khi làm việc với ArgoCD, bạn sẽ thường xuyên gặp hai khái niệm:

Sync Status
Health Status

Sync Status

Cho biết:

Kubernetes có giống Git không?

Synced
    ↓
Git = Kubernetes
OutOfSync
    ↓
Git ≠ Kubernetes

Health Status

Cho biết:

Application có đang hoạt động bình thường không?

Ví dụ:

Healthy
Progressing
Degraded
Missing
Unknown

Vì vậy có thể xảy ra:

Synced + Healthy

→ Git đúng với Kubernetes và application đang chạy tốt.

Hoặc:

Synced + Degraded

→ Kubernetes đúng với Git nhưng application đang lỗi.

Đây là điểm rất quan trọng.

Synced không có nghĩa là application đang khỏe.


🐛 20. Troubleshooting cơ bản

20.1. Application bị OutOfSync

Kiểm tra:

argocd app diff todo-app

Command này cho bạn biết:

Git                  Kubernetes
────────────────────────────────
replicas: 3          replicas: 1

Sau đó kiểm tra:

argocd app sync todo-app

20.2. Application bị Degraded

Đầu tiên:

kubectl get pods -n todo-app

Nếu Pod:

CrashLoopBackOff
ImagePullBackOff
Pending

thì vấn đề có thể nằm ở application chứ không phải ArgoCD.

Xem chi tiết:

kubectl describe pod <pod-name> -n todo-app

Xem log:

kubectl logs <pod-name> -n todo-app

💡 Kinh nghiệm thực tế

Đừng thấy:

ArgoCD = Red

rồi kết luận:

"ArgoCD bị lỗi."

ArgoCD có thể chỉ đang báo rằng application của bạn đang lỗi.


🔐 21. Production Tips

21.1. Không nên deploy production bằng kubectl thủ công

Không phải tuyệt đối cấm kubectl.

Nhưng production nên ưu tiên:

Pull Request
     ↓
Review
     ↓
Merge
     ↓
Git
     ↓
ArgoCD
     ↓
Kubernetes

Thay vì:

SSH
 ↓
kubectl edit
 ↓
Production

21.2. Git nên có Pull Request Review

Thay vì:

Developer
    │
    │ push directly
    ▼
main

Nên:

Developer
    │
    ▼
Feature Branch
    │
    ▼
Pull Request
    │
    ├── CI
    ├── Validation
    └── Review
         │
         ▼
       main
         │
         ▼
       ArgoCD

Điều này giúp tránh việc một thay đổi YAML sai làm production deployment thất bại.


21.3. Không commit Secret trực tiếp

Không nên:

stringData:
  password: my-production-password

rồi commit vào Git.

Ở các Lab tiếp theo chúng ta sẽ xử lý vấn đề này bằng các giải pháp như:

Sealed Secrets
External Secrets
Secret Manager
Vault

🧪 22. Final Exercise

Hãy tự thực hiện toàn bộ flow mà không nhìn lại các bước phía trên.

Task

  1. Tạo Git Repository.
  2. Đưa Todo App Manifest vào Git.
  3. Tạo ArgoCD Application.
  4. Deploy application.
  5. Kiểm tra Synced.
  6. Kiểm tra Healthy.
  7. Bật Automatic Sync.
  8. Thay đổi replicas từ 3 → 4.
  9. Push Git.
  10. Quan sát ArgoCD tự deploy.
  11. Dùng kubectl scale để tạo Drift.
  12. Bật Self-Healing.
  13. Quan sát ArgoCD tự khôi phục trạng thái.

Flow cuối cùng cần đạt:

                    Developer
                        │
                        │ git push
                        ▼
                 ┌─────────────┐
                 │     Git     │
                 │ Source of   │
                 │   Truth     │
                 └──────┬──────┘
                        │
                        │ Detect Change
                        ▼
                 ┌─────────────┐
                 │   ArgoCD    │
                 │             │
                 │ Auto Sync   │
                 │ Self-Heal   │
                 └──────┬──────┘
                        │
                        │ Reconcile
                        ▼
                 ┌─────────────┐
                 │ Kubernetes  │
                 │             │
                 │ Todo App    │
                 └─────────────┘

🧠 23. Tổng kết

Trước Lab:

Developer
    │
    │ kubectl apply
    ▼
Kubernetes

Sau Lab:

Developer
    │
    │ git push
    ▼
Git
    │
    ▼
ArgoCD
    │
    ▼
Kubernetes

Bạn đã xây dựng được vòng lặp GitOps cơ bản:

             ┌──────────────────────┐
             │                      │
             ▼                      │
           Git ──► ArgoCD ──► Kubernetes
             ▲                      │
             │                      │
             └────── Drift ─────────┘

Điểm quan trọng nhất cần nhớ không phải là command:

argocd app create
argocd app sync

mà là tư duy:

Git định nghĩa trạng thái mong muốn. ArgoCD liên tục quan sát và đưa Kubernetes về trạng thái đó.

Ở Lab tiếp theo, chúng ta sẽ đi sâu hơn vào ArgoCD Sync, Self-Healing và các chiến lược đồng bộ, để hiểu rõ ArgoCD thực sự xử lý thay đổi như thế nào trong môi trường thực tế.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí