تکنولوژی

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

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

این راهنما فرآیند گام‌به‌گام راه اندازی PostgreSQL در یک کلاستر Kubernetes را بررسی می‌کند. بنابراین چه شما یک توسعه‌دهنده، مهندس DevOps یا مدیر سیستم باشید که به دنبال نصب و راه اندازی 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 فراهم است که ارتقاء نسخه‌ها را بدون ایجاد اختلال محسوس در سرویس‌دهی ممکن می‌سازد.

در 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) منابع Kubernetes هستند که ذخیره‌سازی پایدار را در یک کلاستر فراهم می‌کنند. PersistentVolumeیک منبع ذخیره‌سازی از پیش تعریف‌شده در کلاستر است و 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

توضیح بخش های مختلف دستور فوق:

  • storageClassName: manual یک PersistentVolume مشخص می‌کند. StorageClass با نام “manual” نشان می‌دهد که تخصیص فضای ذخیره‌سازی به صورت دستی انجام می‌شود.
  • capacity: ظرفیت مورد نظر PersistentVolume را مشخص می‌کند.
  • accessModes: روش‌های دسترسی به PersistentVolume را تعریف می‌کند. در اینجا، مقدار ReadWriteMany تنظیم شده است که به چندین pod اجازه می‌دهد به طور همزمان به volume دسترسی داشته باشند.
  • hostPath: نوع volume است که مستقیماً روی فایل‌سیستم میزبان ایجاد می‌شود.

پس از اضافه کردن تنظیمات فوق، فایل را ذخیره کنید و برای اعمال تغییرات در Kubernetes کد زیر را اجرا کنید:

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

توضیح بخش های مختلف دستور فوق:

  • 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 باید یک فایل 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

در 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

پادهای موجود در 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 در 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 که در یک 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 را داشته باشید. این معماری برای توسعه‌دهندگان و استارت‌آپ‌هایی که دنبال ساخت یک زیرساخت پایدار هستند، کاربردی است.

1. چرا باید PostgreSQL را روی Kubernetes راه اندازی کنیم؟

برای اینکه بتوانیم، دیتابیس را بصورت خودکار در محیط کلاستر مدیریت کنیم.

چطور از PostgreSQL در Kubernetes بکاپ‌ بگیریم؟

به کمک pg_dump و دستورات kubectl exec می‌توانید از پایگاه داده PostgreSQL بکاپ بگیرید.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا