- Đăng vào
Sử dụng ArgoCD triển khai giải pháp database trên Kubernetes với CloudNative-PG
CloudNative-PG là một công cụ hữu ích cho việc xây dựng và quản lý cụm cơ sở dữ liệu PostgreSQL trong môi trường Kubernetes. Trong bài viết này mình sẽ hướng dẫn dùng ArgoCD để triển khai CloudNative-PG trên kubernetes cluster sẵn có.
Giới thiệu
CloudNative-PG là một Kubernetes operator được thiết kế để quản lý cụm cơ sở dữ liệu PostgreSQL với kiến trúc primary/standby sử dụng native streaming replication. Điều này có nghĩa là nó tự động hóa các bước mà database admin thực hiện để triển khai và quản lý cơ sở dữ liệu PostgreSQL.
Tất nhiên, việc triển khai cơ sở dữ liệu trên Kubernetes có những ưu điểm và hạn chế mà bạn nên xem xét kỹ trước khi quyết định:
- Ưu điểm của việc triển khai cơ sở dữ liệu trên Kubernetes:
- Tiêu chuẩn hóa (Standardization): Kubernetes cung cấp một nền tảng thống nhất để quản lý cơ sở dữ liệu và ứng dụng trên cả môi trường on-premises và đám mây. Điều này giúp đơn giản hóa việc duy trì và triển khai cơ sở dữ liệu.
- Tự phục vụ (Self-service): Nhóm phát triển và quản lý có thể tự triển khai và quản lý cơ sở dữ liệu thông qua self-service, giúp tối ưu hóa hoạt động.
- Nhược điểm của việc triển khai cơ sở dữ liệu trên Kubernetes:
- Khả năng quản lý stateful services: Kubernetes thường được thiết kế cho các ứng dụng stateless, và việc quản lý stateful services như cơ sở dữ liệu (ví dụ: PostgreSQL và MySQL) có những hạn chế cơ bản. Việc đảm bảo tính nhất quán và khả năng phục hồi cho cơ sở dữ liệu trong môi trường Kubernetes đòi hỏi sự cân nhắc kỹ lưỡng.
Dùng ArgoCD để triển khai CloudNative-PG
Chart cloudnative-pg
Chúng ta cần deploy cloudnative-pg đây chính là operator để quản lý PostgreSQL.
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: cnpg-system
namespace: argocd
finalizers:
- resources-finalizer.argocd.argoproj.io
labels:
name: database
spec:
syncPolicy:
automated:
selfHeal: true
prune: true
allowEmpty: false
syncOptions:
- Validate=false
- CreateNamespace=true
- PrunePropagationPolicy=foreground
- PruneLast=true
- RespectIgnoreDifferences=true
- Replace=true
- ServerSideApply=true
project: default
source:
chart: cloudnative-pg
repoURL: https://cloudnative-pg.github.io/charts
targetRevision: 0.*
helm:
releaseName: cnpg
passCredentials: false
parameters:
- name: "monitoring.podMonitorEnabled"
value: "true"
destination:
server: "https://kubernetes.default.svc"
namespace: cnpg-system
revisionHistoryLimit: 3
Chúng ta chỉ cần chạy command
kubectl apply -f cloudnative-pg.yaml
Chart cluster
Sau khi đã deploy thành công operator, chúng ta có thể khai báo 1 database mới như sau
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: mydatabase
namespace: argocd
finalizers:
- resources-finalizer.argocd.argoproj.io
labels:
name: mydatabase
spec:
syncPolicy:
automated:
selfHeal: true
prune: true
allowEmpty: false
syncOptions:
- Validate=false
- CreateNamespace=true
- PrunePropagationPolicy=foreground
- PruneLast=true
- RespectIgnoreDifferences=true
- Replace=true
project: default
source:
chart: cluster
repoURL: https://cloudnative-pg.github.io/charts
targetRevision: 0.*
helm:
releaseName: cnpg
passCredentials: false
parameters:
- name: "fullnameOverride"
value: "pgsql"
- name: "cluster.instances"
value: "1"
- name: "cluster.storage.storageClass"
value: "nfs-storage"
- name: "cluster.walStorage.enabled"
value: "true"
- name: "cluster.walStorage.storageClass"
value: "<cluster-storage-class>"
- name: "cluster.monitoring.enabled"
value: "true"
destination:
server: "https://kubernetes.default.svc"
namespace: mydatabase
revisionHistoryLimit: 3
Ở dòng số 41, bạn cần phải sửa lại cho phù hợp với storage class mà Kubenretes cluster của bạn đang sử dụng. Chi tiết các config khác có thể xem ở: https://github.com/cloudnative-pg/charts/tree/main/charts/cluster
Chúc thành công,
ANH NGUYỄN
Hiện tại mình đang tìm kiếm công việc mới với nhiều thử thách để chinh phục.
Mọi thông tin có thể gửi về me@nvtienanh.info.