آنچه در این مقاله میخوانید
- پیشنیازهای راه اندازی PostgreSQL در کوبرنتیز
- مزایای نصب و راه اندازی PostgreSQL در کوبرنتیز
- ایجاد ConfigMap برای دیتابیس PostgreSQL
- ایجاد یک PersistentVolume و PersistentVolumeClaim در کوبرنتیز
- دیپلوی PostgreSQL در کوبرنتیز
- ایجاد سرویس برای PostgreSQL در کوبرنتیز
- اتصال به PostgreSQL با kubectl در کوبرنتیز
- مقیاسبندی PostgreSQL در کوبرنتیز
- بکاپ گیری و بازیابی PostgreSQL در کوبرنتیز
- جمعبندی
- سوالات متداول
نصب و راهاندازی دیتابیس PostgreSQL روی کلاستر Kubernetes
۲۸ اردیبهشت ۱۴۰۴
راهاندازی دیتابیس PostgreSQL در یک محیط مقیاسپذیر و منعطف مانند Kubernetes، به شما اجازه میدهد تا دیتابیسهای خود را بهطور خودکار مدیریت کنید. زمانی که PostgreSQL را در یک کلاستر کوبرنتیز دیپلوی میکنید، نه تنها دیتابیس همیشه در دسترس باقی میماند، بلکه در برابر خرابیها نیز مقاوم شده و بهطور خودکار مقیاسپذیر میشود تا بتواند بارهای کاری مختلف را بهراحتی مدیریت کند.
این ویژگیها باعث میشود که دیگر نیازی به نگرانی در مورد مشکلات معمول در مدیریت دیتابیس نداشته باشید و بتوانید تمرکز خود را روی توسعه و بهینهسازی سیستمهایتان بگذارید.
در این آموزش از لیارا به شما نشان خواهیم داد که چگونه میتوانید یک دیتابیس PostgreSQL را روی کلاستر Kubernetes راهاندازی کنید.
آنچه در ادامه میخوانید:
- پیشنیازهای راه اندازی PostgreSQL در کوبرنتیز
- مزایای نصب و راه اندازی PostgreSQL در کوبرنتیز
- ایجاد ConfigMap برای دیتابیس PostgreSQL
- ایجاد یک PersistentVolume و PersistentVolumeClaim در کوبرنتیز
- دیپلوی PostgreSQL در کوبرنتیز
- ایجاد سرویس برای PostgreSQL در کوبرنتیز
- اتصال به PostgreSQL با kubectl در کوبرنتیز
- مقیاسبندی PostgreSQL در کوبرنتیز
- بکاپ گیری و بازیابی PostgreSQL در کوبرنتیز
- جمعبندی
- سوالات متداول

