Chuyển tới nội dung

Triết lý Pull và Push trong DevOps

Mô hình Push vs Pull trong DevOps: Hiểu đúng triết lý CI/CD & GitOps

Khi bắt đầu làm DevOps, câu hỏi đầu tiên luôn là:

“Làm sao đưa code từ Git lên server một cách tự động, an toàn và dễ mở rộng?”

Câu trả lời xoay quanh hai triết lý triển khai (deployment) cốt lõi:

  • Mô hình Push (Đẩy) – thường gắn với CI/CD truyền thống.
  • Mô hình Pull (Kéo) – nền tảng của GitOps trong các hệ thống Kubernetes hiện đại.

Hiểu rõ sự khác nhau giữa Push vs Pull là chìa khóa để thiết kế pipeline CI/CD tối ưu cho ứng dụng của bạn.

1. Tóm tắt nhanh: Push là gì? Pull là gì?

Mô hình Push (Đẩy) là gì?

Trong mô hình Push, hệ thống CI/CD (thường là Jenkins, GitLab CI, GitHub Actions, v.v.) chủ động “đẩy” (push) bản build mới sang môi trường chạy (server, VM, Kubernetes, v.v.).

Luồng điển hình:

  1. Dev push code lên Git (GitHub / GitLab / Bitbucket).
  2. Webhook trigger job CI trên Jenkins.
  3. Jenkins build – test – đóng gói – deploy trực tiếp lên server / cluster.

Mô hình Pull (Kéo) là gì?

Trong mô hình Pull, thay vì hệ thống CI tự động đẩy bản build lên môi trường, ta có một deployment controller trong cluster (ví dụ: Argo CD) tự kéo (pull) cấu hình từ Git về và sync với trạng thái thực tế.

Đây chính là triết lý GitOps:

Git là “single source of truth” cho trạng thái hệ thống. Mọi deployment đều xuất phát từ Git.

2. Sơ đồ mô hình Push (CI/CD truyền thống với Jenkins)

Sơ đồ mô hình Push với Jenkins

Mô tả luồng trong hình:

  1. Developer: Commit & push code (ví dụ app React) lên Git Repo (App).
  2. Git server: Gửi Webhook tới Jenkins (CI Server).
  3. Jenkins thực hiện pipeline:
    • Chạy unit test / integration test.
    • Build Docker image.
    • Push image lên Container Registry (Docker Hub / GitLab Registry…).
    • Deploy trực tiếp lên:
      • VM / server vật lý (copy file, SSH, chạy script), hoặc
      • Kubernetes cluster (kubectl apply, helm install…).

3. Ưu – nhược điểm của mô hình Push

Ưu điểm mô hình Push

  • Dễ bắt đầu: Setup đơn giản, phù hợp team mới học CI/CD.
  • Hỗ trợ đa nền tảng: Deploy được lên VM, bare metal, Docker, K8s, v.v.
  • Tích hợp CI mạnh: Thường đi với Jenkins / GitLab CI, hỗ trợ đầy đủ:
    • Test tự động.
    • Build image.
    • Chạy script tùy biến.

Nhược điểm mô hình Push

  • Quyền truy cập rộng: Jenkins/CI cần quyền SSH / API vào môi trường prod → rủi ro bảo mật.
  • Khó quản lý trạng thái: Trạng thái thực tế của hệ thống không luôn phản ánh 100% theo Git.
  • Rollback phức tạp: Nếu không quản lý version cẩn thận, việc rollback có thể phải làm tay.

4. Mô hình Pull (GitOps) với Argo CD

Trong mô hình Pull, thay vì “đẩy thẳng” cấu hình lên cluster, bạn:

  1. Push manifests Kubernetes (YAML) vào GitOps Repo (ví dụ: repo infra-config).
  2. Argo CD (chạy bên trong Kubernetes) theo dõi repo này.
  3. Argo CD so sánh:
    • Trạng thái trong Git (Desired State).
    • Trạng thái trong cluster (Live State).
  4. Khi có thay đổi trong Git, Argo CD tự động sync để cluster giống với Git.

