Phạm Văn Thư
Hạ tầng và vận hành · AI-assisted content

Argo CD: GitOps cho Kubernetes và tình huống triển khai ở công ty lữ hành

Đăng ngày 12/10/2026

Mục lục bài nghiên cứu
Hình đại diện Argo CD — hạ tầng và DevOps mã nguồn mở

Argo CD trong một trang: Git là nguồn sự thật, cụm Kubernetes là nơi được kéo về cho khớp

Argo CD là công cụ triển khai liên tục (continuous delivery, CD) theo phương pháp GitOps cho Kubernetes. Dự án mô tả mình là công cụ khai báo (declarative): cấu hình ứng dụng và môi trường phải được khai báo và quản lý phiên bản, còn việc triển khai và quản lý vòng đời ứng dụng phải tự động, kiểm toán được và dễ hiểu. [1] Nói gọn, thay vì để một đường ống CI chạy lệnh kubectl vào cụm, ta ghi trạng thái mong muốn vào Git rồi để Argo CD so sánh, báo lệch và đồng bộ.

Bài này là nghiên cứu bàn giấy (desk research) trên mã nguồn và tài liệu tại một commit cố định, không phải kết quả cài đặt hay đo đạc. Kết luận chính: Argo CD đáng cân nhắc khi tổ chức đã vận hành Kubernetes thật, có từ hai môi trường trở lên và muốn biết rõ cái gì đang chạy so với cái gì đã được duyệt trong Git. Nó ít hợp lý khi hệ thống chỉ là vài máy ảo, vì chi phí vận hành bộ điều khiển có thể lớn hơn lợi ích.

Khi lệnh kubectl rải rác trong đường ống CI và không ai chắc cụm đang chạy bản nào

Trong nhiều đội, việc triển khai lên Kubernetes bắt đầu bằng vài dòng lệnh trong đường ống CI. Cách này chạy được cho đến khi có hai môi trường, ba người cùng sửa, hoặc ai đó chỉnh trực tiếp một Deployment trên cụm để chữa cháy. Lúc đó câu hỏi đơn giản nhất, "cụm production đang chạy đúng cấu hình đã duyệt chưa", lại không có câu trả lời nhanh.

Argo CD giải bài toán này bằng cách đảo chiều. Bộ điều khiển ứng dụng (application controller) theo dõi liên tục các ứng dụng đang chạy và so sánh trạng thái thực tế với trạng thái đích lấy từ kho cấu hình; khi phát hiện lệch, ứng dụng được đánh dấu OutOfSync và có thể được sửa tự động nếu người vận hành cho phép. [3] Kết quả là sự khác biệt không còn nằm trong trí nhớ của kỹ sư mà hiện thành một trạng thái có thể xem.

Argo CD không build ảnh container, không chạy kiểm thử và không quyết định thay đổi nào là đúng; chất lượng thay đổi vẫn thuộc về quy trình review và CI của đơn vị triển khai.

Bốn tầng và sáu bộ phận: vì sao Argo CD tách repo server khỏi controller

Tài liệu vận hành mô tả ba thành phần lõi. API server là máy chủ gRPC/REST phục vụ giao diện web, CLI và các hệ thống CI/CD; nó quản lý ứng dụng, gọi các thao tác như sync hay rollback, lưu thông tin xác thực kho và cụm dưới dạng Kubernetes secret, ủy quyền xác thực cho nhà cung cấp danh tính ngoài, thực thi RBAC và nhận webhook từ Git. Repository server là dịch vụ nội bộ giữ bản sao cục bộ của kho Git và sinh ra manifest Kubernetes khi nhận địa chỉ kho, revision, đường dẫn ứng dụng và tham số riêng của công cụ mẫu như Helm values. Application controller là bộ điều khiển Kubernetes so sánh trạng thái chạy với trạng thái đích. [3]

Tài liệu kiến trúc cho nhà phát triển bổ sung bức tranh đầy đủ hơn: giao diện web, CLI, API server, application controller, ApplicationSet controller, repo server, Redis, Kube API, Git và Dex. Các thành phần được xếp vào bốn tầng là UI, Application, Core và Infra, với quy tắc phụ thuộc một chiều từ trên xuống. [4] Các controller không được coi là component module hoá vì giao tiếp qua CRD riêng. [4]

