+8

[ArgoCD] Phần 3: Bootstrap cluster sử dụng App of Apps pattern

👋👋👋 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é!

Mở đầu

Trong Phần 2: Kết nối đến Private Repository, mình đã giới thiệu tới bạn đọc cách để chúng ta có thể kết nối ArgoCD tới Private Repository, dùng RepositoryCredential Template. Bước tiếp theo của chúng ta cần thực hiện đó là tạo GitOps repository trên GitHub để chứa các file cấu hình. Hãy cùng mình bắt đầu nha!

Chú ý:

  • Bài viết này sẽ dụng lại ArgoCD đã được cài đặt trong các phần trước. Hãy đảm bảo bạn đã có làm được các bước của Phần 2 trước khi làm theo những gì được đề cập trong phần này.
  • Truy cập trang Dashboard của ArgoCD dùng port-forwarding và truy cập vào qua browser tại https://localhost:8080:
kubectl -n argocd port-forward svc/argocd-server 8080:443

Prerequisites

  • Thành thục sử dụng Git, GitHub
  • Hiểu biết nhất định về Kubernetes
  • Hiểu biết về Helm và Kustomize

Tạo GitOps Repository

Tạo GitHub repository

Chúng ta cần một Git Repository để chứa lại toàn bộ các cấu hình về K8s Cluster để triển khai GitOps. Chúng ta hãy ngầm hiểu với nhau rằng repository đó gọi là GitOps Repository nhé. Do GitOps Repository chứa toàn bộ các cấu hình deploy của tất cả các service chạy trong K8s cluster nên repository này cần phải được để ở trạng thái private. Tuyệt đối không chia sẻ nó với bất kỳ ai không phận sự. Ở đây mình có tạo một GitHub repository có tên là devsuccess101/ds101-cluster. Hãy bắt đầu với thư mục đầu tiên.

Cấu trúc thư mục

Chúng ta sẽ tạo thư mục đầu tiên cho GitOps Repository có tên là bootstrap - với mục đích dùng để bootstrap cluster. Cấu trúc thư mục tạm thời sẽ trông như dưới đây:

bootstrap
├── apps.yaml               # 3.2. Application dùng để bootstrap các Applications khác
├── argocd                  # 1. Thư mục chứa cấu hình cài đặt ArgoCD
│   ├── kustomization.yaml  # -- Khai báo dùng Kustomize
│   ├── namespace.yaml      # -- Tạo namespace riêng cho argocd dùng khi lần đầu cài đặt
│   └── values.yaml         # -- Helm values để cài ArgoCD
├── argocd-bootstrap.yaml   # 2. Application gốc dùng để bootstrap tất cả các resource khác được khai báo trong thư mục bootstrap: apps.yaml, argocd.yaml 
└── argocd.yaml             # 3.1. Application dùng để self-managed ArgoCD

Bây giờ chúng ta sẽ thêm nội dung cho từng phần cho thư mục bootstrap nhé.

Chú ý: Application ở đây là một Custom Resource của ArgoCD cho K8s mà mình đã đề cập trong phần 1 nhé. Đừng nhầm lẫn!

Chuẩn bị manifest deploy ArgoCD

Tạo thư mục

Đầu tiên, chúng ta sẽ tạo một thư mục mới có tên là argocd. Đây là nơi chứa tất cả các file cần thiết để cài đặt ArgoCD vào cluster từ lúc cluster còn mới toanh:

mkdir -p bootstrap/argocd

Vậy muốn cài ArgoCD thì chúng ta cần làm những gì?

  1. Tạo namespace argocd
  2. Tạo file values.yaml cho Helm chart

Khai báo Namespace

Đối với một cluster mới toanh, chúng ta cần phải tạo Namespace có tên là argocd trước khi cài ArgoCD. Do vậy, mình sẽ khai báo thêm một file YAML cho nó. Mình tạo file namespace.yaml:

apiVersion: v1
kind: Namespace
metadata:
  name: argocd
  annotations:
    argocd.argoproj.io/sync-options: Prune=false

Chú ý: Annotation argocd.argoproj.io/sync-options: Prune=false được thêm để nếu chúng ta có cần xóa file namespace.yaml khỏi GitOps Repository thì khi đồng bộ, ArgoCD sẽ không xóa mất Namespace argocd của chúng ta.

Khai báo Helm values

