تغییرات اخیر

در اینجا اطلاعیه‌ها، نسخه‌ها و تغییرات جدید لیارا فهرست می‌شوند.

نصب و راه‌اندازی دیتابیس PostgreSQL روی کلاستر Kubernetes


۲۸ اردیبهشت ۱۴۰۴

راه‌اندازی دیتابیس PostgreSQL در یک محیط مقیاس‌پذیر و منعطف مانند Kubernetes، به شما اجازه می‌دهد تا دیتابیس‌های خود را به‌طور خودکار مدیریت کنید. زمانی که PostgreSQL را در یک کلاستر کوبرنتیز دیپلوی می‌کنید، نه تنها دیتابیس همیشه در دسترس باقی می‌ماند، بلکه در برابر خرابی‌ها مقاوم است و به‌طور خودکار مقیاس‌پذیر می‌شود تا بارهای کاری مختلف را به‌راحتی مدیریت کند.

این ویژگی‌ها باعث می‌شود که نیازی به نگرانی در مورد مشکلات معمول در مدیریت دیتابیس نداشته باشید و بتوانید تمرکز خود را روی توسعه و بهینه‌سازی سیستم‌هایتان بگذارید.

در این آموزش از لیارا به شما نشان خواهیم داد که چگونه می‌توانید یک دیتابیس PostgreSQL را روی کلاستر Kubernetes راه‌اندازی کنید.

آنچه در ادامه می‌خوانید:

  • پیش‌نیازهای راه‌ اندازی PostgreSQL در کوبرنتیز
  • مزایای نصب و راه اندازی PostgreSQL در کوبرنتیز
  • ایجاد ConfigMap برای دیتابیس PostgreSQL
  • ایجاد یک PersistentVolume و PersistentVolumeClaim در کوبرنتیز
  • دیپلوی PostgreSQL در کوبرنتیز
  • ایجاد سرویس برای PostgreSQL در کوبرنتیز
  • اتصال به PostgreSQL با kubectl در کوبرنتیز
  • مقیاس‌بندی PostgreSQL در کوبرنتیز
  • بکاپ‌ گیری و بازیابی PostgreSQL در کوبرنتیز
  • جمع‌بندی
  • سوالات متداول
نصب و راه‌اندازی دیتابیس PostgreSQL روی کلاستر Kubernetes

پیش‌نیازهای راه‌ اندازی PostgreSQL در کوبرنتیز

قبل از شروع نصب باید پیش نیازهای زیر را تهیه کنید:

همچنین برای درک کامل این آموزش، توصیه می‌شود در ابتدا، به مطالعه و بررسی مقاله‌های زیر، بپردازید:
سرور مجازی یا 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
نحوه استفاده از Fast API با دیتابیس رابطه ای در سرور مجازی اوبونتو Ubuntu را در مقاله زیر بخوانید.
نحوه استفاده از Fast API

مقیاس‌بندی 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.

به اشتراک بگذارید