Argo CD — hình minh họa 1, hạ tầng và DevOps mã nguồn mở
Hình 1. Minh họa trong kho mã nguồn chính thức của Argo CD. Nguồn: argoproj/argo-cd @879bb7b. Hình ảnh và nhãn hiệu thuộc về chủ sở hữu tương ứng.

Từ một commit tới trạng thái Healthy: đường đi của dữ liệu qua pipeline đồng bộ

Hãy theo dấu một thay đổi giả định: một commit sửa số bản sao của Deployment. Argo CD biết thay đổi nhờ webhook mà API server lắng nghe hoặc nhờ thăm dò định kỳ; tài liệu HA cho biết controller mặc định kiểm tra Git mỗi ba phút. [3][7]

Khi cần so sánh, controller yêu cầu repo server sinh manifest từ kho, revision và đường dẫn tương ứng, đồng thời dùng bộ nhớ đệm cluster dựng từ các lệnh watch của Kubernetes để biết trạng thái thực mà không phải truy vấn API liên tục. [3][7] Manifest đã sinh được cache, mặc định 24 giờ theo tài liệu HA, dựa trên giả định rằng manifest chỉ đổi khi kho đổi; tài liệu cũng cảnh báo các trường hợp như Kustomize remote base hay Helm chart đổi mà không tăng phiên bản, khi đó nên giảm thời gian cache. [7]

Kết quả so sánh quyết định trạng thái Synced hay OutOfSync. Nếu bật đồng bộ tự động, chỉ ứng dụng OutOfSync mới được đồng bộ, và mỗi tổ hợp commit SHA cùng tham số chỉ được thử một lần, trừ khi bật self-heal; khi self-heal bật, lần thử lại diễn ra sau thời gian chờ mặc định năm giây. [10] Người vận hành vì vậy cần nhìn trạng thái lỗi thay vì chờ nó tự khỏi.

Những gì tài liệu xác nhận: đồng bộ, hook, wave, retry, RBAC và HA

Nhóm đồng bộ. Tài liệu Automated Sync Policy xác nhận các tuỳ chọn automated, prune, selfHeal và allowEmpty. Mặc định, đồng bộ tự động không xoá tài nguyên đã bị gỡ khỏi Git (prune phải bật riêng) và không tự sửa khi cụm bị chỉnh tay (self-heal phải bật riêng). [10] Cũng có thử lại với backoff luỹ thừa (limit, duration, factor, maxDuration). [10]

Nhóm vòng đời. Các loại hook được liệt kê gồm PreSync, Sync, Skip, PostSync, SyncFail, PreDelete và PostDelete; hook có thể là bất kỳ loại tài nguyên Kubernetes nào nhưng thường là Pod, Job hoặc Argo Workflows. [9] Chính sách xoá hook gồm HookSucceeded, HookFailed và BeforeHookCreation, trong đó nếu không chỉ định thì BeforeHookCreation được áp dụng. [9] Hook không chạy trong đồng bộ chọn lọc. [9]

Nhóm quản trị. API server thực thi RBAC dựa trên Casbin; cấu hình có thể đặt ở ConfigMap toàn cục hoặc trong vai trò của AppProject. [5][8] Tài liệu RBAC nêu hai vai trò dựng sẵn là readonly và admin, và các loại tài nguyên được phân quyền gồm applications, applicationsets, clusters, projects, repositories, logs, exec và nhiều loại khác. [8]

Argo CD — hình minh họa 2, hạ tầng và DevOps mã nguồn mở
Hình 2. Minh họa trong kho mã nguồn chính thức của Argo CD. Nguồn: argoproj/argo-cd @879bb7b. Hình ảnh và nhãn hiệu thuộc về chủ sở hữu tương ứng.

Ai nên cân nhắc, ai nên đứng ngoài