پیشنیازهای راه اندازی PostgreSQL در کوبرنتیز
قبل از شروع نصب، باید پیش نیازهای زیر را تهیه کنید:
- یک سرور مجازی اوبونتو که با دنبال کردن آموزش راهاندازی اولیه سرور برای Ubuntu، راهاندازی شده باشد و شامل یک کاربر غیر root با دسترسی sudo و یک فایروال فعال باشد؛ برای این کار، میتوانید از سرور مجازی اوبونتو، استفاده کنید.
- نصب ابزار خط فرمان kubectl در سرور مجازی. اگر نصب نکردهاید میتوانید از مستندات رسمی کوبرنتیز کمک بگیرید.
- یک کلاستر کوبرنتیز فعال.
همچنین برای درک کامل این آموزش، توصیه میشود در ابتدا، به مطالعه و بررسی مقالههای زیر بپردازید:
سرور مجازی یا VPS چیست؟
راهاندازی کلاستر K3s Kubernetes در اوبونتو
مزایای نصب و راه اندازی PostgreSQL در کوبرنتیز
قبل از شروع مراحل نصب، بهتر است در قالب یک جدول با مزایای راهاندازی دیتابیس PostgreSQL در کوبرنتیز آشنا شوید.
| ویژگیها | بدون کلاستر کوبرنتیز (روش سنتی) | با کلاستنر کوبرنتیز (ابری) | 
|---|---|---|
| مقیاسپذیری | دستی، همراه با downtime و تنظیمات پیچیده | خودکار، سریع و بدون توقف | 
| دسترسپذیری (High Availability) | نیاز به تنظیمات اضافی (مثل replication یا HAProxy) | بهصورت پیشفرض با ReplicaSet و Health Check | 
| مدیریت خطا و بازیابی | دستی، وابسته به ادمین سیستم | Self-healing با جایگزینی خودکار پادها | 
| بکاپگیری و بازیابی | نیازمند ابزارهای خارجی و اسکریپتنویسی | امکان استفاده از Volume Snapshot و CronJob | 
| آپدیت و دیپلوی نسخه جدید | زمانبر، با احتمال ایجاد اختلال | Rolling Update با حداقل downtime | 
| امنیت و ایزولاسیون | محدود به پیکربندی سطح سیستمعامل | با استفاده از Namespace، RBAC و Secret مدیریت میشود | 
| استفاده از منابع سختافزاری | استفاده غیربهینه، کنترل دستی | بهینهسازی مصرف منابع با Resource Limit/Request | 
| اتوماسیون و CI/CD | دشوار و مستلزم کار زیاد | ادغام آسان با GitOps و DevOps Pipeline ها | 
راهاندازی PostgreSQL به روش سنتی یعنی نصب مستقیم آن بر روی یک سرور فیزیکی یا مجازی! این مدل در پروژههای کوچک قابل استفاده است، اما هرچه سیستم رشد میکند و ترافیک آن زیاد میشود، مدیریت منابع، مقیاسپذیری و بکاپگیری بهمرور زمان به یک چالش جدی تبدیل میشود. بهخصوص زمانیکه یک سرور از دسترس خارج شود یا نیاز به بهروزرسانی پایگاه داده داشته باشد.
اما زمانیکه PostgreSQL بر روی Kubernetes اجرا میشود، شرایط کاملاً متفاوت خواهد بود. در اینجا با یک معماری جدید مواجه هستیم که ابزارهایی مانند StatefulSet برای مدیریت دیتابیسهای stateful، PersistentVolume برای حفظ دادهها حتی پس از ریاستارت شدن پادها، و ConfigMap برای تنظیمات، همه چیز را ساختارمند و قابلاعتماد میسازند.
از جمله مزایای مهم این مدل میتوان به self-healing اشاره کرد؛ به این معنا که اگر یک پاد دچار مشکل شود، بهصورت خودکار جایگزین میشود. همچنین قابلیت Rolling Update این امکان را میدهد که بدون قطع سرویس، نسخه جدید بهروزرسانی شود.
برای آشنایی با کوبرنتیز (Kubernetes) و چگونگی کارکرد آن، مقاله زیر را میتوانید مطالعه کنید.
کوبرنتیز(Kubernetes) چیست؟
ایجاد ConfigMap برای دیتابیس PostgreSQL
در Kubernetes، یک ConfigMap نوعی آبجکت API است که دادههای پیکربندی را به صورت جفت کلیدهای مقدار ذخیره میکند و این دادهها توسط پادها یا کانتینرهای موجود در کلاستر استفاده میشوند.
ConfigMap با جدا کردن جزئیات پیکربندی از کد برنامه، فرآیند مدیریت و بهروزرسانی تنظیمات را بدون نیاز به تغییر کد برنامه آسانتر میکند.
در این مرحله به شما آموزش میدهیم که چگونه میتوان یک فایل ConfigMap برای ذخیره جزئیات اتصال PostgreSQL، مانند نام میزبان، نام پایگاه داده، نام کاربری و سایر تنظیمات ایجاد کنید.
یک فایل YAML به نام postgresql-configmap.yaml  را با دستور زیر ایجاد کنید:
nano postgres-configmap.yamlبرای تنظیمات پیشفرض شامل نام دیتابیس، نام کاربری و رمز عبور، فایل YAML مربوط به ConfigMap، کد زیر را به آن اضافه کنید:
apiVersion: v1
kind: ConfigMap
metadata:
  name: postgres-secret
  labels:
    app: postgres
