0

Lab 14 — ArgoCD Troubleshooting: Debug Sync, Health, Diff & Rollback

🎯 Mục tiêu

Sau Lab này, bạn sẽ có thể:

  • Hiểu ArgoCD báo lỗi ở đâu và cách đọc trạng thái Application.
  • Troubleshoot các lỗi phổ biến: OutOfSync, SyncFailed, Degraded, Missing.
  • Biết cách kiểm tra ArgoCD từ UI và CLI.
  • Phân biệt lỗi đến từ Git, ArgoCD hay Kubernetes.
  • Thực hiện Rollback khi một deployment gặp sự cố.

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

Hãy tưởng tượng bạn vừa deploy version mới của Todo App.

Developer nói:

"Em đã merge code rồi, nhưng production đang lỗi."

Bạn mở ArgoCD và thấy:

Application: todo-app

Sync Status: OutOfSync
Health Status: Degraded

Hoặc:

Sync Status: Unknown
Health Status: Missing

Hoặc tệ hơn:

Sync Failed

Lúc này câu hỏi không phải là:

"ArgoCD bị lỗi à?"

Mà phải là:

"Lỗi nằm ở Git, ArgoCD hay Kubernetes?"

Đây chính là kỹ năng quan trọng của troubleshooting.


2. 🧠 Hiểu nhanh

2.1 🔄 ArgoCD thực sự đang kiểm tra điều gì?

ArgoCD liên tục so sánh:

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

Ví dụ Git yêu cầu:

replicas: 3

Nhưng Kubernetes đang chạy:

replicas: 2

ArgoCD phát hiện:

Desired State != Actual State

và báo:

OutOfSync

💡 Tư duy quan trọng

ArgoCD không đơn giản là:

"Tool để deploy Kubernetes."

Nó giống như một người giám sát:

Git
 │
 │ "Phải chạy như thế này"
 ▼
ArgoCD
 │
 │ "Thực tế đang như thế này"
 ▼
Kubernetes

ArgoCD phát hiện sự khác biệt và có thể sửa lại Kubernetes về đúng trạng thái trong Git.


3. 🏗️ Architecture

Trong Lab này, flow troubleshooting sẽ là:

                    Git Repository
                         │
                         │ Desired State
                         ▼
                  ┌──────────────┐
                  │    ArgoCD    │
                  │              │
                  │ Diff         │
                  │ Sync         │
                  │ Health       │
                  └──────┬───────┘
                         │
                         │ Apply
                         ▼
                  ┌──────────────┐
                  │  Kubernetes  │
                  │              │
                  │ Deployment   │
                  │ Service      │
                  │ Pod          │
                  └──────┬───────┘
                         │
                         ▼
                    Application

Khi có lỗi, chúng ta sẽ debug theo hướng:

Application
    │
    ├── Sync Status
    │
    ├── Health Status
    │
    ├── Events
    │
    ├── Diff
    │
    ▼
Kubernetes Resources
    │
    ├── Deployment
    ├── Pod
    ├── Service
    └── ConfigMap / Secret

4. 🧰 Chuẩn bị môi trường

Lab này sử dụng Application đã tạo ở các Lab trước.

Kiểm tra ArgoCD:

argocd version

Kiểm tra Kubernetes:

kubectl get nodes

Kiểm tra Application:

argocd app list

Ví dụ:

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

Nếu Application đang SyncedHealthy, chúng ta sẽ cố tình tạo lỗi để học troubleshooting.


5. 🔍 Troubleshooting Flow

Trước khi đi vào từng lỗi, hãy nhớ flow này:

        ArgoCD Application
                │
                ▼
        ┌─────────────────┐
        │ Sync Status ?   │
        └────────┬────────┘
                 │
       ┌─────────┴─────────┐
       │                   │
    Synced             OutOfSync
                           │
                           ▼
                      Check Diff
                           │
                           ▼
                      Sync Failed?
                           │
                           ▼
                    Check Resources
                           │
                           ▼
                     Check Pod
                           │
                           ▼
                 kubectl describe/logs

Đừng vội chạy hàng chục command.

Hãy xác định trạng thái đang có vấn đề gì trước.


6. 🧪 Lab 1 — Troubleshoot OutOfSync

🤔 Vấn đề

Giả sử Kubernetes đang chạy:

replicas: 2

Nhưng Developer thay đổi Git:

replicas: 3

ArgoCD sẽ phát hiện:

Git              Kubernetes

replicas: 3  ≠   replicas: 2

OutOfSync


🔨 Do

Mở file Deployment trong GitOps repository:

spec:
  replicas: 3

Commit:

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

Chờ ArgoCD refresh.

Kiểm tra:

argocd app get todo-app

Bạn có thể thấy:

Sync Status: OutOfSync
Health Status: Healthy

👀 See Result

Kiểm tra Diff:

argocd app diff todo-app

Bạn sẽ thấy sự khác biệt giữa:

DESIRED
replicas: 3

và:

LIVE
replicas: 2

Đây chính là Diff.


🧠 Understand

OutOfSync không nhất thiết có nghĩa là hệ thống đang lỗi.

Nó chỉ có nghĩa:

Kubernetes hiện tại khác với trạng thái mà Git yêu cầu.

Có thể là:

Git changed
    ↓
ArgoCD detects difference
    ↓
OutOfSync

Hoặc:

Someone manually changed Kubernetes
    ↓
Actual State changed
    ↓
OutOfSync

Đây là lý do GitOps hạn chế việc sửa trực tiếp production bằng:

kubectl edit

hoặc:

kubectl scale deployment ...

7. 🧪 Lab 2 — Manual Change → ArgoCD Self-Healing

Đây là một tình huống rất thực tế.

🤔 Vấn đề

Một Engineer chạy:

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

Trong khi Git vẫn yêu cầu:

replicas: 3

Điều gì xảy ra?


🔨 Do

Scale deployment:

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

Kiểm tra:

kubectl get deployment todo-backend -n todo-app

Sau đó:

argocd app get todo-app

Bạn có thể thấy:

Sync Status: OutOfSync

👀 See Result

Nếu Application đã bật:

Automated Sync
Self Heal

ArgoCD sẽ phát hiện thay đổi và đưa Deployment về:

replicas: 3

Kiểm tra:

kubectl get deployment todo-backend -n todo-app

🧠 Understand

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

        Git
        │
        │ replicas = 3
        ▼
      ArgoCD
        │
        │ detects drift
        ▼
 Kubernetes
 replicas = 1
        │
        │ Self-Heal
        ▼
 replicas = 3

💡 Production Tip

Nếu production có nhiều Engineer:

Git nên là nơi duy nhất thay đổi desired state.

Không nên:

Engineer
   │
   └── kubectl edit production

Mà nên:

Engineer
   │
   ▼
Git Pull Request
   │
   ▼
Review
   │
   ▼
ArgoCD
   │
   ▼
Production

8. 🧪 Lab 3 — Troubleshoot SyncFailed

🤔 Vấn đề

OutOfSync nghĩa là:

"Desired State khác Actual State."

Nhưng SyncFailed nghĩa là:

"ArgoCD đã cố gắng apply thay đổi nhưng Kubernetes từ chối."

Ví dụ bạn commit:

spec:
  replicas: 3

Không có vấn đề gì.

Nhưng bạn vô tình tạo một Deployment sai:

spec:
  replicas: abc

Kubernetes không thể tạo resource này.


🔨 Do

Sửa Deployment trong Git thành:

spec:
  replicas: abc

Commit:

git add .
git commit -m "test invalid deployment"
git push

Sau đó Sync:

argocd app sync todo-app

👀 See Result

Kiểm tra:

argocd app get todo-app

Bạn có thể thấy:

Sync Status: OutOfSync
Health Status: ...
Operation: Failed

Lúc này đừng chỉ nhìn:

Sync Failed

Hãy xem resource nào fail.

argocd app resources todo-app

Hoặc kiểm tra trong ArgoCD UI:

Application
   ↓
Resource Tree
   ↓
Deployment
   ↓
Error / Events

🧠 Understand

Flow của SyncFailed thường là:

Git
 │
 │ Invalid manifest
 ▼
ArgoCD
 │
 │ Sync
 ▼
Kubernetes
 │
 X
 │ Reject
 ▼
