0

Lab 5 — ArgoCD Sync & Self-Healing

🎯 1. Mục tiêu

Sau lab này, bạn sẽ hiểu và thực hành được:

  • 🔄 ArgoCD Sync là gì và tại sao cần Sync.
  • 👀 Phân biệt Git Desired State và trạng thái thực tế trên Kubernetes.
  • 🤖 Cấu hình Automated Sync để ArgoCD tự deploy khi Git thay đổi.
  • 🩹 Hiểu Self-Healing và cách ArgoCD tự sửa khi Kubernetes bị thay đổi ngoài Git.
  • 🧹 Hiểu Prune và tại sao resource bị xóa khỏi Git có thể cần được xóa khỏi cluster.

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

Ở Lab trước, chúng ta đã dùng ArgoCD để deploy application.

Nhưng hãy tưởng tượng một ngày developer thay đổi file:

deployment.yaml

và push lên Git.

Nếu ArgoCD đang ở chế độ Manual Sync, chuyện gì xảy ra?

Developer
    │
    │ git push
    ▼
Git Repository
    │
    │
    │   ArgoCD phát hiện có thay đổi
    ▼
┌──────────────┐
│   ArgoCD     │
│              │
│ OutOfSync ❗ │
└──────────────┘
       │
       │ Chưa deploy
       ▼
Kubernetes

Application trên Kubernetes chưa thay đổi.

DevOps Engineer phải vào ArgoCD và bấm:

SYNC

Nếu application có hàng chục lần thay đổi mỗi ngày, việc này nhanh chóng trở thành công việc thủ công không cần thiết.

Nhưng còn một vấn đề nguy hiểm hơn.

Một người có thể chạy:

kubectl edit deployment todo-backend -n todo-app

và thay đổi:

replicas: 3

thành:

replicas: 1

Git vẫn nói:

replicas: 3

nhưng Kubernetes đang chạy:

replicas: 1

Đây chính là configuration drift — trạng thái thực tế đã lệch khỏi trạng thái mong muốn trong Git.

ArgoCD có thể giải quyết cả hai vấn đề này bằng:

Automated Sync
        +
   Self-Healing
        +
      Prune

🧠 3. Hiểu nhanh

3.1. Desired State và Live State

Đây là concept quan trọng nhất của GitOps.

Desired State

Git chứa trạng thái mà chúng ta muốn Kubernetes có:

replicas: 3

Có thể hiểu:

"Tôi muốn application chạy 3 Pod."

Live State

Kubernetes đang thực sự chạy:

Deployment
replicas: 1

Có thể hiểu:

"Hiện tại cluster chỉ đang chạy 1 Pod."

ArgoCD liên tục so sánh hai trạng thái:

             Git
        Desired State
             │
             │
             ▼
        ┌─────────┐
        │ ArgoCD  │
        └────┬────┘
             │
             │ Compare
             ▼
        Kubernetes
          Live State

Nếu giống nhau:

Synced ✅

Nếu khác nhau:

OutOfSync ⚠️

🔄 4. Manual Sync

🧠 Explain

Ở chế độ Manual Sync:

Git change
    │
    ▼
ArgoCD detects change
    │
    ▼
OutOfSync
    │
    │ Manual action
    ▼
   Sync
    │
    ▼
Kubernetes updated

ArgoCD phát hiện thay đổi nhưng không tự deploy.

Điều này hữu ích khi bạn muốn kiểm soát deployment bằng tay.


🧪 Do

Trước tiên kiểm tra Application:

kubectl get applications -n argocd

Bạn có thể thấy:

NAME        SYNC STATUS   HEALTH
todo-app    Synced        Healthy

Bây giờ mở file Deployment trong Git repository.

Ví dụ:

spec:
  replicas: 2

Đổi thành:

spec:
  replicas: 3

Commit và push:

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

👀 See Result

Quay lại ArgoCD.

Bạn sẽ thấy:

SYNC STATUS

OutOfSync

Điều này có nghĩa:

Git:
replicas = 3

Kubernetes:
replicas = 2

ArgoCD biết có sự khác biệt nhưng chưa tự thay đổi cluster.

Bấm:

SYNC

Sau đó:

Synced ✅

Kiểm tra:

kubectl get deployment -n todo-app

Bạn sẽ thấy:

NAME           READY   UP-TO-DATE   AVAILABLE
todo-backend   3/3     3            3

🧠 Understand

Manual Sync phù hợp khi:

  • Production cần approval trước deployment.
  • Deployment cần thực hiện trong maintenance window.
  • Team muốn kiểm soát thời điểm release.

Nhưng với nhiều workload thông thường, chúng ta muốn Git thay đổi → cluster tự cập nhật.

