Reading Time: 8 minutes

Triển khai PostgreSQL trên Kubernetes cluster đã trở thành cách tiếp cận phổ biến để quản lý môi trường cơ sở dữ liệu có khả năng mở rộng, phục hồi và linh hoạt. Kubernetes có khả năng điều phối container, cung cấp một framework mạnh mẽ để triển khai và quản lý ứng dụng, bao gồm cả cơ sở dữ liệu như PostgreSQL, trong môi trường phân tán.

 triển khai PostgreSQL trên Kubernetes Cluster

Sự tích hợp này mang lại lợi ích đáng kể về khả năng mở rộng, tính linh hoạt và hiệu quả sử dụng tài nguyên. Bằng cách tận dụng các tính năng của Kubernetes như khả năng mở rộng, triển khai tự động và khả năng tự phục hồi, người dùng có thể đảm bảo hoạt động liền mạch của cơ sở dữ liệu PostgreSQL trong môi trường container hóa.

Hướng dẫn này sẽ đi qua từng bước trong quá trình triển khai PostgreSQL trên Kubernetes cluster. Dù bạn là nhà phát triển, kỹ sư DevOps hay quản trị hệ thống muốn triển khai PostgreSQL trong môi trường Kubernetes một cách hiệu quả, hướng dẫn này cũng sẽ mang đến cái nhìn toàn diện.

Điều kiện tiên quyết

Trước khi bắt đầu hướng dẫn này, bạn sẽ cần:

  • Một máy chủ phát triển hoặc máy cục bộ để thực hiện việc triển khai PostgreSQL.
  • Công cụ dòng lệnh kubectl được cài đặt trên máy phát triển của bạn. Để cài đặt, bạn hãy làm theo hướng dẫn trong tài liệu chính thức của Kubernetes.
  • Một Kubernetes cluster. Bạn có thể khởi tạo một DigitalOcean Kubernetes cluster bằng cách làm theo hướng dẫn Kubernetes Quickstart.

Tạo ConfigMap để lưu trữ thông tin cơ sở dữ liệu

Trong Kubernetes, ConfigMap là một đối tượng API dùng để lưu trữ dữ liệu cấu hình dưới dạng các cặp key-value, mà các pod hoặc container có thể sử dụng trong cluster. ConfigMap giúp tách biệt thông tin cấu hình khỏi mã ứng dụng, giúp việc quản lý và cập nhật cấu hình trở nên dễ dàng hơn mà không cần thay đổi mã nguồn ứng dụng.

Hãy tạo một tệp cấu hình ConfigMap để lưu thông tin kết nối PostgreSQL như hostname, tên cơ sở dữ liệu, tên người dùng và các thiết lập khác.

nano postgres-configmap.yaml

Thêm nội dung cấu hình sau. Định nghĩa tên cơ sở dữ liệu mặc định, người dùng và mật khẩu:

apiVersion: v1
kind: ConfigMap
metadata:
  name: postgres-secret
  labels:
    app: postgres
data:
  POSTGRES_DB: ps_db
  POSTGRES_USER: ps_user
  POSTGRES_PASSWORD: SecurePassword

Phân tích cấu hình trên:

  • apiVersion: v1: chỉ định phiên bản API của Kubernetes được sử dụng cho ConfigMap này.
  • kind: ConfigMap: xác định loại tài nguyên Kubernetes.
  • Trong phần metadata, trường name chỉ định tên của ConfigMap, được đặt là postgres-secret. Ngoài ra, labels được gắn vào ConfigMap để giúp nhận diện và tổ chức tài nguyên.
  • Phần data chứa dữ liệu cấu hình dưới dạng cặp key-value:
    • POSTGRES_DB: xác định tên cơ sở dữ liệu mặc định cho PostgreSQL.
    • POSTGRES_USER: xác định tên người dùng mặc định cho PostgreSQL.
    • POSTGRES_PASSWORD: xác định mật khẩu mặc định cho người dùng PostgreSQL.

Lưu ý, bạn không nên lưu dữ liệu nhạy cảm trong ConfigMap để tránh tiềm ẩn rủi ro bảo mật. Khi xử lý dữ liệu nhạy cảm trong Kubernetes, bạn nên sử dụng Secrets và tuân theo các phương pháp bảo mật tốt nhất để đảm bảo an toàn và tính bảo mật cho dữ liệu của bạn.

Lưu và đóng tệp, sau đó áp dụng cấu hình ConfigMap vào Kubernetes:

kubectl apply -f postgres-configmap.yaml

Bạn có thể kiểm tra việc triển khai ConfigMap bằng lệnh sau:

kubectl get configmap

Output
NAME               DATA   AGE
kube-root-ca.crt   1      116s
postgres-secret    3      12s

Tạo PersistentVolume (PV) và PersistentVolumeClaim (PVC)

PersistentVolume (PV) và PersistentVolumeClaim (PVC) là các tài nguyên trong Kubernetes, được sử dụng để cung cấp và yêu cầu lưu trữ lâu dài trong cụm. PV cung cấp tài nguyên lưu trữ trong cụm, còn PVC cho phép pod yêu cầu một tài nguyên lưu trữ cụ thể.

Trước tiên, tạo một tệp YAML cho PV.

nano psql-pv.yaml

Thêm cấu hình sau:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: postgres-volume
  labels:
    type: local
    app: postgres
spec:
  storageClassName: manual
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteMany
  hostPath:
    path: /data/postgresql

Giải thích các thành phần:

  • storageClassName: manual chỉ định StorageClass cho PV này. StorageClass tên manual cho biết quá trình cấp phát lưu trữ được thực hiện thủ công.
  • capacity xác định dung lượng mong muốn của PV.
  • accessModes định nghĩa các chế độ truy cập mà PV hỗ trợ, ở đây là ReadWriteMany cho phép nhiều pod đọc và ghi vào volume cùng lúc.
  • hostPath là loại volume được tạo trực tiếp trên hệ thống tệp của node. Đây là thư mục trên hệ điều hành host (/data/postgresql) sẽ được dùng làm nơi lưu trữ dữ liệu cho PV. Đường dẫn này trỏ đến vị trí trên máy chủ nơi dữ liệu của PV sẽ được lưu trữ.

Lưu tệp rồi áp dụng cấu hình vào Kubernetes:

kubectl apply -f psql-pv.yaml

Tiếp theo, tạo một tệp YAML cho PVC.

nano psql-claim.yaml

Thêm cấu hình sau:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: postgres-volume-claim
  labels:
    app: postgres
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 10Gi

Giải thích các thành phần:

  • kind: PersistentVolumeClaim cho biết YAML này định nghĩa một tài nguyên PVC.
  • storageClassName: manual chỉ định StorageClass mong muốn cho PVC này.
  • accessModes nêu chế độ truy cập mà PVC yêu cầu.
  • resources định nghĩa tài nguyên mà PVC yêu cầu, trong đó:
    • requests xác định dung lượng lưu trữ được yêu cầu (storage: 10Gi).

Lưu tệp rồi áp dụng cấu hình vào Kubernetes:

kubectl apply -f psql-claim.yaml

Bây giờ, dùng lệnh sau để liệt kê tất cả PV trong cụm:

kubectl get pv

Lệnh này sẽ hiển thị chi tiết về từng PV, gồm NAME, CAPACITY, ACCESS MODES, STATUS, RECLAIM POLICY, STORAGECLASSAGE.

Ví dụ kết quả:

NAME              CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                           STORAGECLASS   REASON   AGE
postgres-volume   10Gi       RWX            Retain           Bound    default/postgres-volume-claim   manual                  34s

Để liệt kê tất cả PVC trong cụm, dùng:

kubectl get pvc

Lệnh này sẽ hiển thị thông tin về các PVC, gồm NAME, STATUS, VOLUME, CAPACITY, ACCESS MODES, STORAGECLASSAGE.

Ví dụ kết quả:

NAME                    STATUS   VOLUME            CAPACITY   ACCESS MODES   STORAGECLASS   AGE
postgres-volume-claim   Bound    postgres-volume   10Gi       RWX            manual         22s

Tạo PostgreSQL Deployment

Tạo một PostgreSQL Deployment trong Kubernetes liên quan đến việc định nghĩa một tệp manifest Deployment để điều phối các Pod PostgreSQL.

Tạo một tệp YAML ps-deployment.yaml để định nghĩa PostgreSQL Deployment.

nano ps-deployment.yaml

Thêm nội dung sau:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: postgres
spec:
  replicas: 3
  selector:
    matchLabels:
      app: postgres
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
        - name: postgres
          image: 'postgres:14'
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 5432
          envFrom:
            - configMapRef:
                name: postgres-secret
          volumeMounts:
            - mountPath: /var/lib/postgresql/data
              name: postgresdata
      volumes:
        - name: postgresdata
          persistentVolumeClaim:
            claimName: postgres-volume-claim