Bây giờ, hãy sao chép lại file values.yaml đã dùng dùng để cài đặt ArgoCD trong các phần trước vào đây. Dưới đây là nội dung file values.yaml mình đã dùng trong phần trước:

## Argo Configs
configs:
  # -- Repositories list to be used by applications
  ## Creates a secret for each key/value specified below to create repositories
  ## Note: the last example in the list would use a repository credential template, configured under "configs.credentialTemplates".
  repositories:
    ds101-cluster:
      url: https://github.com/devsuccess101/ds101-cluster
      type: git
    bitnami:
      type: helm
      url: https://charts.bitnami.com/bitnami
    devspace:
      type: helm
      url: https://charts.devspace.sh
    ory:
      type: helm
      url: https://k8s.ory.sh/helm/charts

  # -- Repository credentials to be used as Templates for other repos
  ## Creates a secret for each key/value specified below to create repository credentials
  credentialTemplates:
    # -- GitOps Repository
    ds101-cluster:
      githubAppID: "924036"
      githubAppInstallationID: "51953849"
      githubAppPrivateKey: |
        -----BEGIN RSA PRIVATE KEY-----
        MIIEogIBAAKCAQEAxQgKIC2tduZ5ag/ANL7/3kfUy6/nIZKngLrAe/nRUT2Ls5Gl
        Gm5jcbIeTQCXqAjkdn4qam7pQIxNLI6qVw5uZgNLDGB/hgPIcdX48njtHS6bW3Ju
        Mwgtcll24vtQr5ciPCew0PbKtpyu2Y6GCwy9zysdVn0yTUfZOTIwPDjMMYyEqU2c
        Q0+3VH51U4688aG7QkL4ArxG9O5/DuaE4ELvgoj2mQQXoB4A62iSYX7dJPa7QQ7T
        tOXbDunU81UYmV3D0AtBiVFINVBigNoQ1ERobuJB3/ddRfryWiShorHik9CM0q7M
        s/lmA2hL8XyVvdiwU3cLZDPzRzKVxUeKshkAJmtrAkFrnODf5WE2G3lIFFL5v/ZJ
        0M7lo56SUIfJLF5A7lkLNmi40igBpKtlbETmRB9S/JYiovwMbFk=
        -----END RSA PRIVATE KEY-----
      project: default
      type: git
      url: https://github.com/devsuccess101

Sử dụng kustomize

Rồi xong. Chúng ta chuẩn bị đủ các file rồi. Vậy giờ làm sao để dùng các file trên để cài ArgoCD? Câu trả lời là mình sẽ dùng Kustomize. Bạn không nghe nhầm đâu, mình sẽ cài Helm chart bằng Kustomize nhé. Tạo file kustomization.yaml như sau:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
  - namespace.yaml

helmCharts:
  - name: argo-cd
    repo: https://argoproj.github.io/argo-helm
    version: 7.1.3
    namespace: argocd
    releaseName: argocd
    additionalValuesFiles:  # Chỉ định file values.yaml cho kustomize
      - values.yaml

Như vậy là đủ các file cần dùng cho việc cài đặt ArgoCD từ lúc cluster còn mới toanh rồi! Hãy build thử kustomization bằng cách thêm flag --enable-helm như sau:

kubectl kustomize --enable-helm bootstrap/argocd

Bạn thấy trên màn hình terminal in ra YAML mà không bị lỗi là được. Mình cài lại ArgoCD bằng Kustomize luôn với câu lệnh sau:

kubectl kustomize --enable-helm bootstrap/argocd | kubectl apply -f -

Hãy commit lại và push lên GitOps repository nhé. Trước đó, nhớ thêm file .gitignore để ignore thư mục charts được tạo ra bởi kustomize khỏi Git nha.

charts

Như vậy là chúng ta đã hoàn thành bước đầu tiên, đó là lưu lại các file cài đặt ArgoCD vào GitOps repository. Tuy nhiên, nó vẫn chưa tự đồng bộ bằng ArgoCD đâu nhé!

Root Application

App of Apps pattern

Bước tiếp theo, mình sẽ áp dụng App of Apps pattern. Đây là pattern được biết đến trong ArgoCD khi một Application sẽ tạo và quản lý các Application khác. Nó được ứng dụng để tự động bootstrap các thành phần khác trên K8s cluster.

Trong đó, file argocd-bootstrap.yaml có thể coi là Bootstrap Application hoặc Root Application cũng đúng vì nó sẽ là Application đầu tiên được tạo trong ArgoCD. Sau khi triển khai, sơ đồ hoạt động sẽ giống như hình dưới đây:

image.png

  1. File bootstrap/argocd-bootstrap.yaml là file YAML định nghĩa Application có tên argocd-bootstrap.
  2. Dựa vào cấu hình trong argocd-bootstrap, ArgoCD sẽ apply bất kỳ K8s manifest nào có mặt trong thư mục bootstrap trên GitOps repository. Theo hình minh họa, các bạn có thể thấy argocd-bootstrap đã đồng bộ cấu hình cho 3 Application là: apps, argocd và chính nó argocd-bootstrap. Bằng cách này chúng ta sẽ có thể bootstrap cluster.

Khai báo argocd-bootstrap application

Chúng ta sẽ khai báo Application có tên argocd-bootstrap theo mẫu sau:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: argocd-bootstrap
  namespace: argocd
spec:
  destination:
    namespace: argocd
    name: in-cluster
  source:
    path: bootstrap
    repoURL: "https://github.com/devsuccess101/ds101-cluster"
    targetRevision: main
    directory:
      recurse: true
      exclude: "argocd/*"
  project: default
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
      - CreateNamespace=true
      - ApplyOutOfSyncOnly=true

Trong đó, một số thông tin quan trọng nhất gồm:

  • destination.namespace: Chỉ định namespace đích mà các file K8s manifest sẽ được apply vào.
  • destination.name: Tên của cluster sẽ được dùng. Vì ArgoCD có thể dùng để quản lý nhiều cluster nên cần chỉ rõ cluster muốn dùng là cái nào.
  • source.repoURL: URL của repository. Ở đây là URL của GitOps Repository.
  • source.path: Chỉ định thư mục mà Application sẽ sử dụng. Chúng ta điền tên thư mục bootstrap.
  • directory.recurse: Giá trị true để ArgoCD đọc cả subfolder.
  • directory.exclude: Chúng ta điền argocd/* để ArgoCD bỏ qua hết tất cả các file trong subfolder bootstrap/argocd.
  • syncPolicy.automated: Kích hoạt chế độ tự fetch lại GitOps Repository sau mỗi 3 phút.

Tạo application và đồng bộ

Sau khi đã khai báo xong Application argocd-bootstrap.yam theo mẫu trên, chúng ta lại thực hiện commit và push chúng lên GitOps Repository để chuẩn bị cho quá trình tự đồng bộ.

Cần thực hiện tạo Application argocd-bootstrap thủ công một lần duy nhất bằng lệnh sau:

kubectl apply -f bootstrap/argocd-bootstrap.yaml

Truy cập vào ArgoCD trên web và nhấn vào Application argocd-bootstrap bạn sẽ quá trình đồng bộ của ArgoCD tự động diễn ra. Sau khi quá trình sync kết thúc. Bạn sẽ thấy sơ đồ hoạt động của nó giống như sau:

image.png

Vậy là argocd-bootstrap đã tìm nạp thành công và đang tự quản lý chính nó! Bây giờ, bạn khai báo thêm bất kỳ file K8s manifest nào khác vào trong thư mục bootstrap, miễn là đã push lên GitOps Repository thì ArgoCD sẽ tự động đồng bộ và triển khai lên cluster được chỉ định.

ArgoCD self-managed

Khai báo argocd application

Vậy giờ chúng ta muốn ArgoCD tự quản lý và deploy lại chính nó thì chúng ta chỉ cần khai báo thêm file YAML tạo một Application khác có tên argocd, và lưu nó trong thư mục bootstrap nữa thôi! 😄 Dưới đây là cách để triển khai ArgoCD self-managed sử dụng Kustomize và Helm:

  1. Tạo file argocd.yaml để khai báo Application
  2. Kích hoạt chế độ --enable-helm cho ArgoCD để có thể sử dụng dùng Kustomize cùng với Helm chart
  3. Commit và push các file mới lên GitOps Repository

Chúng ta tạo file argocd.yaml theo mẫu sau:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: argocd
  namespace: argocd
spec:
  destination:
    namespace: argocd
    name: in-cluster
  source:
    path: bootstrap/argocd
    repoURL: "https://github.com/devsuccess101/ds101-cluster"
    targetRevision: main
  project: default
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
      - CreateNamespace=true
      - ApplyOutOfSyncOnly=true

File này khai báo tương tự như file argocd-bootstrap.yaml nên mình sẽ không giải thích lại nhiều nữa. Về cơ bản nó sẽ làm ArgoCD apply các file trong thư mục bootstrap/argocd nha mọi người. Hãy chuyển qua bước tiếp theo!

Kích hoạt Kustomize + Helm trong ArgoCD

Bạn còn nhớ chúng ta đã khai báo Helm chart trong file kustomization.yaml chứ? Để kustomize có thể render Helm chart, chúng ta đã thêm flag --enable-helm trong lệnh:

kubectl kustomize --enable-helm bootstrap/argocd

Tương tự, chúng ta cũng cần làm cho ArgoCD hỗ trợ render Helm chart bằng kustomize. Bạn có thể dùng một trong hai cách:

  1. Sử dụng build options --enable-helm
  2. Sử dụng Content Management Plugin

Chúng ta sẽ tìm hiểu về Content Management Plugin (CMP) trong các phần sau nhé. Trong phần này, mình sẽ dùng cách 1 để ArgoCD hỗ trợ render helm chart bằng kustomize.

Chúng ta có thểm làm điều này bằng cách sửa đổi một chút trong file values.yaml. Bạn thêm config như sau:

## Argo Configs
configs:
  # General Argo CD configuration
  ## Ref: https://github.com/argoproj/argo-cd/blob/master/docs/operator-manual/argocd-cm.yaml
  cm:
    # -- Enable Kustomizing Helm charts
    ## Ref: https://argo-cd.readthedocs.io/en/stable/user-guide/kustomize
    kustomize.buildOptions: --enable-helm

Tiếp theo, chúng ta sẽ commit và push các file này lên GitOps Repository. Để quá trình sync diễn ra ngay lập tức, hãy vào trang Dashboard và nhấn nút Sync cho argocd-bootstrap.

image.png

Sau khi quá trình đồng bộ kết thúc, bạn sẽ thấy argocd-bootstrap bây giờ sẽ có thêm 1 Application mới tên argocd, trông như thế này:

image.png

Nice! 👍

Bootstrap thêm apps khác

Tương tự như Application argocd-bootstrap, mình sẽ sử dụng tiếp App of Apps pattern cho Application mới có tên là apps. Application này sẽ chịu trách nhiệm bootstrap thêm các app khác được lưu trong thư mục apps.

Lý do các mình không lưu chung vào trong thư mục bootstrap là vì muốn thư mục bootstrap chỉ chứa các Application quan trọng nhất và cơ bản nhất để tập trung cho việc bootstrap cluster khi nó còn mới toanh. Còn Application để deploy dự án thì sẽ chuyển hết ra ngoài thư mục apps để deploy sau.

Mình khai báo application qua file apps.yaml như sau:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: apps
  namespace: argocd
spec:
  destination:
    namespace: argocd
    name: in-cluster
  source:
    repoURL: "https://github.com/devsuccess101/ds101-cluster"
    targetRevision: main
    path: apps
    directory:
      recurse: true
  project: default
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
      allowEmpty: true
    syncOptions:
      - CreateNamespace=true
      - ApplyOutOfSyncOnly=true

Tạo thêm thư mục apps:

mkdir apps

Cuối cùng là commit và push lên GitOps Repository, đợi quá trình sync hoàn tất các bạn sẽ có được mô hình App of Apps of Apps 😄:

Tổng kết

image.png

Như vậy chúng ta đã bootstrap cluster thành công! Giờ muốn tạo deploy thêm service thì chỉ cần khai báo application dưới dạng YAML manifest và lưu vào thư mục apps mà thôi. 👍 Đây cũng là chính cách thức triển khai mà DevSuccess101 đang áp dụng để deploy và quản lý rất nhiều service khác trên K8s.

image.png

Chú ý: Nếu cần bootstrap lại vào một cluster mới toanh, chỉ cần chạy hai lệnh:

kubectl kustomize --enable-helm bootstrap/argocd | kubectl apply -f -
kubectl apply -f bootstrap/argocd-bootstrap.yaml

Các bạn có thể lưu chúng vào file bootstrap.sh hoặc Makefile để sử dụng khi cần.

Next Steps

Tìm hiểu thêm về các sync options của ArgoCD để vận dụng một cách linh hoạt cũng như tránh tình trạng: Anh ơi, sao em xóa Application khỏi gitops repository rồi mà vẫn thấy Pod còn chạy trên 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.