Đối tượng phù hợp nhất là đội đã chạy Kubernetes ở mức sản xuất và có ít nhất hai môi trường, ví dụ staging và production, hoặc nhiều cụm. Với họ, giá trị nằm ở khả năng nhìn thấy độ lệch, ở lịch sử thay đổi nằm sẵn trong Git và ở việc tách quyền ghi cấu hình khỏi quyền chạm vào cụm. [3][10]

Nhóm thứ hai là các đội nền tảng (platform) phục vụ nhiều đội ứng dụng. Mô hình AppProject cùng RBAC cho phép chia ranh giới theo dự án, và tài liệu RBAC nêu rằng quyền với applications, logs, exec có thể đặt trong vai trò của từng AppProject. [8] Đây là hạ tầng để một đội nhỏ cung cấp dịch vụ triển khai cho nhiều đội mà không phát chìa khoá quản trị cụm cho tất cả.

Với đội một hai người, hãy hỏi ai sẽ nâng cấp, sao lưu và cấu hình SSO cho chính Argo CD trước khi cài; nó là công cụ cần quyền truy cập production. [6]

Tình huống giả định: công ty lữ hành cần phát hành nhanh trước mùa du lịch mà không làm sập trang đặt tour

Tình huống dưới đây là đề xuất áp dụng, không phải trường hợp đã xảy ra. Hãy hình dung một công ty du lịch lữ hành tầm trung có trụ sở ở Đà Nẵng, bán tour trong nước và outbound qua website và ứng dụng di động. Hệ thống gồm dịch vụ tìm tour, giá và tồn chỗ, đặt chỗ, cổng thanh toán, gửi xác nhận kèm voucher. Đội kỹ thuật khoảng bốn lập trình viên và một người phụ trách hạ tầng; thay đổi dồn vào trước hè, lễ và Tết, khi khuyến mãi cần lên nhanh nhưng lỗi đặt chỗ mất doanh thu ngay.

Đề xuất: tạo một kho Git cấu hình riêng, mỗi môi trường một thư mục, và khai báo mỗi dịch vụ là một Application. Với staging, bật đồng bộ tự động để mọi thay đổi đã merge được áp ngay. Với production, giữ đồng bộ thủ công và để trưởng nhóm bấm sync sau khi xem diff; tài liệu cho biết tự động hoá có thể bật từng ứng dụng một nên có thể nới dần. [10]

Thứ tự áp dụng nên dùng hook và wave. Tác vụ di trú cơ sở dữ liệu của dịch vụ đặt chỗ đặt ở pha PreSync, nếu hỏng thì cả đồng bộ dừng và phiên bản mới không được đưa ra. [9] Sau khi triển khai xong, một Job kiểm tra khói (smoke test) ở PostSync gọi thử luồng tìm tour và tạo đơn nháp; nếu thất bại, đồng bộ bị đánh dấu thất bại và có thể gửi thông báo. [9] Đây là cách dùng đúng tinh thần ví dụ trong tài liệu, nơi PreSync chạy kiểm tra thiết yếu còn PostSync chạy kiểm thử khói.

Triển khai, nâng cấp và những núm vặn cần biết khi số ứng dụng tăng

Về triển khai, tài liệu HA cho biết dự án có bộ manifest HA, cần tối thiểu ba nút do luật anti-affinity và không hỗ trợ cụm chỉ IPv6. [7] Khi số ứng dụng tăng, các núm vặn được tài liệu nêu rõ. Repo server có cờ parallelismlimit để tránh bị hệ điều hành giết do hết bộ nhớ; nó clone kho vào /tmp nên đĩa có thể đầy và tài liệu gợi ý gắn volume bền; lệnh git ls-remote dùng để phân giải revision mơ hồ có thể lỗi nên có biến môi trường đặt số lần thử lại; thời gian chờ chạy công cụ như helm hay kustomize mặc định 90 giây. [7] Controller có hai hàng đợi với số bộ xử lý đặt được, và nếu việc sinh manifest quá lâu sẽ gặp lỗi Context deadline exceeded, khi đó tài liệu khuyên tăng timeout của repo server và nhân bản nó. [7]

