- vừa được xem lúc

[ArgoCD] Phần 1: Giới thiệu và cài đặt ArgoCD

0 0 7

Người đăng: Nguyễn Hữu Kim

Theo Viblo Asia

👋👋👋 Hello hello, xin chào tất cả anh em. Anh em nào đã lỡ vào đây rồi thì comment chào nhau một cái nhé cho đông vui nhé!

Trong phần này, mời các bạn cùng mình tìm hiểu về cách triển khai GitOps cho một hệ thống Kubernetes. Về cơ bản, GitOps là một phương pháp triển khai và quản lý cấu hình hệ thống thông qua Git Repository. Trong đó, GitOps sử dụng Git repository làm nơi đáng tin cậy để lưu trữ lại toàn bộ cấu hình mong muốn của hệ thống (bao gồm cả sensitive data) và tự động cập nhật hệ thống khi có thay đổi trong Git Repository. Một số công cụ để thực hiện GitOps phổ biến bây giờ có thể kể đến: ArgoCD, FluxCD. Bài viết này sẽ tập trung vào việc sử dụng công cụ ArgoCD để triển khai GitOps cho hệ thống Kubernetes.

ArgoCD là gì?

Trong hệ sinh thái của Argo, bên cạnh ArgoCD còn có: Argo Workflows, Argo Events, Argo Rollouts. Trong đó, Argo CD là một dự án mã nguồn mở được sử dụng để triển khai GitOps cho Kubernetes, cung cấp việc triển khai liên tục (Continuous Deployment), tự động đồng bộ hóa cấu hình mong muốn từ Git Repository và đảm bảo trạng thái hiện tại của hệ thống K8s sẽ giống như những gì được commit trên Git Repository.

Argo CD hỗ trợ nhiều công cụ như: Helm, Kustomize, jsonnet hoặc đơn giản là các file YAML thông thường của K8s. Ngoài ra, Argo CD còn cung cấp một giao diện người dùng trực quan, cho phép người dùng dễ dàng theo dõi trạng thái của ứng dụng và hệ thống thông qua browser.

ArgoCD hoạt động như nào?

Phía trên đây là mô hình hoạt động của Argo CD. Chúng ta sẽ thấy architecture của ArgoCD chia thành hai phần gồm client và server.

Trong đó:

  • Chúng ta sẽ lưu các file cấu hình (YAML, Helm Chart, Kustomze) trên Git Repository rồi sử dụng UI hoặc CLI (argocd) đóng vai trò là client để khai báo Application với ArgoCD Server.
  • Application là CRD chứa các thông tin mô tả về source repo (Git Repository hoặc Helm Repository) cần được tracking.
  • ArgoCD sẽ theo dõi trạng thái source repo của Application và tự động cập nhật trạng thái hiện tại của hệ thống cho đúng với cấu hình mong muốn.
  • Mặc định, cứ mỗi 3 phút thì ArgoCD sẽ thực hiện kiểm tra thay đổi trên source repo một lần. Nghĩa bạn sẽ phải chờ tối đa 3 phút thì các thay đổi mới bắt đầu được áp dụng. Đối với Git repository, nếu bạn bật webhook thì mỗi khi có commit mới sẽ có webhook event bắn về cho ArgoCD và nó sẽ thực hiện cập nhật luôn.

Lưu ý: Các thay đổi bạn thực hiện trên giao diện quản lý của ArgoCD sẽ không được lưu lại lên Git Repository. Nghĩa là bạn có sửa đổi bằng giao diện thì ArgoCD vẫn sẽ cập nhật lại hệ thống cho đúng cấu hình trên source repo của Application.

Cài đặt ArgoCD

Mình sẽ sử dụng Helm để thực hiện cài đặt ArgoCD vào trong K8s cluster. Cluster này được tạo bằng kind, bao gồm 1 controlplane và 2 worker nodes. Cách dùng kind để tạo cluster bạn tham khảo bài viết sau của mình: Tạo Kubernetes cluster cho môi trường phát triển với kind.

NAME STATUS ROLES AGE VERSION
production-control-plane Ready control-plane 15h3m v1.30.0
production-worker Ready <none> 15h2m v1.30.0
production-worker2 Ready <none> 15h2m v1.30.0

Cài đặt ArgoCD Server

Mình thực hiện cài đặt ArgoCD server bằng helm, dùng values mặc định trong helm chart:

helm repo add argo https://argoproj.github.io/argo-helm
helm repo update helm upgrade --install argocd argo/argo-cd -n argocd --create-namespace

Câu lệnh trên sẽ cài đặt các thành phần của ArgoCD vào trong namespace argocd. Helm sẽ tạo mới namespace nếu trong cluster của bạn chưa có. Đợi một lát để các thành phần được cài đều chuyển Ready. Bạn kiểm tra thấy các pod được tạo ra đều có Status: Running là xong.

~/d/ds101-cluster main> kubectl -n argocd get pod NAME READY STATUS RESTARTS AGE
argocd-application-controller-0 1/1 Running 0 17h
argocd-applicationset-controller-8f99d6dbb-btgrn 1/1 Running 0 17h
argocd-dex-server-557c7bf69c-w972q 1/1 Running 0 17h
argocd-notifications-controller-69c6c99f7-fb4ql 1/1 Running 0 17h
argocd-redis-7d54c45d88-qgxv5 1/1 Running 0 17h
argocd-redis-secret-init-zg98b 0/1 Completed 0 17h
argocd-repo-server-58647ccf5d-fgnsh 1/1 Running 0 17h
argocd-server-79956b894b-skqqj 1/1 Running 0 17h
argocd-server-79956b894b-vk9sb 1/1 Running 0 17h

Mình sẽ lấy password để truy cập vào UI của ArgoCD bằng lệnh sau:

kubectl get secret argocd-initial-admin-secret -ojsonpath={.data.password} | base64 --decode

Sử dụng port-forwarding để mở cổng truy cập vào UI của ArgoCD tại https://localhost:8080:

kubectl port-forward -n argocd svc/argocd-server 8080:443

Bạn đăng nhập với Username là admin và password đã lấy ở trên là sẽ vào được trang dashboard nhưng sẽ là trang trống do chúng ta chưa tạo Application nào cho ArgoCD.

Cài đặt ArgoCD CLI

Tiếp theo, mình cài đặt ArgoCD CLI với Homebrew:

brew install argocd

Tương tự như truy cập bằng UI, mình đăng nhập cho CLI bằng lệnh:

argocd login localhost:8080

Verify:

argocd app list --grpc-web

Nếu bạn đăng nhập nhiều ArgoCD server khác nhau, bạn sẽ cần lưu ý context hiện tại của CLI. Kiểm tra bằng lệnh:

argocd context

Đến đây, chúng ta đã thực hiện xong các bước cơ bản nhất để cài đặt ArgoCD vào Kubernetes cluster. Chúng ta cũng đã truy cập được vào ArgoCD thông qua UI và CLI. Hãy tới bước tiếp theo, tạo một Application cho ArgoCD để nó triển khai thử một ứng dụng.

Tạo Application

Bây giờ, mình sử dụng một app mẫu trong repository https://github.com/argoproj/argocd-example-apps.git. Nó chứa các file YAML của Deployment và Service, được lưu tại thư mục guestbook.

Mình sẽ tạo Application cho guestbook bằng lệnh sau:

argocd app create guestbook \ --repo https://github.com/argoproj/argocd-example-apps.git \ --path guestbook \ --dest-server https://kubernetes.default.svc \ --dest-namespace default \ --grpc-web

Trong đó:

Kiểm tra app được tạo bằng lệnh:

argocd app list --grpc-web

Kết quả output tương tự như sau:

NAME CLUSTER NAMESPACE PROJECT STATUS HEALTH SYNCPOLICY CONDITIONS REPO PATH TARGET
argocd/guestbook https://kubernetes.default.svc default default OutOfSync Missing Manual <none> https://github.com/argoproj/argocd-example-apps.git guestbook

Câu lệnh trên không cấu hình auto sync nên application đang là manual sync. Chúng ta cần đồng bộ source trên Git về thủ công bằng lệnh:

argocd app sync guestbook

Đợi một lát và kiểm tra lại trạng thái của application:

argocd app get guestbook