Đó là lúc Automated Sync xuất hiện.


🤖 5. Automated Sync

🧠 Explain

Automated Sync cho phép ArgoCD tự động đồng bộ Kubernetes khi phát hiện Git thay đổi.

Thay vì:

Git
 │
 ▼
ArgoCD
 │
 ▼
OutOfSync
 │
 │ DevOps bấm Sync
 ▼
Kubernetes

chúng ta có:

Git
 │
 │ Change
 ▼
ArgoCD
 │
 │ Auto Sync
 ▼
Kubernetes

Đây là một trong những lợi ích quan trọng nhất của GitOps.


🏗️ 6. Architecture

Khi bật Automated Sync:

              Git Repository
              Desired State
                    │
                    │ git push
                    ▼
              ┌─────────────┐
              │   ArgoCD    │
              │             │
              │ Detect Diff │
              └──────┬──────┘
                     │
                     │ Auto Sync
                     ▼
              ┌─────────────┐
              │ Kubernetes  │
              │             │
              │ Live State  │
              └──────┬──────┘
                     │
                     │ Compare
                     └──────────────┐
                                    │
                              Same → Synced
                              Diff → Reconcile

ArgoCD hoạt động theo tư duy:

Git nói Kubernetes nên như thế nào → ArgoCD cố gắng đưa Kubernetes về trạng thái đó.


🧪 7. Bật Automated Sync

🧠 Explain

Chúng ta có thể bật Automated Sync cho ArgoCD Application.

Nếu Application được quản lý bằng manifest, phần quan trọng sẽ giống như:

spec:
  syncPolicy:
    automated: {}

Ví dụ:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: todo-app
  namespace: argocd
spec:
  source:
    repoURL: https://github.com/example/todo-gitops.git
    targetRevision: main
    path: kubernetes
  destination:
    server: https://kubernetes.default.svc
    namespace: todo-app

  syncPolicy:
    automated: {}

Bạn không cần học thuộc manifest này.

Chỉ cần nhớ:

syncPolicy
    │
    └── automated
             │
             └── ArgoCD tự Sync

🧪 Do

Nếu Application đang được quản lý bằng YAML, thêm:

syncPolicy:
  automated: {}

Sau đó apply:

kubectl apply -f application.yaml

Kiểm tra:

kubectl get application todo-app -n argocd

🧪 8. Test Automated Sync

🧠 Explain

Bây giờ chúng ta kiểm tra xem ArgoCD có thực sự tự deploy hay không.


🧪 Do

Trong Git repository, thay đổi:

replicas: 3

thành:

replicas: 4

Commit:

git add .
git commit -m "scale todo backend"
git push

Không bấm Sync trong ArgoCD.


👀 See Result

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

Sau đó kiểm tra:

kubectl get deployment -n todo-app

Bạn sẽ thấy:

NAME           READY   UP-TO-DATE   AVAILABLE
todo-backend   4/4     4            4

Không cần:

kubectl apply

Không cần:

argocd app sync

Không cần bấm nút Sync.


🧠 Understand

Flow hiện tại là:

Developer
    │
    │ git push
    ▼
Git Repository
    │
    ▼
ArgoCD
    │
    │ Automated Sync
    ▼
Kubernetes

Đây chính là GitOps workflow mà chúng ta muốn xây dựng.


🩹 9. Self-Healing

🧠 Explain

Automated Sync giải quyết vấn đề:

Git thay đổi → Kubernetes tự cập nhật.

Nhưng chúng ta còn một vấn đề khác:

Kubernetes bị thay đổi trực tiếp.

Ví dụ Git đang quy định:

replicas: 4

Nhưng một người chạy:

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

Bây giờ:

Git
replicas = 4
     │
     │
     ▼
   ArgoCD
     │
     │ Diff
     ▼
Kubernetes
replicas = 1

Cluster đã drift khỏi Git.

Nếu chỉ có Automated Sync, ArgoCD chủ yếu phản ứng với thay đổi từ Git.

Self-Healing giúp ArgoCD phát hiện và sửa drift trong cluster để đưa Live State quay về Desired State.


🏗️ 10. Self-Healing Architecture

              Git
        Desired State
             │
             ▼
         ┌────────┐
         │ ArgoCD │
         └───┬────┘
             │
             │ Compare
             ▼
        Kubernetes
         Live State
             │
             │
       Manual Change
             │
             ▼
       replicas = 1
             │
             │ Drift detected
             ▼
         ┌────────┐
         │ ArgoCD │
         │ Heal   │
         └───┬────┘
             │
             ▼
       replicas = 4

Tư duy rất đơn giản:

Git = Truth
       ↓