Về nâng cấp, người viết chưa đọc tài liệu nâng cấp, nên chỉ khuyến nghị đọc ghi chú phiên bản trước mỗi lần nâng và thử trên staging. Về hỗ trợ, chính sách bảo mật nói dự án hỗ trợ ba phiên bản minor gần nhất bằng bản vá bảo mật và lỗi. [6] Điều đó đặt ra nhịp nâng cấp: một đội không nâng cấp sẽ sớm rơi ra ngoài vùng được vá.

Công cụ có chìa khoá vào production: phân quyền, xác thực và chuỗi cung ứng

Điểm khởi đầu là nhận định của chính dự án: vì là công cụ triển khai, Argo CD cần quyền truy cập production nên bảo mật là chủ đề rất quan trọng. [6] Suy luận của người viết: nếu Argo CD bị chiếm quyền, kẻ tấn công có thể thay đổi các cụm nó quản lý, nên bảo mật là hạng mục thiết kế bắt buộc.

Về xác thực, tài liệu RBAC nêu rằng Argo CD không có hệ thống quản lý người dùng riêng và chỉ có một người dùng tích hợp là admin với quyền tối cao; RBAC yêu cầu cấu hình SSO hoặc người dùng cục bộ. [8] Tài liệu kiến trúc cho biết Dex được dùng để xác thực với nhà cung cấp OIDC bên ngoài, nhưng có thể dùng công cụ khác thay thế. [4] Trong luồng yêu cầu, một bộ chặn (interceptor) xác thực chạy cho mọi yêu cầu gRPC, và các phương thức dịch vụ gọi hàm RBAC trước khi thực hiện nghiệp vụ. [5]

Apache-2.0 trên toàn bộ kho, và những điều giấy phép không nói

Tệp LICENSE tại commit khảo sát là văn bản Apache License, Version 2.0, với phần phụ lục ghi bản quyền 2017-2018 của The Argo Authors. [2] Văn bản cho phép sử dụng, sao chép, sửa đổi và phân phối theo điều kiện của Apache 2.0, có cấp quyền bằng sáng chế. Trong đợt thu thập không có tệp giấy phép bổ sung dạng license-scope nào cho kho này, nên không ghi nhận thư mục có giấy phép khác; tuy vậy bài không quét từng tệp trong cây thư mục.

Cần phân biệt phạm vi. Giấy phép chỉ bao phủ mã nguồn tại commit này. Nó không đương nhiên bao phủ các ảnh container, biểu đồ Helm của bên thứ ba, plugin, dịch vụ chạy trên nền Argo CD, hoặc các phụ thuộc như Helm, Kustomize, git và Dex mà mỗi thứ có giấy phép riêng. Chính sách bảo mật của dự án nhắc rằng Argo CD dựa vào các tệp nhị phân và thư viện như vậy. [6]

Về ranh giới phiên bản, README và các tệp đã đọc không mô tả bản thương mại hay "open core" của Argo CD. Vì vậy bài không khẳng định có hay không có phiên bản trả phí; các nhà cung cấp dịch vụ bên thứ ba có thể tồn tại nhưng thuộc ngoài phạm vi những nguồn đã đọc. Về thương hiệu và quyền đóng góp, README chỉ cho biết dự án tuân theo Bộ quy tắc ứng xử của CNCF. [1] Chưa đọc chính sách CLA hay nhãn hiệu nên không kết luận.

Chi phí: ít tiền phần mềm, nhiều giờ công và bộ nhớ cho repo server

Con người. Cần một người có hiểu biết Kubernetes để cài đặt, cấu hình SSO và RBAC, và thiết kế cấu trúc kho cấu hình. Sau đó, giờ công chuyển sang duy trì: nâng cấp theo nhịp ba phiên bản minor được hỗ trợ, [6] xử lý lỗi đồng bộ, hướng dẫn lập trình viên cách viết manifest. Với đội nhỏ, chi phí cơ hội này thường lớn hơn tiền phần cứng.

Phần cứng. Bản cài mặc định có nhiều thành phần chạy trong cụm: API server, repo server, application controller, ApplicationSet controller, Redis và Dex. [4] Bản HA cần tối thiểu ba nút cho luật anti-affinity. [7] Repo server tiêu thụ bộ nhớ khi chạy Helm hoặc Kustomize và đĩa tạm khi clone kho, nên cần đặt giới hạn tài nguyên và có thể cần volume bền. [7] Phép đo cụ thể (bao nhiêu CPU và RAM cho bao nhiêu ứng dụng) không được tài liệu cam kết, chỉ có số tham khảo về bộ xử lý hàng đợi cho 1000 ứng dụng, [7] vì vậy cần đo trong chính môi trường của mình.