Kết quả, tất cả object gồm Service và Deployment đều SyncedHealthy như mẫu dưới đây:

GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE Service default guestbook-ui Synced Healthy service/guestbook-ui created
apps Deployment default guestbook-ui Synced Healthy deployment.apps/guestbook-ui created

Vậy là xong! 😃

Chúng ta có thể lấy ra nhanh khai báo YAML của Application như sau để lưu lại vào Git:

argocd app get guestbook -o yaml --grpc-web | yq .spec
destination: namespace: default server: https://kubernetes.default.svc
project: default
source: path: guestbook repoURL: https://github.com/argoproj/argocd-example-apps.git

Tổng kết

  • Chúng ta đã cài đặt ArgoCD server vào cluster với Helm.
  • Chúng ta đã tạo được tạo được Application có tên là guestbook bằng CLI, chứa các chỉ dẫn cho ArgoCD như: Git Repository URL, directory, destination cluster, destination namespace.
  • Chúng ta cũng đã đồng bộ được các cấu hình gồm Deployment và Service về cluster bằng cách manual sync.
  • Ngoài cách dùng CLI ở trên, chúng ta có thể dùng UI để tạo Application. Miễn là bạn không bận auto-sync thì ArgoCD sẽ chưa thực sự deploy ứng dụng. Do đó, có thể dùng cách này để generate ra file YAML của Application.
  • Các bạn để ý sẽ thấy, ngoài các manifest của Guestbook được lưu trên Git thì các cấu hình của ArgoCD (Helm values, Application manifest) chưa được lưu lại.

Next Steps

  • Tạo Git Repository để chứa tất cả các cấu hình về cài đặt ArgoCD (helm values), Guestbook (YAML manifest, Application).
  • Tạo Application để ArgoCD tự tracking chính nó và toàn bộ các apps khác của cluster.

Mọi người ủng hộ mình bằng cách giúp mình một lượt like và subscribe DevSuccess101 trên nền tảng mà bạn yêu thích phía dưới nhé. Cảm ơn các bạn đã đón đọc.

✴️ Website: https://devsuccess101.com
✴️ Subscribe kênh! https://l.devsuccess101.com/subscribe
✴️ Join our Discord community for help https://l.devsuccess101.com/discord
✴️ Donate: Momo, Paypal

✴️ TikTok: https://l.devsuccess101.com/tiktok
✴️ YouTube: https://l.devsuccess101.com/youtube
✴️ Viblo: https://l.devsuccess101.com/viblo
✴️ Facebook: https://l.devsuccess101.com/facebook
✴️ Discord: https://l.devsuccess101.com/discord

Bình luận

Bài viết tương tự

- vừa được xem lúc

Đề thi interview DevOps ở Châu Âu

Well. Chào mọi người, mình là Rice - một DevOps Engineers ở đâu đó tại Châu Âu.

0 0 81

- vừa được xem lúc

In calculus, love also means zero.

Mình nhớ hồi năm 2 đại học, thầy giáo môn calculus, trong một giây phút ngẫu hứng, đã đưa ra cái definition này. Lúc đấy mình cũng không nghĩ gì nhiều.

0 0 62

- vừa được xem lúc

Chuyện thay đổi

Thay đổi là một thứ gì đó luôn luôn đáng sợ. Cách đây vài tháng mình có duyên đi làm cho một banking solution tên là X.

0 0 41

- vừa được xem lúc

Pet vs Cattle - Thú cưng và gia súc

Khái niệm. Pets vs Cattle là một khái niệm cơ bản của DevOps. Bài viết này sẽ nói về sự phát triển của các mô hình dịch vụ từ cốt lõi Pets and Cattle. 1.

0 0 30

- vừa được xem lúc

Git workflow được Google và Facebook sử dụng có gì hay ho

Với developer thì Git hẳn là công cụ rất quen thuộc và không thể thiếu rồi. Thế nhưng có mấy ai thực sự hiểu được Git.

0 0 76

- vừa được xem lúc

Kubernetes - Học cách sử dụng Kubernetes Namespace cơ bản

Namespace trong Kubernetes là gì. Tại sao nên sử dụng namespace.

0 0 108