[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 Repository và Credential 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ì?
- Tạo namespace
argocd
- 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 filenamespace.yaml
khỏi GitOps Repository thì khi đồng bộ, ArgoCD sẽ không xóa mất Namespaceargocd
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:
- File
bootstrap/argocd-bootstrap.yaml
là file YAML định nghĩa Application có tênargocd-bootstrap
. - 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ụcbootstrap
trên GitOps repository. Theo hình minh họa, các bạn có thể thấyargocd-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ụcbootstrap
.directory.recurse
: Giá trịtrue
để ArgoCD đọc cả subfolder.directory.exclude
: Chúng ta điềnargocd/*
để ArgoCD bỏ qua hết tất cả các file trong subfolderbootstrap/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:
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:
- Tạo file
argocd.yaml
để khai báo Application - Kích hoạt chế độ
--enable-helm
cho ArgoCD để có thể sử dụng dùng Kustomize cùng với Helm chart - 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:
- Sử dụng build options
--enable-helm
- 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
.
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:
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
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.
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ặcMakefile
để 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