Triển khai PostgreSQL HA với Patroni trên Kubernetes bằng Helm

Chào mừng các “người yêu dữ liệu” và “kẻ săn lùng Kubernetes” đến với bữa tiệc “PostgreSQL HA trên K8s” – nơi mà Helm, Terraform và một chút hài hước sẽ làm cho việc triển khai không còn là cơn ác mộng mà trở thành một buổi tiệc nướng BBQ công nghệ. Hãy cùng daileit lướt qua từng bước, từ “cài đặt” tới “đánh giá” để có một cụm PostgreSQL luôn sẵn sàng, không “đổ bể” khi gặp bão.

1. Tại sao phải “HA” (Highly Available) cho PostgreSQL?

PostgreSQL vốn nổi tiếng vì tính ổn định và tính năng phong phú, nhưng như mọi “người hùng” trong truyện cổ tích, nếu không có “cứu trợ” thì cũng có thể “bị kẻ thù” (điện mất, pod chết, node crash) hạ gục. HA chính là “cánh áo bảo hiểm” giúp:

  • Zero downtime – người dùng không cảm nhận được “điện cúp”.
  • Automatic failover – khi master “đi nghỉ phép”, replica nhanh chóng nhận vai trò.
  • Data durability – dữ liệu luôn được sao chép đồng thời, không lo “đổ bể”.

2. Kiến trúc “HA” trên Kubernetes

postgresql-cluster-patroni-kubernetes

Khi đưa PostgreSQL lên K8s, chúng ta thường dùng mô hình Patroni + etcd/Consul + PgBouncer. Tóm tắt nhanh:

  • Patroni – “điều khiển trung tâm” quyết định master/replica.
  • etcd/Consul – “kho lưu trữ khóa” để đồng bộ trạng thái cluster.
  • PgBouncer – “cổng vào” (connection pooler) giảm tải kết nối trực tiếp tới DB.
  • StatefulSet – đảm bảo mỗi pod có PVC ổn định, không “đổi nhà” khi restart.

3. Công cụ “điểm tựa” – Helm và Terraform

Hai công cụ này giống như “cây dù” và “bản đồ” trong chuyến leo núi:

  • Helm – quản lý các chart (gói) của PostgreSQL HA, giúp “cài đặt nhanh, cấu hình linh hoạt”.
  • Terraform – “Infrastructure as Code” (IaC), tự động tạo cluster K8s, VPC, security groups, và thậm chí các secret cho DB.

4. Bước chuẩn bị “đồ dùng”

4.1. Cài đặt Helm

curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update

4.2. Cài đặt Terraform

curl -LO https://releases.hashicorp.com/terraform/1.9.5/terraform_1.9.5_linux_amd64.zip
unzip terraform_1.9.5_linux_amd64.zip
sudo mv terraform /usr/local/bin/
terraform -v

4.3. Tạo Cluster Kubernetes (ví dụ AWS EKS)

Đây là “đất nền” cho toàn bộ công trình. Dưới đây là một file main.tf mẫu:

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
    kubernetes = {
      source  = "hashicorp/kubernetes"
      version = "~> 2.0"
    }
  }
  required_version = ">= 1.5.0"
}

provider "aws" {
  region = var.aws_region
}

resource "aws_eks_cluster" "pg_ha_cluster" {
  name     = "pg-ha-eks"
  role_arn = aws_iam_role.eks_cluster.arn

  vpc_config {
    subnet_ids = aws_subnet.private[*].id
  }
}

# IAM role, VPC, subnets, security groups … (được tạo ở các module khác)

Chạy:

terraform init
terraform apply -auto-approve

5. Đưa Helm Chart PostgreSQL HA vào “bếp”

Bitnami cung cấp chart postgresql-ha rất “đầy đủ”. Hãy tạo một file values.yaml để tùy chỉnh:

# values.yaml
global:
  postgresql:
    auth:
      username: daileit
      password: SuperSecret123!
      database: blogdb

replicaCount: 2

persistence:
  enabled: true
  size: 10Gi
  storageClass: gp2

service:
  type: ClusterIP

# Patroni settings
patroni:
  ttl: 30
  loop_wait: 10
  retry_timeout: 10
  maximum_lag_on_failover: 1048576 # 1 MB

Triển khai:

helm install pg-ha bitnami/postgresql-ha -f values.yaml --namespace db --create-namespace

6. Kiểm tra “độ ổn định” của cluster

Sau khi Helm hoàn thành, chúng ta có thể kiểm tra các pod:

kubectl get pods -n db -l app.kubernetes.io/name=postgresql-ha

Kết quả mong đợi: một pod pg-ha-postgresql-0master, hai pod còn lại là replica. Để xác nhận, chạy:

kubectl exec -n db pg-ha-postgresql-0 -- psql -U daileit -c "SELECT pg_is_in_recovery();"

Kết quả f nghĩa là đang ở chế độ master.

7. Thêm PgBouncer – “quầy check‑in” cho kết nối

Để giảm tải và tránh “đổ xô” vào master, chúng ta cài thêm PgBouncer qua Helm:

helm repo add crunchydata https://charts.crunchydata.com/
helm install pgbouncer crunchydata/pgbouncer \
  --set postgresql.host=pg-ha-postgresql \
  --set postgresql.port=5432 \
  --set postgresql.username=daileit \
  --set postgresql.password=SuperSecret123! \
  --namespace db

8. Tự động failover – Khi “master” “đi nghỉ”

Patroni sẽ tự động phát hiện khi master không phản hồi (TTL hết) và chuyển một replica thành master mới. Để thử nghiệm, bạn có thể “giả chết” pod master:

kubectl delete pod pg-ha-postgresql-0 -n db

Sau vài giây, một trong các replica sẽ nhận vai trò master. Kiểm tra lại bằng lệnh pg_is_in_recovery() như trên.

9. Backup & Restore – “bảo hiểm” cho dữ liệu

Bitnami chart hỗ trợ wal‑g (hoặc pgBackRest**) để sao lưu lên S3. Thêm vào values.yaml:

backup:
  enabled: true
  provider: s3
  s3:
    bucket: my-pg-backup-bucket
    region: us-west-2
    accessKeyId: ${AWS_ACCESS_KEY_ID}
    secretAccessKey: ${AWS_SECRET_ACCESS_KEY}

Sau khi cập nhật, chạy helm upgrade và cronjob sẽ tự động sao lưu mỗi 6 giờ.

10. Giám sát – “đôi mắt” cho cluster

Đừng để cluster “đi lạc” mà không biết. Thêm Prometheus & Grafana:

helm install prometheus prometheus-community/kube-prometheus-stack \
  --namespace monitoring --create-namespace

# Thêm các ServiceMonitor cho PostgreSQL
cat > pg-monitor.yaml <<EOF
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: pg-ha
  labels:
    release: prometheus
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: postgresql-ha
  endpoints:
  - port: metrics
    interval: 30s
EOF

kubectl apply -f pg-monitor.yaml -n db

Grafana sẽ có dashboard “PostgreSQL HA” để bạn “ngắm nhìn” latency, replication lag, và số lượng kết nối.

11. Tổng kết – Khi mọi thứ “đều ổn”

Với Helm, Terraform và một chút “vũ khí” như Patroni, PgBouncer, và Prometheus, bạn đã có một PostgreSQL HA trên Kubernetes vừa “đẹp” vừa “bền”. Đặc biệt, việc dùng Terraform để tạo cluster và Helm để quản lý ứng dụng giúp bạn:

  • Tiết kiệm thời gian (cài đặt trong vài phút).
  • Đảm bảo tính nhất quán (cùng một file .tf và .yaml cho mọi môi trường).
  • Dễ dàng mở rộng (chỉ cần tăng replicaCount hoặc thêm node).

Nhớ luôn kiểm tra backup, monitor và thực hành “chaos testing” để chắc chắn rằng khi thực tế “đổ bão”, hệ thống vẫn “đứng vững”. Chúc bạn thành công và đừng quên “cười” khi gặp lỗi – vì mỗi lỗi là một cơ hội để học hỏi (và viết blog hài hước tiếp theo)!

SEO Keywords

  • PostgreSQL HA
  • Kubernetes
  • Helm chart PostgreSQL
  • Terraform Kubernetes
  • Patroni
  • PgBouncer
  • StatefulSet
  • Backup PostgreSQL S3
  • Prometheus PostgreSQL monitoring
  • High Availability database
  • Infrastructure as Code
  • Bitnami PostgreSQL HA
  • Cluster autoscaling
  • Failover tự động
  • CI/CD PostgreSQL

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

60 − = 54
Powered by MathCaptcha