+8

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

👋👋👋 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é! Series này sẽ là chuỗi bài viết hướng dẫn cách sử dụng ArgoCD để thực hiện GitOps cho K8s cluster.

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.

Prerequisites

  • Đã có hiểu bắt và thành thục sử dụng Git, GitHub
  • Đã có hiểu biết về nhất định về 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

  • Cấu hình thông tin xác thực (credentials) để ArgoCD có thể kết nối đến Private Repository (có thể là Git hoặc Helm). - 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


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.