Đă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.

cloudnative-pg.yaml
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

database.yaml
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.