Dưới đây là giải thích ngắn gọn cho từng tham số:

  • replicas: 3 chỉ định số lượng bản sao mong muốn.
  • selector xác định cách Deployment nhận biết Pod nào mà nó quản lý.
  • template định nghĩa Pod template dùng để tạo các Pod mới do Deployment quản lý. Trong metadata, trường labels gán nhãn cho các Pod được tạo từ template này, với app: postgres.
  • containers xác định container bên trong Pod.
    • name: postgres là tên được gán cho container.
    • image: postgres:14 chỉ định ảnh Docker cho cơ sở dữ liệu PostgreSQL.
    • imagePullPolicy: IfNotPresent chỉ định chính sách kéo hình ảnh của container.
    • ports xác định các cổng mà container sẽ mở.
    • envFrom cho phép container nạp các biến môi trường từ ConfigMap.
    • volumeMounts cho phép gắn volume vào trong container.
  • volumes định nghĩa các volume có thể được gắn vào Pod.
    • name: postgresdata chỉ định tên của volume.
    • persistentVolumeClaim tham chiếu đến một PVC có tên postgres-volume-claim. PVC này được dùng để cung cấp lưu trữ bền vững cho container PostgreSQL, nhờ đó dữ liệu được giữ lại khi Pod khởi động lại hoặc bị lên lịch lại.

Lưu và đóng tệp, sau đó áp dụng Deployment:

kubectl apply -f ps-deployment.yaml

Lệnh này sẽ tạo PostgreSQL Deployment dựa trên các thông số trong tệp YAML.

Để kiểm tra trạng thái của Deployment đã tạo:

kubectl get deployments

Kết quả sau xác nhận PostgreSQL Deployment đã được tạo thành công:

NAME       READY   UP-TO-DATE   AVAILABLE   AGE
postgres   3/3     3            3           17s

Để kiểm tra các Pod đang chạy, thực hiện lệnh sau:

kubectl get pods

Bạn sẽ thấy các Pod đang chạy trong kết quả như sau:

NAME                        READY   STATUS    RESTARTS      AGE
postgres-665b7554dc-cddgq   1/1     Running   0             28s
postgres-665b7554dc-kh4tr   1/1     Running   0             28s
postgres-665b7554dc-mgprp   1/1     Running   1 (11s ago)   28s

Tạo Service cho PostgreSQL

Trong Kubernetes, Service dùng để định nghĩa một tập logic các Pod, cho phép các Pod khác trong cluster giao tiếp với một nhóm Pod mà không cần biết địa chỉ IP cụ thể của các Pod đó.

Hãy tạo một tệp manifest Service để expose PostgreSQL ở bên trong Kubernetes cluster:

nano ps-service.yaml

Thêm cấu hình sau:

apiVersion: v1
kind: Service
metadata:
  name: postgres
  labels:
    app: postgres
spec:
  type: NodePort
  ports:
    - port: 5432
  selector:
    app: postgres

Lưu tệp, sau đó áp dụng YAML này vào Kubernetes:

kubectl apply -f ps-service.yaml

Khi Service đã được tạo, các ứng dụng hoặc dịch vụ khác trong Kubernetes cluster có thể giao tiếp với cơ sở dữ liệu PostgreSQL bằng tên postgres và cổng 5432 như một điểm vào.

Bạn có thể kiểm tra việc triển khai Service bằng lệnh sau.

kubectl get svc

Output
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP          6m6s
postgres     NodePort    10.98.119.102   <none>        5432:30344/TCP   6s

Kết nối PostgreSQL thông qua kubectl

Trước tiên, liệt kê các Pod có sẵn trong namespace để tìm Pod PostgreSQL:

kubectl get pods

Bạn sẽ thấy các pod đang chạy trong kết quả sau:

NAME                        READY   STATUS    RESTARTS      AGE
postgres-665b7554dc-cddgq   1/1     Running   0             28s
postgres-665b7554dc-kh4tr   1/1     Running   0             28s
postgres-665b7554dc-mgprp   1/1     Running   1 (11s ago)   28s

Xác định tên của Pod PostgreSQL từ kết quả trên.

Khi đã xác định được, dùng lệnh kubectl exec để kết nối tới Pod PostgreSQL:

kubectl exec -it postgres-665b7554dc-cddgq -- psql -h localhost -U ps_user --password -p 5432 ps_db

  • postgres-665b7554dc-cddgq: tên Pod nơi container PostgreSQL đang chạy
  • ps_user: chỉ định username để kết nối cơ sở dữ liệu PostgreSQL
  • -password: yêu cầu nhập mật khẩu tương tác
  • ps_db: chỉ định tên database cần kết nối khi đã xác thực thành công

Bạn sẽ được yêu cầu nhập mật khẩu cho người dùng Postgres. Sau khi xác thực thành công, bạn sẽ vào được Postgres shell:

Password:
psql (14.10 (Debian 14.10-1.pgdg120+1))
Type "help" for help.
ps_db=#

Tiếp theo, xác minh kết nối PostgreSQL bằng lệnh sau:

ps_db=# \\conninfo

Bạn sẽ thấy kết quả:

You are connected to database "ps_db" as user "ps_user" on host "localhost" (address "::1") at port "5432".

Bạn có thể thoát khỏi shell PostgreSQL bằng lệnh:

exit

Scale PostgreSQL Deployment

Scale PostgreSQL trong Kubernetes có nghĩa là điều chỉnh số lượng bản sao (replicas) trong Deployment hoặc StatefulSet để quản lý các Pod PostgreSQL.

Trước tiên, kiểm tra trạng thái hiện tại của Deployment PostgreSQL:

kubectl get pods -l app=postgres

Kết quả:

postgres-665b7554dc-cddgq   1/1     Running   0              2m12s
postgres-665b7554dc-kh4tr   1/1     Running   0              2m12s
postgres-665b7554dc-mgprp   1/1     Running   1 (115s ago)   2m12s

Để scale PostgreSQL lên 5 bản sao, dùng lệnh:

kubectl scale deployment --replicas=5 postgres

Thay 5 bằng số bản sao bạn muốn cho deployment PostgreSQL.

Tiếp theo, kiểm tra lại trạng thái để chắc chắn rằng đã scaling thành công:

kubectl get pods -l app=postgres

Bạn sẽ thấy số Pod đã tăng lên 5:

NAME                        READY   STATUS    RESTARTS        AGE
postgres-665b7554dc-cddgq   1/1     Running   0               3m56s
postgres-665b7554dc-ftxbl   1/1     Running   0               10s
postgres-665b7554dc-g2nh6   1/1     Running   0               10s
postgres-665b7554dc-kh4tr   1/1     Running   0               3m56s
postgres-665b7554dc-mgprp   1/1     Running   1 (3m39s ago)   3m56s

Backup và Restore cơ sở dữ liệu PostgreSQL

Bạn có thể backup một cơ sở dữ liệu PostgreSQL đang chạy trong Pod Kubernetes bằng cách kết hợp lệnh kubectl exec với công cụ pg_dump trực tiếp trong Pod.

Trước tiên, liệt kê tất cả Pod để tìm tên của Pod PostgreSQL:

kubectl get pods

Tiếp theo, chạy lệnh pg_dump bên trong Pod PostgreSQL bằng:

kubectl exec -it postgres-665b7554dc-cddgq -- pg_dump -U ps_user -d ps_db > db_backup.sql

Lệnh này sẽ dump cơ sở dữ liệu và chuyển kết quả ra tệp db_backup.sql trong thư mục cục bộ.

Để khôi phục cơ sở dữ liệu trở lại Pod, bạn cần tệp SQL dump và dùng lệnh psql để thực hiện quá trình khôi phục.

Đầu tiên, copy tệp SQL dump từ máy cục bộ vào Pod PostgreSQL bằng:

kubectl cp db_backup.sql postgres-665b7554dc-cddgq:/tmp/db_backup.sql

Tiếp theo, kết nối vào Pod PostgreSQL:

kubectl exec -it postgres-665b7554dc-cddgq -- /bin/bash

Chạy lệnh psql để restore backup từ file dump:

psql -U ps_user -d ps_db -f /tmp/db_backup.sql

Kết luận

Hướng dẫn này đã trình bày các bước triển khai PostgreSQL cơ bản trong môi trường Kubernetes. Bằng cách tận dụng khả năng điều phối của Kubernetes, các tổ chức có thể quản lý hiệu quả các instance PostgreSQL, scale tài nguyên một cách linh hoạt, đảm bảo tính khả dụng cao và đơn giản hóa các hoạt động bảo trì.

Nếu bạn muốn tìm hiểu thêm về Kubernetes và Helm, hãy tham khảo phần Kubernetes trên trang cộng đồng của chúng tôi.

0 Bình luận

Đăng nhập để thảo luận

Chuyên mục Hướng dẫn

Tổng hợp các bài viết hướng dẫn, nghiên cứu và phân tích chi tiết về kỹ thuật, các xu hướng công nghệ mới nhất dành cho lập trình viên.

Đăng ký nhận bản tin của chúng tôi

Hãy trở thành người nhận được các nội dung hữu ích của CyStack sớm nhất

Xem chính sách của chúng tôi Chính sách bảo mật.

Đăng ký nhận Newsletter

Nhận các nội dung hữu ích mới nhất