SyncFailed

Vì vậy khi gặp SyncFailed:

Đừng hỏi:

"ArgoCD tại sao không deploy?"

Hãy hỏi:

"Kubernetes đã từ chối resource nào và tại sao?"


9. 🔎 Kiểm tra Kubernetes Resource

Đây là kỹ năng cực kỳ quan trọng.

Giả sử ArgoCD báo:

Deployment: todo-backend
Sync Failed

Kiểm tra:

kubectl get deployment todo-backend -n todo-app

Sau đó:

kubectl describe deployment todo-backend -n todo-app

Đặc biệt chú ý:

Events:

Ví dụ:

FailedCreate
Invalid value

10. 🧪 Lab 4 — Troubleshoot Degraded

🤔 Vấn đề

Một Application có thể:

Sync Status: Synced
Health Status: Degraded

Điều này rất dễ gây nhầm.

Synced không có nghĩa là Application đang chạy tốt.

Nó chỉ có nghĩa:

Git State == Kubernetes State

Nhưng Pod có thể vẫn crash.


🔨 Do

Tạo một Deployment sử dụng image không tồn tại:

containers:
  - name: backend
    image: todo-backend:not-exist

Commit và push.

Sau đó Sync:

argocd app sync todo-app

👀 See Result

Kiểm tra:

argocd app get todo-app

Có thể thấy:

Sync Status: Synced
Health Status: Degraded

Kiểm tra Pod:

kubectl get pods -n todo-app

Ví dụ:

todo-backend-xxxxx   0/1   ImagePullBackOff

🧠 Understand

Đây là sự khác nhau rất quan trọng:

                 Git
                  │
                  ▼
              ArgoCD
                  │
           ┌──────┴──────┐
           │             │
       Sync Status   Health Status
           │             │
       "Đúng Git?"   "Có chạy tốt?"
           │             │
          YES           NO

Vì vậy:

Synced + Healthy

→ Tốt.

Synced + Degraded

→ Manifest đã được deploy nhưng application đang có vấn đề.


11. 🔥 Troubleshooting Pod

Khi ArgoCD báo Degraded, hãy chuyển xuống Kubernetes.

Bước 1 — Kiểm tra Pod

kubectl get pods -n todo-app

Bước 2 — Xem trạng thái chi tiết

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

Bước 3 — Xem logs

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

Nếu Pod restart nhiều lần:

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

--previous rất hữu ích khi container vừa crash và Kubernetes đã restart nó.


12. 🧪 Lab 5 — Troubleshoot Missing

🤔 Vấn đề

ArgoCD có thể báo:

Missing

Điều này thường có nghĩa:

Git yêu cầu resource tồn tại nhưng Kubernetes không còn resource đó.

Ví dụ:

Git
 │
 └── Deployment todo-backend
          │
          ▼
      Kubernetes
          │
          X
      Deployment deleted

🔨 Do

Xóa Deployment trực tiếp:

kubectl delete deployment todo-backend -n todo-app

Kiểm tra:

kubectl get deployment -n todo-app

Sau đó xem ArgoCD:

argocd app get todo-app

Nếu Self-Healing được bật, ArgoCD sẽ tạo lại resource.


👀 See Result

Kubernetes:

kubectl get deployment -n todo-app

Deployment xuất hiện trở lại.


🧠 Understand

Đây tiếp tục là một ví dụ của GitOps:

Git
 │
 │ Deployment MUST exist
 ▼
ArgoCD
 │
 │ Detect missing resource
 ▼
Kubernetes
 │
 │ Recreate
 ▼
Deployment

💡 Production Tip

Đây là lý do Self-Healing rất hữu ích.

Nhưng hãy cẩn thận:

Self-Healing không sửa được một cấu hình sai trong Git.

Nếu Git chứa:

image: todo-backend:broken

ArgoCD có thể liên tục đảm bảo rằng:

broken image

được deploy đúng như Git yêu cầu.

GitOps giúp hệ thống consistent, nhưng không tự đảm bảo rằng configuration trong Git đúng về mặt nghiệp vụ.


13. 🧪 Lab 6 — Troubleshoot Repository Error

Không phải lỗi nào cũng nằm ở Kubernetes.