Argo CD chỉ làm CD (Continuous Delivery) – nó không build image, không chạy test, chỉ lo deploy & sync.

5. Sơ đồ mô hình Pull (GitOps với Argo CD)

Mô tả luồng trong hình:

  1. Dev cập nhật file deployment.yaml, service.yaml,… trong GitOps Repo.
  2. Git lưu lại toàn bộ lịch sử thay đổi (audit trail).
  3. Argo CD:
    • Poll hoặc nhận event từ Git.
    • Hiển thị trạng thái Synced / OutOfSync trên dashboard.
    • Khi sync, Argo CD apply manifests để cluster = Git.

Lưu ý: Argo CD chỉ dành cho Kubernetes, không dùng để deploy trực tiếp lên VM theo kiểu truyền

6. So sánh nhanh: Push vs Pull trong DevOps

Tiêu chíMô hình Push (CI/CD truyền thống)Mô hình Pull (GitOps với Argo CD)
Ai chủ động?CI server (Jenkins, GitLab CI…) đẩy lên môi trườngController (Argo CD) kéo cấu hình từ Git
Nơi giữ “truth”Thường là CI + scriptGit là “single source of truth”
Hỗ trợ môi trườngVM, bare metal, Docker, K8s…Chuyên cho Kubernetes
Bảo mậtCI cần quyền truy cập trực tiếp vào prodProd chỉ mở cho Argo CD bên trong cluster
Quan sát & rollbackPhụ thuộc log CI + scriptUI Argo CD: xem diff, history, rollback theo commit Git
Độ hiện đại“Truyền thống”, dễ bắt đầu“Hiện đại”, chuẩn GitOps

7. Kết hợp Jenkins (CI) + Argo CD (CD): Cặp đôi DevOps hiện đại

  • Jenkins (Push) cực mạnh về CI: Build + Test + Build Docker Image + Push Registry.
  • Argo CD (Pull) cực mạnh về CD: Sync, GitOps, quản lý trạng thái deployment.

Pipeline “Jenkins CI + Argo CD CD”

Luồng chi tiết trong hình:

  1. Dev push code lên GitHub Repo (App).
  2. Webhook → Jenkins chạy pipeline:
    • Test.
    • Build Docker image.
    • Push image lên Container Registry.
    • Update deployment.yaml trong GitOps Repo (sửa tag image, ví dụ: v1.1.0).
  3. Commit & push thay đổi lên GitOps Repo.
  4. Argo CD phát hiện commit mới:
    • Hiển thị OutOfSync.
    • Sync cluster theo cấu hình mới.
  5. Prod luôn “theo Git”, có thể rollback bằng cách revert commit.

8. Khi nào nên chọn Push, Pull hay kết hợp?

  • Chọn Push (chỉ Jenkins / GitLab CI) nếu:
    • Hệ thống chủ yếu chạy trên VM, bare metal.
    • Team mới làm DevOps, muốn pipeline đơn giản.
    • Chưa dùng hoặc chưa sẵn sàng dùng Kubernetes.
  • Chọn Pull (GitOps với Argo CD) nếu:
    • Bạn đang dùng Kubernetes ở môi trường staging / production.
    • Cần audit rõ ràng, rollback nhanh, môi trường chuẩn hoá.
    • Muốn “code hóa” toàn bộ hạ tầng & deployment trong Git.
  • Kết hợp Jenkins + Argo CD nếu:
    • Bạn muốn CI mạnh + CD hiện đại.
    • Ứng dụng build bởi Jenkins, deploy và quản lý lifecycle bởi Argo CD.
    • Mục tiêu: Pipeline chuẩn DevOps hiện đại cho hệ thống K8s.
Liên hệ