data:
  POSTGRES_DB: ps_db
  POSTGRES_USER: ps_user
  POSTGRES_PASSWORD: SecurePasswordپس از ذخیره و بستن فایل، تنظیمات مربوط به ConfigMap را با استفاده از دستور زیر در کلاستر Kubernetes اعمال کنید:
kubectl apply -f postgres-configmap.yamlبرای اینکه مطمئن شوید ConfigMap درست در کلاستر کوبرنتیز ساخته شده، کافی است دستور زیر را بزنید:
kubectl get configmapخروجی:
NAME               DATA   AGE
kube-root-ca.crt   1      116s
postgres-secret    3      12sخروجی بالا نشان میدهد چه ConfigMapهایی در namespace فعلی کلاستر وجود دارد.
نحوه بکاپ گیری کامل از PostgreSQL در اوبونتو 24.04 را در مقاله زیر بخوانید.
نحوه بکاپ گیری از PostgreSQL
ایجاد یک PersistentVolume و PersistentVolumeClaim در کوبرنتیز
در معماری کوبرنتیز، برای مدیریت فضای ذخیرهسازی پایدار (persistent storage)، از دو منبع کلیدی استفاده میشود:
PersistentVolume (PV) و PersistentVolumeClaim (PVC).
- PersistentVolume یک منبع ذخیرهسازی از پیش تعریفشده در کلاستر است که توسط ادمین یا سیستم فراهم میشود. این منبع میتواند روی یک دیسک محلی، NFS، یا حتی فضای ذخیرهسازی ابری قرار داشته باشد.
- در مقابل، PersistentVolumeClaim به پادها این امکان را میدهد که مقدار مشخصی از فضای ذخیرهسازی را درخواست کنند.
استفاده از این ساختار به شما کمک میکند تا دادههای مهم (مثل اطلاعات دیتابیس) حتی در صورت ریاستارت پادها یا جابهجایی آنها بین نودها، حفظ شوند و از بین نروند.
ابتدا، با دستور زیر یک فایل 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در ادامه، فایل را ذخیره کرده و برای اعمال تغییرات بالا در کوبرنتیز، کد زیر را اجرا کنید:
kubectl apply -f psql-pv.yamlبعد از آن، یک فایل 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در اینجا نیز فایل را ذخیره کنید و برای اعمال تغییرات بالا در کوبرنتیز، کد زیر را اجرا کنید:
kubectl apply -f psql-claim.yamlحالا، برای مشاهده لیست تمام PersistentVolumeها (PV) که در کلاستر کوبرنتیز شما ایجاد شدهاند، از دستور زیر استفاده کنید:
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- Name: نام PersistentVolume.
- Capacity: ظرفیت ذخیرهسازی اختصاص داده شده به PersistentVolume.
- Access Modes: وضعیتهای دسترسی که این PersistentVolume پشتیبانی میکند (مثل ReadWriteOnce، ReadOnlyMany، و غیره).
- Status: وضعیت فعلی PersistentVolume (مثل Available یا Bound).
- Reclaim Policy: سیاست بازگشت، که مشخص میکند که پس از آزاد شدن فضای ذخیرهسازی چه اتفاقی میافتد (مثل Retain یا Delete).
- Storage Class: کلاس ذخیرهسازی که برای PersistentVolume تعریف شده است.
پس از آن، برای مشاهده لیست تمام PersistentVolumeClaimها (PVC) که در کلاستر کوبرنتیز شما ایجاد شدهاند، دستور زیر را اجرا کنید:
kubectl get pvcهمانطور که در خروجی پائین میبینید، این دستور اطلاعات مربوط به PersistentVolumeClaimها را نمایش میدهد، از جمله نامها، وضعیتها، ظرفیت درخواستشده، حجمهای مرتبط و اگر آنها به یک PersistentVolume متصل باشند، اطلاعات مربوط به آن PersistentVolume را نیز نشان میدهد.
NAME                    STATUS   VOLUME            CAPACITY   ACCESS MODES   STORAGECLASS   AGE
postgres-volume-claim   Bound    postgres-volume   10Gi       RWX            manual         22sآموزش کامل نصب و استفاده از PostgreSQL در سرور مجازی اوبونتو 22.04 را در مقاله زیر بخوانید.
نصب PostgreSQL
دیپلوی PostgreSQL در کوبرنتیز
برای راهاندازی PostgreSQL در کوبرنتیز، باید یک فایل YAML بسازید که مشخص کند کوبرنتیز چگونه باید پادهای (pod) PostgreSQL را مدیریت کند. نگران نباشید این کار بسیار ساده است.
ابتدا یک فایل جدید به نام ps-deployment.yaml بسازید:
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فایل را ذخیره کنید، سپس با دستور زیر، تغییرات را روی کلاستر کوبرنتیز اعمال کنید:
kubectl apply -f ps-deployment.yamlدستور بالا، استقرار PostgreSQL را براساس مشخصات ارائهشده در فایل YAML ایجاد میکند.
همچنین، برای بررسی وضعیت دیپلوی ایجاد شده، دستور زیر را اجرا کنید:
kubectl get deploymentsخروجی زیر تأیید میکند که دیپلوی PostgreSQL با موفقیت انجام شده است:)
NAME       READY   UP-TO-DATE   AVAILABLE   AGE
postgres   3/3     3            3           17sبرای بررسی پادهای در حال اجرا، دستور زیر را تایپ کنید:
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 در کوبرنتیز
در کوبرنتیز، سرویس بهعنوان ابزاری برای تعریف یک مجموعه منطقی از پادها عمل میکند که این امکان را برای پادهای دیگر در کلاستر فراهم میآورد تا بدون نیاز به دانستن آدرسهای IP خاص، با این مجموعه پادها ارتباط برقرار کنند.
حالا بیایید یک فایل مانیفست سرویس (Service Manifest) بسازیم تا PostgreSQL را بهطور داخلی در کلاستر کوبرنتیز قابل دسترس کنیم:
nano ps-service.yamlاکنون، تنظیمات زیر را به فایل اضافه کنید:
apiVersion: v1
kind: Service
metadata:
  name: postgres
  labels:
    app: postgres