Ví dụ:

ComparisonError

hoặc:

Unable to fetch repository

🤔 Vấn đề

ArgoCD cần đọc Git repository để biết:

"Production nên chạy cái gì?"

Nếu ArgoCD không truy cập được Git:

Git Repository
      X
      │
      │ Authentication / Network
      ▼
    ArgoCD

ArgoCD không thể biết desired state mới nhất.


🔨 Do

Kiểm tra Application:

argocd app get todo-app

Kiểm tra repository:

argocd repo list

Nếu repository có vấn đề, ArgoCD thường hiển thị error message liên quan đến:

authentication
repository not found
permission denied
connection refused

🧠 Understand

Khi gặp repository error, hãy kiểm tra theo thứ tự:

1. Repository URL đúng?
          ↓
2. Repository còn tồn tại?
          ↓
3. Credentials đúng?
          ↓
4. ArgoCD có quyền đọc repository?
          ↓
5. Network có truy cập được Git?

💡 Production Tip

Đừng vội restart ArgoCD khi gặp:

Unable to fetch repository

Restart Pod không sửa được:

Wrong Git credentials

Hãy đọc error message gốc trước.


14. 🔄 Lab 7 — Rollback Khi Deployment Lỗi

🤔 Vấn đề

Giả sử:

Version 1
   ↓
Deploy
   ↓
Healthy
   ↓
Version 2
   ↓
Deploy
   ↓
🔥 Production Error

Bạn cần quay về version trước.

Trong GitOps, cách tốt nhất thường là:

Revert Git commit
        ↓
Push
        ↓
ArgoCD detects change
        ↓
Sync
        ↓
Previous version

🔨 Do

Xem lịch sử Git:

git log --oneline

Ví dụ:

a82d91f update backend image
91c20aa initial deployment

Revert commit lỗi:

git revert a82d91f

Push:

git push

ArgoCD sẽ phát hiện Git đã quay về configuration trước đó.


👀 See Result

Kiểm tra:

argocd app get todo-app

Sau khi Sync:

Sync Status: Synced
Health Status: Healthy

🧠 Understand

Trong GitOps:

Rollback tốt nhất thường là rollback Git.

Thay vì:

kubectl manually change production

hãy:

Git revert
    ↓
ArgoCD
    ↓
Kubernetes

Lợi ích:

  • Có history.
  • Có audit trail.
  • Team biết ai rollback.
  • Trạng thái Git và Kubernetes tiếp tục đồng bộ.

15. 🧰 Bộ lệnh Troubleshooting cần nhớ

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

Chỉ cần nhớ nhóm lệnh này:

🔍 ArgoCD

argocd app list

Xem toàn bộ Application.

argocd app get todo-app

Xem trạng thái chi tiết.

argocd app diff todo-app

Xem Git và Kubernetes khác nhau ở đâu.

argocd app resources todo-app

Xem các Kubernetes resources mà Application quản lý.

argocd app sync todo-app

Sync thủ công.


☸️ Kubernetes

kubectl get pods -n todo-app
kubectl describe pod <pod> -n todo-app
kubectl logs <pod> -n todo-app
kubectl logs <pod> -n todo-app --previous
kubectl get events -n todo-app

Đây là nhóm command bạn sẽ sử dụng rất nhiều khi troubleshoot production.


16. 🧭 Troubleshooting Cheat Sheet

Khi gặp lỗi, hãy bắt đầu từ bảng này:

ArgoCD Status Ý nghĩa Kiểm tra tiếp
Synced Git = Kubernetes Kiểm tra Health
OutOfSync Git ≠ Kubernetes argocd app diff
SyncFailed Sync không thành công Resource + Events
Degraded Resource không khỏe Pod + Logs
Missing Resource Git yêu cầu nhưng không tồn tại kubectl get
Unknown ArgoCD không xác định được trạng thái Repository / Controller
ComparisonError Không thể so sánh Desired/Live Git / Manifest / Repo
ImagePullBackOff Không pull được image Image / Registry / Secret
CrashLoopBackOff Container liên tục crash Logs
Pending Pod chưa được schedule Resources / Node / PVC

17. 🧠 Mental Model Quan Trọng Nhất

