Overview
container-native: ứng dụng được phát triển để có thể chạy được trên container, được triển khai bằng container.
ArgoCD là một mã nguồn mở container-native workflow engine phục vụ việc deploy service trên Kubernetes.
ArgoCD được triển khai trên Kubernetes như một Kubernetes CRD (Custom Resource Definition)
ArgoCD là một công cụ dễ sử dụng cho phép các nhóm phát triển triển khai và quản lý các ứng dụng mà không cần phải tìm hiểu nhiều về Kubernetes và không cần toàn quyền truy cập vào hệ thống Kubernetes.
Argo-CD được phát triển bởi Intuit, một công ty chuyên về sản phẩm phần mềm tài chính được thành lập năm 1983
Đầu năm 2018 Intuil quyết định sử dụng Kubernetes để tăng tốc độ GO CLOUD, ở thời điểm đó cũng có một vài CD tool apply thành công cho Kubernetes nhưng không sản phẩm nào đáp ứng được đủ các yêu cầu của Intuil. Vì vậy thay vì dùng giải pháp hiện có, Intuit quyết định đầu tư một dự án mới để làm Argo-CD. Vào năm 2020, Argo CD đã được Cloud Native Computing Foundation (CNCF) chấp nhận là một dự án được lưu trữ ở cấp độ ươm tạo.
Architecture
Các thành phần chính của Argo-CD
Argocd có 3 thành phần chính là API server, Repository server, Application controller
API server
là một gRPC/REST server nó phơi ra các APIs, các APIs này được sử dụng bởi Argocd Web UI, CLI, và các hệ thống CI/CD khác tích hợp. API Server có thực hiện các chức năng như: Quản lý ứng dụng và báo cáo trang thái gọi các tác vụ vận hành ứng dụng như sync, rollback hoặc các tác vụ do người dùng định nghĩa quản lý các credential của repository và cluster (store as k8s secret) xác thực và ủy quyền xác thực cho các nhà cung cấp dịch vụ định danh bên ngoài thực thi RBAC lắng nghe/chuyển tiếp các sự kiện git webhook
Repository server
là một internal service nó duy trì một local cache của git repository giữ các application manifests. Nó chịu trách nhiệm tạo ra và trả về các kubernetes manifests dựa vào các thông tin đầu vào như repository URL, revision (commit, tag, branch), application path (đường dẫn tới thư mục chưa manifest của ứng dụng được khai báo) và template specific settings: parameters, helm values.yaml
Đặc biệt với case manifest sử dụng helm dependencies đến một helm private registry thì chúng ta có thể thêm sidecar cho repository server để nó thực hiện việc authen helm registry qua đó argocd-repo-server có thể dùng để authorize helm registry và thực hiện thành công helm dependence build.
Application Controller
là một kubernetes controller nó tiếp tục thực hiện việc theo dõi trạng thái của ứng dụng đang chạy (trên kubernetes) và so sánh với trạng thái mong muốn (được định nghĩa trong git repo) . Nó phát hiện tình trạng OutOfSync của service và tùy chọn thực hiện các hành động sửa chữa, nó chịu trách nhiệm cho việc gọi bất kỳ user-defined hooks cho các lifecycle events (PreSync, Sync, PostSync)
Các thành phần khác
Ngoài 3 thành phần chính trên, các thành phần khác như Dex, notification, applicationSet, Redis cũng rất quan trọng, nó giúp chúng ta setup các config liên quan đến SSO, Noti và quản lý tập ArgoCD applications trong một applicationSet.
Argo-CD applicationset giúp chúng có thể quản lý việc deploy các common applications như Nginx, Prometheus, .. trên đồng thời nhiều cụm kubernetes hoặc quản lý deploy các services trên đồng thời trên 2 môi trường DC/DR
Dex giúp chúng ta setup config SSO
Noti giúp thực hiện các tác vụ noti các trạng thài của các argo-cd application
Redis giúp cài thiện hiệu suất của Argo-CD
Argo-CD hoạt động như thế nào.
Logic xử lý của ArgoCD được chia thành 3 giai đoạn, mỗi giải đoạn được xử lý bởi một thành phần được liệt kê ở trên. 3 giai đoạn của gồm:
- Lấy source manifest từ remote git repo
- Phát hiện và khắc phục những sai lệch giữa manifest đang chạy với manifest trên git.
- Trình bày kết quả cho người dùng qua WebUI hoặc API
Lấy source manifest từ remote git repo
Được thực hiện bởi argocd repository server qua các công việc như sau:
Get thông tin manifest từ remote git repo - git pull Lưu thông tin manifest vào local storage của argocd repository server Tạo ra YAML manifest phục vụ cho argocd application controller sử dụng ở giai đoạn tiếp theo.
Phát hiện và khắc phục những sai lệch giữa manifest đang chạy với manifest trên git
Được thực hiện bởi ArgoCD application controller
Load manifest đang chạy trên target cluster (cụm k8s đích nới service được deploy) Call lấy yaml manifest từ argocd repo server So sánh 2 manifest (manifest trên k8s đích với manifest lưu trên git repo) Thực hiện kubectl apply để apply manifest lên k8s đích nếu các manifest khó sự khác biệt Nhận về thông tin application (manifest, sync, health status) và lưu vào redis.
Trình bày kết quả cho người dùng qua WebUI hoặc API
ArgoCD api server sẽ phụ trách việc show kết quả của 2 bước trước tới người dùng và tiếp nhập các tương tác của người dùng tới hệ thống như: Call API Xử lý argocd command Login Phân quyền
Cách argoCD làm việc với kubernetes target
ArgoCD tương tác với kubernetes target thông qua API với giao thức HTTPS vì vậy Argo-CD và Kubenetes taget có kể kết nối trức tiếp với nhau nếu firewall cho phép hoặc thông qua HTTP PROXY được config trong bản thân ArgoCD. Khi thêm một cụm kubernetes vào argocd thì yêu cần đảm bảo và thực hiện các bước sau: Config kubernetes context: đảm bảo người dùng có quyền khởi tạo service account resource trên cụm kubernetes Cài đặt argocd command tool Login argocd qua argocd command tool. khi thực hiện add một cụm kubernetes cluster vào argocd thì các resources sau sẽ được tạo ra với:
Cụm k8s triển khai cụm argocd:
k8s secret chưa thông tin bear token và tls config của cụm k8s target.
Cụm k8s target
Cluster role với đầy đủ quyền tương tác với cluster Cluster role binding để map cluster role với service account Service account - secret account token: chưa token và ca.cert access vào cluster, value của token là value của bear token ở secret của cụm k8s deploy argoCD Khi ArgoCD tương tac với K8S target thì nó sẽ check endpoint và lấy thông tin token và tls cert ở secret tương ứng để đẩy vào header của http request.