آموزش نصب و راه اندازی PostgreSQL در کلاستر Kubernetes
نصب و راه اندازی پایگاه داده PostgreSQL در کلاستر Kubernetes به روشی محبوب برای مدیریت خودکار پایگاه داده ها به صورت مقیاسپذیر، منعطف و پویا تبدیل شده است. Kubernetes با قابلیتهای ارکستراسیون کانتینر، یک چارچوب قدرتمند برای استقرار و مدیریت برنامهها، از جمله پایگاههای داده مانند PostgreSQL، در یک محیط توزیعشده ارائه میدهد. این یکپارچهسازی مزایای قابل توجهی در مقیاسپذیری، مقاومت در برابر خرابیها و بهرهوری در استفاده از منابع به همراه دارد. با استفاده از ویژگیهای Kubernetes مانند مقیاسپذیری، استقرار خودکار و قابلیتهای خودترمیمی، دیگر نیازی نیست نگران مشکلات معمول در مدیریت دیتابیس باشید، در این صورت می توانید تمرکز خود را روی توسعه و بهینهسازی سیستمهایتان بگذارید.
این راهنما فرآیند گامبهگام راه اندازی PostgreSQL در یک کلاستر Kubernetes را بررسی میکند. بنابراین چه شما یک توسعهدهنده، مهندس DevOps یا مدیر سیستم باشید که به دنبال نصب و راه اندازی PostgreSQL در کلاستر Kubernetes است، این مطلب به شما کمک خواهد کرد.
فهرست مطالب
- پیشنیازهای نصب PostgreSQL در کلاستر Kubernetes
- مزایای نصب و راه اندازی PostgreSQL با Kubernetes
- ایجاد یک ConfigMap برای ذخیره جزئیات پایگاه داده
- ایجاد PersistentVolume (PV) و PersistentVolumeClaim (PVC)
- راه اندازی PostgreSQL در کلاستر Kubernetes
- ایجاد سرویس برای PostgreSQL
- اتصال به PostgreSQL از طریق kubectl
- مقیاسبندی PostgreSQL
- بکاپ گیری و بازیابی پایگاه داده PostgreSQL
- نتیجهگیری
- سوالات متداول
پیشنیازهای نصب PostgreSQL در کلاستر Kubernetes
قبل از شروع این آموزش، به موارد زیر نیاز دارید:
- یک سرور مجازی با کاربری غیر root با دسترسی sudo و یک فایروال فعال
- ابزار خط فرمان
kubectl
روی سرور مجازی - یک کلاستر Kubernetes فعال
مزایای نصب و راه اندازی PostgreSQL با Kubernetes
پیش از آغاز مراحل نصب، درک مزایای راهاندازی PostgreSQL روی Kubernetes ضروری است. جدول مقایسهای زیر تفاوتهای بین روش بدون کلاستر Kubernetes و با Kubernetes را نشان میدهد:
ویژگیها | بدون کلاستر Kubernetes | با Kubernetes (راهحل ابری) |
---|---|---|
مقیاسپذیری | دستی، همراه با Downtime و تنظیمات پیچیده | خودکار، آنی و بدون توقف |
دسترسپذیری (HA) | نیاز به تنظیمات اضافی (مثل replication یا HAProxy) | بهصورت پیشفرض با ReplicaSet و Health Check |
مدیریت خطا و بازیابی | دستی، وابسته به ادمین سیستم | Self-healing با جایگزینی خودکار Podها |
بکاپگیری و بازیابی | نیازمند ابزارهای خارجی و اسکریپتنویسی | امکان استفاده از Volume Snapshot و CronJob |
آپدیت و راه اندازی | زمانبر با ریسک اختلال سرویس | Rolling Update با حداقل Downtime |
امنیت و ایزولاسیون | محدود به تنظیمات سطح OS | مدیریت متمرکز با Namespace، RBAC و Secret |
بهینهسازی منابع سختافزاری | استفاده غیربهینه و کنترل دستی | بهینهسازی مصرف منابع با Resource Limit/Request |
اتوماسیون و CI/CD | پیادهسازی دشوار و زمانبر | ادغام آسان با GitOps و DevOps Pipeline ها |
چیزی که نصب و راه اندازی PostgreSQL با Kubernetes را به روشی بهتر تبدیل میکند محدودیتهای نصب بدون کلاستر Kubernetes است. روش قدیمی که مستلزم نصب مستقیم PostgreSQL روی سرورهای فیزیکی یا مجازی است، تنها برای پروژههای کوچک کارآمد است. با رشد سیستم و افزایش ترافیک، چالشهای حیاتی خود را نشان میدهند، مدیریت منابع به یک کابوس تبدیل میشود، مقیاسپذیری همواره با Downtime (توقف سرویس) همراه است، بازیابی دادهها پس از خرابی سرور فرآیندی پیچیده و زمانبر میشود و بهروزرسانیها به عملیاتی پرریسک و مشکلساز تبدیل میگردند.
اما نصب PostgreSQL روی Kubernetes این چالشها را از بین می برد. این پلتفرم با خلق یک معماری نوین، مدیریت دیتابیس را متحول میکند. در این معماری، StatefulSets برای مدیریت هوشمندانه پایگاههای داده Stateful , PersistentVolumes fvhd ptz nhni ih پس از ریاستارت شدن podها و همچنین ConfigMaps تنظیمات را متمرکز میکند.
قابلیت Self-Healing هوشمند Kubernetes در صورت خرابی هر پاد، بهصورت خودکار، یک نمونهی سالم جایگزین می کند. همچنین امکان انجام بهروزرسانیهای بدون وقفه از طریق قابلیت Rolling Update فراهم است که ارتقاء نسخهها را بدون ایجاد اختلال محسوس در سرویسدهی ممکن میسازد.
ایجاد یک ConfigMap برای ذخیره جزئیات پایگاه داده
در Kubernetes، یک ConfigMap یک شیء API است که دادههای پیکربندی را در قالب جفتهای کلید-مقدار ذخیره میکند و کانتینرها میتوانند در کلاستر از آن استفاده کنند. ConfigMaps به جدا کردن جزئیات پیکربندی از کد برنامه کمک میکند و مدیریت و بهروزرسانی تنظیمات پیکربندی را بدون تغییر کد برنامه آسانتر میکند.
اکنون به شما آموزش میدهیم که چطور باید یک فایل پیکربندی ConfigMap برای ذخیره جزئیات اتصال PostgreSQL مانند نام میزبان (hostname)، نام پایگاه داده، نام کاربری و سایر تنظیمات ایجاد کنید. برای این کار یک فایل YAML به نام postgresql-configmap.yaml، به کمک دستور زیر ایجاد کنید:
nano postgres-configmap.yaml
برای تنظیمات پیشفرض شامل نام دیتابیس، نام کاربری و رمز عبور، داخل فایل YAML کد زیر را اضافه کنید:
apiVersion: v1
kind: ConfigMap
metadata:
name: postgres-secret
labels:
app: postgres
data:
POSTGRES_DB: ps_db
POSTGRES_USER: ps_user
POSTGRES_PASSWORD: SecurePassword
توضیح بخش های مختلف دستور فوق:
apiVersion: v1
نسخه API Kubernetes را برای ConfigMap مشخص میکند.kind: ConfigMap
نوع منبع Kubernetes را تعریف میکند.- در بخش
metadata
، فیلدname
نام ConfigMap را به عنوان “postgres-secret” تنظیم میکند. علاوه بر این، برچسبهایی برای شناسایی و سازماندهی منابع نیز تعریف میشود. - بخش
data
دادههای پیکربندی را به صورت جفتهای کلید-مقدار ذخیره میکند:POSTGRES_DB
: نام پایگاه داده پیشفرض PostgreSQL را مشخص میکند.POSTGRES_USER
: نام کاربری پیشفرض PostgreSQL را مشخص میکند.POSTGRES_PASSWORD
: رمز عبور پیشفرض کاربر PostgreSQL را مشخص میکند.
نکته: ذخیره دادههای حساس در یک ConfigMap به دلیل مسائل امنیتی توصیه نمیشود.
فایل را ذخیره کرده و ببندید، سپس تنظیمات ConfigMap را با وارد کردن دستور زیر روی Kubernetes اعمال کنید:
kubectl apply -f postgres-configmap.yaml
برای اطمینان از اینکه ConfigMap در کلاستر Kubernetes ساخته شده است، دستور زیر را اجرا کنید:
kubectl get configmap
خروجی دستور فوق به صورت زیر است:
NAME DATA AGE
kube-root-ca.crt 1 116s
postgres-secret 3 12s
این خروجی نشان میدهد چه ConfigMapهایی در namespace فعلی کلاستر وجود دارند.
ایجاد PersistentVolume (PV) و PersistentVolumeClaim (PVC)
PersistentVolume (PV) و PersistentVolumeClaim (PVC) منابع Kubernetes هستند که ذخیرهسازی پایدار را در یک کلاستر فراهم میکنند. PersistentVolumeیک منبع ذخیرهسازی از پیش تعریفشده در کلاستر است و PersistentVolumeClaim به پادها امکان میدهد مقدار مشخصی از فضای ذخیرهسازی را درخواست کنند. استفاده از این ساختار به شما کمک میکند تا دادههای مهم مثل اطلاعات دیتابیس ها حتی در صورت ریاستارت پادها یا جابهجایی آنها بین نودها از بین نروند.
ایجاد PersistentVolume (PV)
به کمک دستور زیر یک فایل YAML برای PersistentVolume (PV) ایجاد کنید:
nano psql-pv.yaml
اکنون تنظیمات زیر را به فایل اضافه کنید:
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
توضیح بخش های مختلف دستور فوق:
storageClassName: manual
یک PersistentVolume مشخص میکند. StorageClass با نام “manual” نشان میدهد که تخصیص فضای ذخیرهسازی به صورت دستی انجام میشود.capacity
: ظرفیت مورد نظر PersistentVolume را مشخص میکند.accessModes
: روشهای دسترسی به PersistentVolume را تعریف میکند. در اینجا، مقدارReadWriteMany
تنظیم شده است که به چندین pod اجازه میدهد به طور همزمان به volume دسترسی داشته باشند.hostPath
: نوع volume است که مستقیماً روی فایلسیستم میزبان ایجاد میشود.
پس از اضافه کردن تنظیمات فوق، فایل را ذخیره کنید و برای اعمال تغییرات در Kubernetes کد زیر را اجرا کنید:
kubectl apply -f psql-pv.yaml
ایجاد PersistentVolumeClaim (PVC)
در این مرحله، به کمک دستور زیر یک فایل YAML برای PersistentVolumeClaim ایجاد کنید:
nano psql-claim.yaml
اکنون تنظیمات زیر را به فایل اضافه کنید:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: postgres-volume-claim
labels:
app: postgres
spec:
storageClassName: manual
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
توضیح بخش های مختلف دستور فوق:
kind: PersistentVolumeClaim
نشان میدهد که YAML یک منبع PersistentVolumeClaim را تعریف میکند.- storageClassName: manual یک PersistentVolume مشخص میکند. StorageClass با نام “manual” نشان میدهد که تخصیص فضای ذخیرهسازی به صورت دستی انجام میشود.
accessModes
: روش دسترسی مورد نیاز توسط PersistentVolumeClaim را مشخص میکند.resources
: منابع مورد نیاز برای PersistentVolumeClaim را تعریف میکند و مقدار فضای ذخیرهسازی مورد نیاز را مشخص میکند.
پس از اضافه کردن تنظیمات فوق، فایل را ذخیره کنید و برای اعمال تغییرات در Kubernetes کد زیر را اجرا کنید:
kubectl apply -f psql-claim.yaml
اکنون از دستور زیر برای لیست کردن تمام PersistentVolumes ایجاد شده در کلاستر Kubernetes استفاده کنید:
kubectl get pv
این دستور جزئیاتی درباره هر PersistentVolume شامل نام، ظرفیت، روشهای دسترسی، وضعیت فعلی و کلاس ذخیرهسازی را نمایش میدهد. خروجی این دستور به صورت زیر است:
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
postgres-volume 10Gi RWX Retain Bound default/postgres-volume-claim manual 34s
اکنون برای لیست کردن تمام PersistentVolumeClaims در کلاستر Kubernetes از دستور زیر استفاده کنید:
kubectl get pvc
این دستور اطلاعاتی درباره PersistentVolumeClaims شامل نامها، وضعیتها، فضای ذخیرهسازی درخواست شده، Volume های متصلشده و PersistentVolume مربوطه (در صورت متصل بودن) را نمایش میدهد. خروجی این دستور به صورت زیر است:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
postgres-volume-claim Bound postgres-volume 10Gi RWX manual 22s
راه اندازی PostgreSQL در کلاستر Kubernetes
برای راه اندازی PostgreSQL در کلاستر Kubernetes باید یک فایل YAML بسازید که مشخص کند Kubernetes چگونه باید pod های PostgreSQL را مدیریت کند. برای این کار یک فایل YAML جدید با نام ps-deployment.yaml
برای تعریف دیپلویمنت PostgreSQL ایجاد کنید:
nano ps-deployment.yaml
اکنون کد های زیر را به فایل اضافه کنید:
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
توضیح بخش های مختلف دستور فوق:
replicas: 3
: تعداد تکرارهای مورد نظر را مشخص میکند.- در بخش
containers
:name
: نام کانتینر را مشخص میکند.image
: این دستور image داکر را برای پایگاه داده PostgreSQL مشخص میکند.imagePullPolicy
: سیاست فراخوانی image کانتینر را تعیین میکند.ports
: پورتهایی که کانتینر به آنها دسترسی دارد را مشخص میکند.volumeMounts
: امکان نصبvolume
ها به کانتینر را فراهم میکند.
- در بخش
volumes
:name
: نامvolume
را مشخص میکند.persistentVolumeClaim
: به PersistentVolumeClaim با نام “postgres-volume-claim” اشاره میکند که احتمالاً برای ذخیرهسازی کانتینر PostgreSQL استفاده میشود.
پس از اضافه کردن تنظیمات فوق، فایل را ذخیره کنید و برای اعمال تغییرات در Kubernetes کد زیر را اجرا کنید:
kubectl apply -f ps-deployment.yaml
این دستور PostgreSQL را براساس مشخصات ارائهشده در فایل YAML ایجاد میکند. برای بررسی وضعیت deploy ایجاد شده دستور زیر را وارد کنید:
kubectl get deployments
با اجرا دستور فوق خروجی زیر را مشاهده خواهید کرد که تأیید میکند که راه اندازی PostgreSQL با موفقیت انجام شده است:
NAME READY UP-TO-DATE AVAILABLE AGE
postgres 3/3 3 3 17s
برای بررسی pod های در حال اجرا، دستور زیر را اجرا کنید:
kubectl get pods
خروجی زیر پادهای در حال اجرا را نمایش میدهد:
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
ایجاد سرویس برای PostgreSQL
در Kubernetes، یک سرویس برای تعریف مجموعهای منطقی از pod ها استفاده میشود که به سایر pod ها در کلاستر امکان میدهد بدون نیاز به دانستن آدرس IP مشخص pod ها، با آنها ارتباط برقرار کنند. اکنون ب کمک دسستور زیر یک فایل مانفیست سرویس برای در دسترس قرار دادن PostgreSQL به صورت داخلی در کلاستر Kubernetes ایجاد کنید:
nano ps-service.yaml
اکنون کد های زیر را به فایل اضافه کنید:
apiVersion: v1
kind: Service
metadata:
name: postgres
labels:
app: postgres
spec:
type: NodePort
ports:
- port: 5432
selector:
app: postgres
به کمک دستور زیر فایل را ذخیره کرده و این پیکربندی YAML را روی Kubernetes اعمال کنید:
kubectl apply -f ps-service.yaml
پس از ایجاد سرویس، سایر برنامهها یا سرویسها در کلاستر Kubernetes میتوانند با استفاده از نام postgres
و پورت 5432 به پایگاه داده PostgreSQL متصل شوند. برای بررسی وضعیت استقرار سرویس، دستور زیر را اجرا کنید:
kubectl get svc
خروجی دستور فوق به صورت زیر خواهد بود:
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
اتصال به PostgreSQL از طریق kubectl
پادهای موجود در namespace خود را بهکمک دستور زیر لیست کنید تا پاد مربوط به PostgreSQL را پیدا کنید:
kubectl get pods
خروجی زیر pod های در حال اجرا را نمایش میدهد:
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
نام pod های PostgreSQL را از خروجی پیدا کنید. پس از شناسایی pod های PostgreSQL، از دستور kubectl exec
برای اتصال به pod های PostgreSQL استفاده کنید:
kubectl exec -it postgres-665b7554dc-cddgq -- psql -h localhost -U ps_user --password -p 5432 ps_db
postgres-665b7554dc-cddgq
: نام pod است که کانتینر PostgreSQL در آن اجرا میشود.ps_user
: نام کاربری است که برای اتصال به پایگاه داده PostgreSQL استفاده خواهد شد.--password
: درخواست رمز عبور به صورت تعاملی.ps_db
: نام پایگاه دادهای است که پس از احراز هویت به آن متصل خواهید شد.
پس از اجرای این دستور، از شما خواسته میشود که رمز عبور کاربر PostgreSQL را وارد کنید. اکنون پس از احراز هویت موفقیتآمیز، وارد Postgres shell میشوید.
Password:
psql (14.10 (Debian 14.10-1.pgdg120+1))
Type "help" for help.
ps_db=#
برای تأیید اتصال به PostgreSQL از دستور زیر استفاده کنید:
ps_db=# \conninfo
با وارد کردن دستور فوق خروجی زیر را مشاهده خواهید کرد:
You are connected to database "ps_db" as user "ps_user" on host "localhost" (address "::1") at port "5432".
برای خروج از Postgres shell از دستور زیر استفاده کنید:
exit
مقیاسبندی PostgreSQL
مقیاسبندی PostgreSQL در Kubernetes شامل تنظیم تعداد PostgreSQL replica در StatefulSet است که pod های PostgreSQL را مدیریت میکند. برای این کار ابتدا وضعیت فعلی PostgreSQL خود را به کمک دستور زیر بررسی کنید:
kubectl get pods -l app=postgres
خروجی دستور فوق به صورت زیر است:
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
برای مقیاسبندی PostgreSQL به 5 رپلیکا نیاز دارید که برای آن می توانید از دستور kubectl scale
استفاده کنید:
kubectl scale deployment --replicas=5 postgres
عدد 5 را با تعداد رپلیکا های مورد نظر خود برای PostgreSQL جایگزین کنید. سپس دوباره وضعیت PostgreSQL خود را بررسی کنید تا مطمئن شوید که عملیات مقیاس بندی با موفقیت انجام شده است:
kubectl get pods -l app=postgres
خروجی زیر نشان میدهد که تعداد pod ها به 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
بکاپ گیری و بازیابی پایگاه داده PostgreSQL
بکاپ گیری پایگاه داده
میتوانید از یک پایگاه داده PostgreSQL که در یک pod در کلاستر Kubernetes اجرا میشود با استفاده از دستور kubectl exec
و ابزار pg_dump
به طور مستقیم درون pod بکاپ گیری کنید. ابتدا برای یافتن نام Pod در PostgreSQL خود، لیست تمام pod ها را به کمک دستور زیر مشاهده کنید:
kubectl get pods
سپس از دستور kubectl exec
برای اجرای فرمان pg_dump
درون pod های PostgreSQL استفاده کنید:
kubectl exec -it postgres-665b7554dc-cddgq -- pg_dump -U ps_user -d ps_db > db_backup.sql
این دستور پایگاه داده را تخلیه کرده و خروجی را به یک فایل به نام db_backup.sql
در دایرکتوری لوکال هدایت میکند.
بازیابی پایگاه داده
برای بازیابی پایگاه داده pod های Kubernetes، به فایل پشتیبان SQL و ابزار psql
نیاز دارید. ابتدا با استفاده از دستور kubectl cp
فایل پشتیبان SQL را از ماشین لوکالتان به pod های PostgreSQL کپی کنید:
kubectl cp db_backup.sql postgres-665b7554dc-cddgq:/tmp/db_backup.sql
سپس با استفاده از دستور زیر به pod های PostgreSQL متصل شوید:
kubectl exec -it postgres-665b7554dc-cddgq -- /bin/bash
درون pod، دستور psql
را برای بازیابی بکاپ از فایل تخلیه اجرا کنید:
psql -U ps_user -d ps_db -f /tmp/db_backup.sql
نتیجهگیری
اگر بخواهید یک پایگاه داده قابل مدیریت در فضای ابری داشته باشید، راه اندازی PostgreSQL در کلاستر Kubernetes بهترین گزینه است. مدیریت PostgreSQL روی Kubernetes به شما کمک می کند تا امکان مقیاس بندی سریع و آسان با چند خط دستور ساده، بکاپگیری و بازیابی مطمئن از طریق pg_dump و psql، دسترسی داخلی ایمن بین سرویسها بدون نیاز به دانستن IP و انعطاف بالا در مدیریت منابع ذخیرهسازی با استفاده از PV و PVC را داشته باشید. این معماری برای توسعهدهندگان و استارتآپهایی که دنبال ساخت یک زیرساخت پایدار هستند، کاربردی است.
سوالات متداول
برای اینکه بتوانیم، دیتابیس را بصورت خودکار در محیط کلاستر مدیریت کنیم.
به کمک pg_dump و دستورات kubectl exec میتوانید از پایگاه داده PostgreSQL بکاپ بگیرید.