Khi troubleshoot ArgoCD, đừng nhìn mọi thứ như một lỗi duy nhất.

Hãy chia thành 3 tầng:

┌─────────────────────────────┐
│          Git                │
│                             │
│ Repository                  │
│ YAML / Helm / Kustomize     │
└──────────────┬──────────────┘
               │
               ▼
┌─────────────────────────────┐
│          ArgoCD             │
│                             │
│ Repository                  │
│ Diff                        │
│ Sync                        │
│ Application Controller      │
└──────────────┬──────────────┘
               │
               ▼
┌─────────────────────────────┐
│       Kubernetes            │
│                             │
│ Deployment                  │
│ Pod                         │
│ Service                     │
│ ConfigMap / Secret          │
└─────────────────────────────┘

Khi có lỗi:

🟢 Tầng 1 — Git

Hỏi:

"Manifest trong Git có đúng không?"


🟡 Tầng 2 — ArgoCD

Hỏi:

"ArgoCD có đọc được Git và Sync được không?"


🔴 Tầng 3 — Kubernetes

Hỏi:

"Kubernetes có chạy được configuration đó không?"


18. 💡 Production Tips

18.1 🚫 Đừng sửa Production bằng kubectl rồi quên Git

Ví dụ:

kubectl edit deployment todo-backend

Bạn có thể sửa được.

Nhưng sau đó:

Git        → replicas: 3
Kubernetes → replicas: 5

ArgoCD:

OutOfSync

Hãy sửa Git thay vì sửa trực tiếp Kubernetes.


18.2 🔎 Đừng chỉ nhìn Sync Status

Một Application:

Synced

vẫn có thể:

Degraded

Luôn kiểm tra cả:

Sync Status
+
Health Status

18.3 📋 Đọc Events trước khi đoán

Khi Pod lỗi:

kubectl describe pod <pod> -n todo-app

Sau đó xem:

Events

Rất nhiều lỗi Kubernetes có nguyên nhân rõ ràng ngay tại đây:

FailedScheduling
FailedMount
FailedPull
Unhealthy
BackOff

18.4 🧠 Error message thường đã nói cho bạn nguyên nhân

Ví dụ:

ImagePullBackOff

Đừng tìm:

"ArgoCD ImagePullBackOff fix"

Hãy chuyển xuống Kubernetes:

kubectl describe pod ...

và tìm:

Failed to pull image

Troubleshooting tốt không phải là biết thật nhiều command.

Nó là khả năng:

đọc trạng thái → xác định tầng lỗi → kiểm tra đúng component.


19. 🏁 Tổng kết Lab

Trong Lab này, chúng ta đã cố tình tạo và xử lý nhiều lỗi phổ biến:

OutOfSync
    ↓
Diff
    ↓
SyncFailed
    ↓
Degraded
    ↓
Missing
    ↓
Repository Error
    ↓
Rollback

Điều quan trọng nhất cần nhớ:

                 Git
                  │
            Desired State
                  │
                  ▼
               ArgoCD
                  │
            Sync / Compare
                  │
                  ▼
             Kubernetes
                  │
             Actual State

Khi có vấn đề, hãy đi theo flow:

1. Application đang trạng thái gì?
              ↓
2. Git và Kubernetes khác nhau ở đâu?
              ↓
3. ArgoCD Sync có thành công không?
              ↓
4. Resource nào đang lỗi?
              ↓
5. Kubernetes báo gì?
              ↓
6. Pod logs / Events nói gì?
              ↓
7. Sửa nguyên nhân ở đúng tầng

💡 Rule of thumb: ArgoCD cho bạn biết "có vấn đề ở đâu", còn Kubernetes thường cho bạn biết "tại sao".


20. 🚀 Bước tiếp theo

Đến đây bạn đã biết cách deploy và troubleshoot Application bằng ArgoCD.

Nhưng khi hệ thống có:

Dev
Staging
Production

việc tạo từng Application thủ công sẽ nhanh chóng trở nên khó quản lý.

Lab tiếp theo sẽ giải quyết vấn đề đó bằng:

ApplicationSet — tự động quản lý nhiều Application và nhiều Environment với ArgoCD.


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í