Giả định của bài: công ty đã có cụm Kubernetes. Nếu chưa, chi phí lớn nhất không phải Argo CD mà là chính Kubernetes. Dự án không dùng mô hình AI nên không có chi phí token.

So sánh ở mức cách tiếp cận: kéo từ Git, đẩy từ CI hay lệnh thủ công

Có ít nhất ba cách tiếp cận cho bài toán triển khai lên Kubernetes. Cách thứ nhất là đẩy (push): đường ống CI như GitLab CI hoặc Jenkins chạy kubectl hay helm lên cụm. Ưu điểm là đơn giản và dễ bắt đầu; nhược điểm là CI phải giữ thông tin xác thực cụm và sau khi chạy xong không ai theo dõi độ lệch. Argo CD đi theo cách thứ hai, kéo (pull) từ Git và đối soát liên tục, nghĩa là cụm luôn được so với nguồn. [3][10]

Cách thứ ba là Helm hoặc kubectl chạy tay có kiểm soát bằng quy trình nội bộ. Với một hai dịch vụ, đây có thể là lựa chọn hợp lý nhất, đặc biệt khi chi phí vận hành thêm một bộ điều khiển không đáng.

Tiêu chí chọn đề xuất: số môi trường, yêu cầu kiểm toán, rủi ro khi CI giữ khoá production và năng lực vận hành sẵn có. Một cách lai cũng khả thi: CI vẫn build, kiểm thử và cập nhật thẻ phiên bản ảnh trong Git, còn Argo CD chịu trách nhiệm phần đưa lên cụm. [10]

Hạn chế và những trường hợp nên dừng lại

Thứ nhất, Argo CD giả định Kubernetes; với hạ tầng khác nó không phải công cụ phù hợp. [1]

Thứ hai, sự đúng đắn của mô hình "Git là sự thật" phụ thuộc vào kỷ luật. Nếu kho cấu hình có quy trình review yếu, hoặc nhiều người có quyền ghi vào nhánh được theo dõi, lỗ hổng chỉ chuyển từ cụm sang Git. Đồng bộ tự động còn khuếch đại lỗi: một commit sai được áp ngay lên mọi ứng dụng đã bật tự động. Vì vậy mặc định không prune và không self-heal của tài liệu là hợp lý để giữ lại khi mới bắt đầu. [10]

Thứ ba, độ trễ phát hiện thay đổi là có thật. Thăm dò Git mặc định ba phút, cache manifest mặc định 24 giờ và độ trễ hai giây giữa các wave đồng bộ là những con số trong tài liệu. [7][9] Chúng ổn cho hầu hết ứng dụng nhưng có thể gây bất ngờ nếu đội kỳ vọng thay đổi có hiệu lực tức thì mà không cấu hình webhook.

Thứ tư, mức độ phức tạp tăng theo quy mô. Tài liệu HA liệt kê nhiều thiết lập riêng cho repo server, controller và API server, bao gồm hai thuật toán phân shard ghi rõ là thử nghiệm. [7] Một đội chưa sẵn sàng đọc và điều chỉnh những tham số này nên giữ quy mô nhỏ.

Kế hoạch thử nghiệm bốn tuần với tiêu chí đo được

Giai đoạn một, tuần đầu: chuẩn bị. Chọn một dịch vụ ít quan trọng và một cụm staging. Ghi số liệu nền: thời gian từ merge đến khi chạy trên staging, số lần cấu hình trên cụm bị lệch trong tháng gần nhất, số bước thủ công mỗi lần phát hành. Cài Argo CD ở chế độ không HA, cấu hình SSO và vai trò tối thiểu theo cảnh báo của tài liệu RBAC. [8]