Cluster drift
       ↓
ArgoCD detects
       ↓
ArgoCD repairs

⚙️ 11. Bật Self-Healing

🧠 Explain

Self-Healing được bật cùng Automated Sync:

syncPolicy:
  automated:
    selfHeal: true

Thông thường bạn sẽ thấy:

syncPolicy:
  automated:
    selfHeal: true

Có thể hiểu:

automated
    │
    ├── Git change → Auto Sync
    │
    └── Cluster drift → Self-Heal

🧪 12. Test Self-Healing

🧪 Do

Giả sử Git đang quy định:

replicas: 4

Kiểm tra:

kubectl get deployment todo-backend -n todo-app

Kết quả:

READY
4/4

Bây giờ cố tình tạo drift:

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

Kiểm tra:

kubectl get deployment todo-backend -n todo-app

Bạn có thể thấy:

READY
1/1

Nhưng đừng sửa Git.

Hãy chờ ArgoCD reconcile.


👀 13. See Result

Sau một khoảng thời gian ngắn, kiểm tra lại:

kubectl get deployment todo-backend -n todo-app

Kết quả sẽ quay lại:

READY
4/4

ArgoCD đã phát hiện:

Desired State = 4

Live State = 1

và thực hiện:

1 → 4

🧠 14. Understand

Đây chính là Self-Healing.

Bạn có thể hình dung ArgoCD giống như một người giám sát:

Git:
"Application phải có 4 replicas."

Kubernetes:
"Hiện tại tôi chỉ có 1."

ArgoCD:
"Không đúng với Git."

ArgoCD:
"Tôi sửa lại."

Kubernetes:
"OK → 4 replicas."

Điểm quan trọng:

Self-Healing không phải backup hay disaster recovery.

Nó chỉ giúp đưa resource Kubernetes trở lại trạng thái được định nghĩa trong Git.


🧹 15. Prune

🧠 Explain

Có một tình huống khác.

Git ban đầu có:

deployment.yaml
service.yaml
configmap.yaml

ArgoCD deploy cả 3:

Kubernetes

Deployment
Service
ConfigMap

Sau đó developer xóa:

configmap.yaml

khỏi Git.

Nếu chỉ Sync thông thường, resource cũ có thể vẫn tồn tại trong cluster tùy cấu hình.

Đây là lúc Prune hữu ích.

Prune có ý nghĩa:

Resource không còn được Git quản lý nữa → xóa resource đó khỏi cluster.


🏗️ 16. Automated Sync + Self-Healing + Prune

Đây là cấu hình thường gặp:

syncPolicy:
  automated:
    prune: true
    selfHeal: true

Tư duy:

              Git
               │
               ▼
            ArgoCD
               │
       ┌───────┼────────┐
       │       │        │
       ▼       ▼        ▼
    Sync    Self-Heal  Prune
       │       │        │
       ▼       ▼        ▼
   Git diff   Drift   Deleted
       │       │        │
       └───────┼────────┘
               ▼
          Kubernetes

🧪 17. Test Prune

🧪 Do

Giả sử Git đang có:

kubernetes/
├── deployment.yaml
├── service.yaml
└── configmap.yaml

ArgoCD đã deploy:

kubectl get configmap -n todo-app

Bây giờ xóa configmap.yaml khỏi Git:

git rm kubernetes/configmap.yaml
git commit -m "remove unused configmap"
git push

Nếu:

prune: true

ArgoCD sẽ nhận ra resource này không còn thuộc Desired State.


👀 18. See Result

Sau khi ArgoCD reconcile:

kubectl get configmap -n todo-app

ConfigMap tương ứng sẽ bị xóa.

Flow:

configmap.yaml
      │
      │ git rm
      ▼
Git
      │
      ▼
ArgoCD
      │
      │ Prune
      ▼
Kubernetes
      │
      ▼
ConfigMap deleted

⚠️ 19. Cẩn thận với Prune trong Production

Đây là một kinh nghiệm rất quan trọng.

prune: true rất mạnh.

Nếu một resource bị xóa khỏi Git do:

  • Git merge nhầm.
  • Developer xóa nhầm file.
  • CI/CD generate manifest sai.
  • Repository bị rollback sai.

ArgoCD có thể hiểu:

"Resource này không còn trong Desired State → xóa nó."

Vì vậy production cần:

Git review
   ↓
Pull Request
   ↓
CI validation
   ↓
Approval
   ↓
Merge
   ↓
ArgoCD

Không nên để việc thay đổi production phụ thuộc vào một cú git push thiếu kiểm soát.


🔍 20. Kiểm tra trạng thái Sync

Bạn có thể kiểm tra Application bằng:

kubectl get application -n argocd

Ví dụ:

NAME       SYNC STATUS   HEALTH
todo-app   Synced        Healthy

Các trạng thái quan trọng:

Trạng thái Ý nghĩa
Synced Git và Kubernetes đang giống nhau
OutOfSync Git và Kubernetes đang khác nhau
Healthy Application đang hoạt động bình thường
Degraded Application có vấn đề
Unknown ArgoCD chưa xác định được trạng thái

🛠️ 21. Troubleshooting nhanh

❌ ArgoCD không tự Sync

Kiểm tra:

kubectl get application todo-app -n argocd -o yaml

Tìm:

syncPolicy:
  automated:

Nếu không có, Automated Sync chưa được bật.


❌ Self-Healing không hoạt động

Kiểm tra:

syncPolicy:
  automated:
    selfHeal: true

Sau đó tạo drift:

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

Theo dõi:

kubectl get deployment todo-backend \
  -n todo-app \
  -w

❌ Resource bị xóa ngoài ý muốn

Kiểm tra:

prune: true

Nếu đang bật, hãy kiểm tra Git history:

git log --oneline

và Pull Request gần nhất.

Đây là lý do production GitOps cần Git review + CI validation + approval.


🧪 22. Final Exercise

Bây giờ hãy tự thực hiện toàn bộ flow mà không nhìn lại hướng dẫn.

Exercise 1 — Automated Sync

  • [ ] Bật automated sync.
  • [ ] Thay đổi replicas từ 2 → 3.
  • [ ] Push Git.
  • [ ] Không bấm Sync trên ArgoCD.
  • [ ] Kiểm tra Kubernetes.

Mục tiêu:

Git change
    ↓
ArgoCD
    ↓
Auto Sync
    ↓
Kubernetes updated

Exercise 2 — Self-Healing

  • [ ] Git quy định replicas: 3.
  • [ ] Dùng kubectl scale để đổi thành 1.
  • [ ] Quan sát ArgoCD.
  • [ ] Kiểm tra Deployment.
  • [ ] Xác nhận replicas quay lại 3.

Mục tiêu:

Manual change
      ↓
   Drift
      ↓
 ArgoCD detects
      ↓
   Self-Heal
      ↓
Desired State

Exercise 3 — Prune

  • [ ] Tạo một ConfigMap được quản lý bởi ArgoCD.
  • [ ] Push lên Git.
  • [ ] Xác nhận ConfigMap tồn tại.
  • [ ] Xóa manifest khỏi Git.
  • [ ] Bật prune.
  • [ ] Quan sát ArgoCD.
  • [ ] Xác nhận ConfigMap bị xóa khỏi Kubernetes.

🧠 23. Tổng kết

Sau Lab 5, bạn cần nhớ 4 từ khóa:

              ArgoCD
                 │
       ┌─────────┼─────────┐
       │         │         │
      Sync   Self-Heal   Prune
       │         │         │
       ▼         ▼         ▼
   Git change   Drift    Removed
       │         │         │
       └─────────┼─────────┘
                 ▼
             Kubernetes

🔄 Sync

Git thay đổi → cập nhật Kubernetes.

🤖 Automated Sync

Không cần DevOps bấm Sync thủ công.

🩹 Self-Healing

Kubernetes bị thay đổi ngoài Git → ArgoCD đưa nó về trạng thái trong Git.

🧹 Prune

Resource bị xóa khỏi Git → ArgoCD có thể xóa resource tương ứng khỏi Kubernetes.

Và tư duy quan trọng nhất của GitOps là:

             Git
              │
              │ Desired State
              ▼
           ArgoCD
              │
              │ Reconcile
              ▼
         Kubernetes
              │
              │ Live State
              ▼
       Compare continuously

Không phải Kubernetes quyết định hệ thống nên như thế nào. Git mới là Source of Truth. ArgoCD có nhiệm vụ giữ Kubernetes đồng bộ với Git.


🚀 24. Bước tiếp theo

Ở Lab 5, chúng ta mới quản lý một environment tương đối đơn giản.

Nhưng thực tế thường có:

Development
     │
     ▼
Staging
     │
     ▼
Production

và mỗi environment có cấu hình khác nhau.

Ví dụ:

dev:
  replicas: 1

staging:
  replicas: 2

production:
  replicas: 5

Nếu copy nguyên một đống YAML cho từng environment, repository sẽ rất khó maintain.

👉 Lab 6 — GitOps với Kustomize sẽ giải quyết bài toán này bằng:

Base
 │
 ├── dev
 ├── staging
 └── production

Từ đó chúng ta bắt đầu tiến gần hơn tới GitOps architecture 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í