spec:
  type: NodePort
  ports:
    - port: 5432
  selector:
    app: postgresدر آخر فایل را ذخیره کنید و برای اعمال تغییرات روی کوبرنتیز، دستور زیر را اجرا کنید:
kubectl apply -f ps-service.yamlپس از ایجاد سرویس، سایر اپلیکیشنها یا سرویسها در کلاستر کوبرنتیز میتوانند از طریق نام PostgreSQL و پورت 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برای آشنایی با نحوه راهاندازی کلاستر K3s Kubernetes در اوبونتو 22.04، مقاله زیر را مطالعه کنید.
راهاندازی کلاستر K3s Kubernetes
اتصال به PostgreSQL با kubectl در کوبرنتیز
در شروع، پادهای موجود در namespace خود را بهصورت زیر لیست کنید تا پاد مربوط به PostgreSQL را پیدا کنید:
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 را در خروجی پیدا کنید.
پس از شناسایی پاد PostgreSQL، از دستور kubectl exec برای اتصال به پاد PostgreSQL استفاده کنید:
kubectl exec -it postgres-665b7554dc-cddgq -- psql -h localhost -U ps_user --password -p 5432 ps_dbپس از آنکه رمز عبور برای کاربران PostgreSQL را به صورت درست وارد کردید، وارد شل PostgreSQL خواهید شد.
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".در نهایت، برای خروج از شل PostgreSQL، دستور زیر را بزنید:
exitمقیاسبندی PostgreSQL در کوبرنتیز
مقیاسبندی یک دیپلوی PostgreSQL در کوبرنتیز شامل تنظیم تعداد نسخهها (replicas) در Deployment یا StatefulSet است که پادهای 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 به ۵ نسخه، دستور زیر را اجرا کنید:
kubectl scale deployment --replicas=5 postgresحالا وضعیت دیپلوی خود را دوباره چک کنید تا مطمئن شوید، عملیات مقیاسبندی با موفقیت انجام شده است:
kubectl get pods -l app=postgresدر خروجی، خواهید دید که تعداد پادها ۵ عدد بالا رفته است:
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 که داخل یکی از پادهای کوبرنتیز در حال اجراست، میتوانید از دستور kubectl exec همراه با ابزار pg_dump استفاده کنید تا بهطور مستقیم از داخل پاد، دیتابیس را بکاپ بگیرید.
در قدم اول، با دستور زیر لیست پادهای موجود در فضای نام فعلی را بررسی کنید تا بتوانید نام پاد مربوط به PostgreSQL را پیدا کنید:
kubectl get podsبعد از اینکه نام پاد PostgreSQL را شناسایی کردید، با استفاده از دستور زیر میتوانید از دیتابیس داخل پاد بکاپ بگیرید. این کار را با اجرای ابزار pg_dump و با استفاده از kubectl exec انجام دهید:
kubectl exec -it postgres-665b7554dc-cddgq -- pg_dump -U ps_user -d ps_db > db_backup.sqlدستور بالا، خروجی دیتابیس را در قالب یک فایل SQL به نام db_backup.sql در مسیر فعلی سیستمتان ذخیره میکند. حالا اگر قصد دارید این بکاپ را به پاد PostgreSQL برگردانید، لازم است فایل SQL را داشته باشید و از ابزار psql برای اجرای بکاپگیری استفاده کنید.
kubectl cp db_backup.sql postgres-665b7554dc-cddgq:/tmp/db_backup.sqlحالا برای اتصال به پاد PostgreSQL و ورود به محیط شل آن، دستور زیر را اجرا کنید:
kubectl exec -it postgres-665b7554dc-cddgq -- /bin/bashپس از آن، برای ریاستور کردن بکاپ از فایل dump، بعد از اینکه وارد محیط Bash داخل پاد شدید، دستور زیر را اجرا کنید:
psql -U ps_user -d ps_db -f /tmp/db_backup.sqlبا پایگاه داده PostgreSQL لیارا، در کمترین زمان، یک دیتابیس قدرتمند، پرسرعت و امن راهاندازی کنید.
✅ پشتیبانگیری خودکار ✅ امنیت بالا ✅ عملکرد بهینه
خرید هاست ابری PostgreSQL لیارا
جمعبندی
اگر بخواهید یک پایگاه داده قابل مدیریت در فضای ابری داشته باشید، ترکیب PostgreSQL و Kubernetes انتخاب مناسبی است. مدیریت PostgreSQL روی Kubernetes این مزیتها را به همراه دارد:
- مقیاسپذیری سریع و آسان با چند خط دستور ساده.
- بکاپگیری و ریستور مطمئن از طریق pg_dumpوpsql.
- دسترسی داخلی ایمن بین سرویسها بدون نیاز به دانستن IP.
- انعطاف بالا در مدیریت منابع ذخیرهسازی با استفاده از PV و PVC.
این معماری نهتنها برای محیطهای production مناسب است، بلکه برای تیمهای DevOps، توسعهدهندهها و حتی استارتآپهایی که دنبال ساخت یک زیرساخت پایدار هستند، کاربردی است.
سوالات متداول
چرا باید PostgreSQL را در کوبرنتیز پیادهسازی کنم؟
برای اینکه بتوانیم، دیتابیس را بصورت خودکار در محیط کلاستر مدیریت کنیم.
چطور میتوانم از PostgreSQL در کوبرنتیز بکاپگیری کنم؟
با استفاده از ابزار pg_dump و دستورات kubectl exec میتوانید از پایگاه داده PostgreSQL پشتیبان بگیرید.
آیا میتوان در کوبرنتیز PostgreSQL را در حالت High Availability پیادهسازی کرد؟
بله، در کوبرنتیز میتوان PostgreSQL را در حالت High Availability (HA) پیادهسازی کرد.
چطور میتوانم اتصال ایمن به PostgreSQL در کوبرنتیز برقرار کنم؟
چندین روش برای اینکار وجود دارد از جمله: فعالسازی SSL در PostgreSQL، استفاده از Kubernetes Secrets، استفاده از Network Policies.