Giai đoạn hai, tuần hai: đồng bộ thủ công. Đưa dịch vụ vào, chạy sync bằng tay, thử PreSync và PostSync với một Job đơn giản, thử rollback. [9] Tiêu chí qua: ít nhất năm lần phát hành liên tiếp không cần can thiệp ngoài Argo CD, và mọi lần thất bại đều hiện đúng trạng thái.

Giai đoạn ba, tuần ba: đồng bộ tự động trên staging. Bật automated, sau đó lần lượt bật prune và self-heal, mỗi bước quan sát một thời gian. [10] Cố ý chỉnh tay một Deployment để kiểm tra phát hiện lệch và tự sửa. Tiêu chí qua: độ lệch được phát hiện và xử lý đúng như cấu hình ở mọi lần thử.

Tiêu chí thoát (dừng): nếu thời gian giờ công vận hành vượt giá trị tiết kiệm được, nếu không thể thiết lập phân quyền tối thiểu đạt yêu cầu bảo mật, hoặc nếu có sự cố mất kiểm soát khi tự động hoá, dừng và quay về quy trình cũ. Chỉ khi cả bốn giai đoạn qua mới cân nhắc đưa production vào, và vẫn với đồng bộ thủ công.

Kết luận: một công cụ kỷ luật hoá việc triển khai, với điều kiện đã có Kubernetes

Từ các tài liệu đã đọc, Argo CD là một bộ điều khiển GitOps có kiến trúc tách bạch: API server cho người dùng và hệ thống ngoài, repo server sinh manifest, application controller đối soát, kèm cache Redis có thể vứt bỏ. [3][4][7] Giá trị cốt lõi là biến sự khác biệt giữa Git và cụm thành thứ nhìn thấy được, đồng thời cho phép thu hẹp quyền của CI. [10]

Với công ty lữ hành trong tình huống giả định, lợi ích tiềm năng là phát hành nhanh trước mùa cao điểm mà vẫn có cổng kiểm tra trước và sau đồng bộ. Điều này chỉ nên được xác nhận bằng thử nghiệm có số liệu nền, không bằng niềm tin vào công cụ. Đội cũng có thể lưu runbook và quyết định triển khai bên cạnh kho cấu hình như một dạng bộ não thứ hai của đội; đó là gợi ý tổ chức, không phải tính năng của Argo CD.

Nguồn và phương pháp

Đây là bài nghiên cứu bàn giấy (desk research), không phải công trình khoa học được bình duyệt. Người viết không cài đặt, chạy, đo hiệu năng hay triển khai Argo CD; mọi nhận định kỹ thuật dựa trên văn bản trong kho tại commit cố định 879bb7bf19af712119d619e09d3c44dfd147b5cc (ngày commit 12/10/2026), kiểm tra ngày 12/10/2026.

Dự án được chọn từ kho lưu trữ các trang GitHub Trending, ghi nhận 33 lần xuất hiện từ 08/01/2026 đến 09/10/2026; trang bằng chứng đầu tiên là ngày 08/01/2026, vị trí thứ 4 trong danh sách Go. [11] Kho lưu trữ này chỉ bao gồm danh sách Python, Go, JavaScript và Swift, thiếu ngày 03/09/2026 và 12/10/2026, nên không phải bảng xếp hạng 100 chính thức.

Các tệp đã đọc: README và LICENSE [1][2]; tài liệu kiến trúc vận hành [3]; kiến trúc thành phần và xác thực/phân quyền cho nhà phát triển [4][5]; chính sách bảo mật [6]; và bốn tài liệu bổ sung tại cùng commit là high availability, RBAC, sync phases and waves, và automated sync policy. [7][8][9][10]

Những phần chưa đọc: tài liệu ApplicationSet, quản lý Secret, hướng dẫn nâng cấp từng phiên bản, khôi phục thảm hoạ và tài liệu thông báo. Các nhận định về chi phí, so sánh và kế hoạch thử nghiệm là phân tích và đề xuất của người viết, không phải số liệu từ nguồn. Tình huống ở Việt Nam là giả định để minh hoạ.

Xem mã nguồn Argo CD trên GitHub

Khám phá nghiên cứu của BDSG Foundation

Trao đổi về ứng dụng công nghệ cho doanh nghiệp