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.
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ườngname
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ỉ địnhStorageClass
cho PV này.StorageClass
tênmanual
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ỉ địnhStorageClass
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
, STORAGECLASS
và AGE
.
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
, STORAGECLASS
và AGE
.
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ý. Trongmetadata
, trườnglabels
gán nhãn cho các Pod được tạo từ template này, vớiapp: 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ênpostgres-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ạyps_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ácps_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.