آموزش نصب گام به گام نمونه پک PostgreSQL HA
این فایل YAML یک طرح کامل و جامع برای راهاندازی یک PostgreSQL کاملاً مدیریتشده و با دسترسی بالا (HA) در کلاستر کوبرنتیز است. با استفاده از تنها این فایل، کوبچی postgresql-ha
را دریافت میکند، سه پاد نگهدارنده همگامشده با ذخیرهسازی سریع مبتنی بر NVMe را مستقر (deploy) میکند و پشتیبانگیری روزانه به S3 را تنظیم میکند که تنها دو نسخه آخر را نگه میدارد. این فایل یک پایگاه داده test
با اعتبارنامههای خاص خود را از پیش ایجاد میکند، دسترسی سوپریوزر (superuser) و رپلیکا را با یک رمز عبور روت (root) مشترک قفل میکند و PostgreSQL را برای عملکرد مناسب از طریق بهینهسازی WAL، بافرها و ردیابی کوئری (query) تنظیم میکند. در یک spec
تعریف شده شما به کوبرنتیز نه تنها دستور اجرای Postgres را دادهاید، بلکه آن را بهصورت مقاوم، امن و آماده برای production از همان آغاز به کار اولین پاد تنظیم میکنید.
تعریف منابع (Resource Identification)
apiVersion: k8s.kubit.ir/v1alpha1
- apiVersion: نسخه و گروه API را برای منبع سفارشی مشخص میکند.
k8s.kubit.ir/v1alpha1
به این معناست که این یک تعریف منبع سفارشی (CRD) ارائهشده توسط Kubit است.v1alpha1
نشاندهنده نسخه اولیه (آلفا) است که ممکن است تغییرات اساسی داشته باشد.
kind: Pack
- kind: نوع شیء کوبرنتیز.
Pack
یک نوع سفارشی است که توسط پلتفرم Kubit برای تعریف استقرار چارت Helm بستهبندیشده استفاده میشود.
متادیتا (Metadata)
metadata:
name: test
namespace: new-test-ns
- metadata.name: نام این منبع Pack — در اینجا
test
است. - توجه کنید که اگر نام شامل
postgresql-ha
در انتهای آن نباشد، بهطور خودکار به نام اضافه میشود، بنابراین نام نهاییtest-postgres-ha
خواهد بود. این مورد زمانی لازم است که بخواهید از سرور پایگاه داده در برنامه خود استفاده کنید. - metadata.namespace: فضای نام کوبرنتیز که منابع در آن ایجاد میشوند —
new-test-ns
.
مشخصات (Specification)
spec:
- spec: بخش پیکربندی برای این Pack.
تعریف چارت (Chart Definition)
chart:
name: postgresql-ha
repository:
kind: ClusterPackRepository
name: kubit-packs
version: ~=0.6.14
- chart.name: چارت Helm که باید مستقر شود،
postgresql-ha
— یک خوشه PostgreSQL با دسترسی بالا. - chart.repository.kind:
ClusterPackRepository
به این معناست که چارت از یک مخزن Kubit در سطح خوشه کشیده میشود. - chart.repository.name:
kubit-packs
— نام مخزن. - chart.version:
~=0.6.14
— یک محدودیت نسخه به این معنا که “سازگار با 0.6.x اما حداقل 0.6.14”.
متغیرها (Variables)
vars:
DATABASE_ROOT_PASSWORD: thisispass
- vars: متغیرهای تعریفشده توسط کاربر که میتوانند در پیکربندی استفاده شوند.
- در اینجا،
DATABASE_ROOT_PASSWORD
بهthisispass
تنظیم شده است که بعداً در سایر فیلدها تزریق میشود.
مقادیر چارت (Chart Values)
values:
- اینها مستقیماً به
values.yaml
استفادهشده توسط چارت Helm نگاشت میشوند و PostgreSQL-HA را پیکربندی میکنند.
پیکربندی پشتیبانگیری (Backup Configuration)
backup:
enabled: true
maxBackups: 2
provider: s3
s3:
accessKey: KAJMO44L018YG9OMR594
bucket: democo-postgresql-backup
endpoint: https://s3.kubit.ir
region: us-east
secretKey: CeQPAbDcihilB4rTogpl97wnkpZlpo3BxKyAwXYU
schedule: 0 0 * * *
- backup.enabled: پشتیبانگیری را فعال میکند.
- maxBackups: فقط
2
پشتیبان آخر را نگه میدارد. - provider:
s3
به این معناست که پشتیبانها به ذخیرهسازی شیء سازگار با S3 ارسال میشوند. - s3.accessKey / secretKey: اعتبارنامههای دسترسی برای ذخیرهسازی S3.
- bucket:
democo-postgresql-backup
نام باکت است. - endpoint: آدرس URL سرویس S3 (
kubit.ir
). - region:
us-east
— منطقه باکت S3. - schedule:
0 0 * * *
— پشتیبانگیری روزانه در نیمهشب (فرمت cron). این کار یک cronjob ایجاد میکند.
همچنین میتوانید یک نمونه پایگاه داده اختصاصی برای کار پشتیبانگیری به این پیکربندی اضافه کنید تا بار روی نمونههای اصلی کاهش یابد:
# -- تعیین میکند که از کدام نگهدارنده (keeper) برای پشتیبانگیری استفاده شود. گزینههای معتبر عبارتند از: `only-standby`، `prefer-standby`، `exclusive-standby`. # با انتخاب `exclusive-standby` یک نگهدارنده اختصاصی برای پشتیبانگیری ایجاد میشود.
strategy: 'only-standby'
گزینههای معتبر عبارتند از:
only-standby
: فقط از نگهدارنده آمادهبهکار (standby) پشتیبانگیری میکند. اگر هیچکدام وجود نداشته باشد، پشتیبانگیری 실패 میکند.prefer-standby
: ترجیحاً از آمادهبهکار استفاده میکند، اما در صورت نیاز به اصلی بازمیگردد.exclusive-standby
: یک نگهدارنده آمادهبهکار اختصاصی فقط برای پشتیبانگیری ایجاد میکند.
مقداردهی اولیه پایگاههای داده (Databases Initialization)
databases:
- database: test
password: thisispass
username: test-user
- یک پایگاه داده PostgreSQL به نام
test
از پیش ایجاد میکند با:- username:
test-user
- password:
thisispass
- username:
میتوانید از والت برای رمزنگاری رمزها و دادههای حساس خود استفاده کنید.
پیکربندی تصویر (Image Configuration)
image:
tag: '16'
- از تصویر PostgreSQL نسخه 16 استفاده میکند.
میتوانید اطلاعات مربوط به نسخههای معتبر را در سایت پیدا کنید.
نودهای نگهدارنده (Keeper Nodes)
keeper:
replicaCount: 3
resources:
requests:
cpu: 100m
memory: 200Mi
- replicaCount:
3
نود نگهدارنده (نمونههای PostgreSQL در حالت دسترسی بالا) اجرا میکند. - resources.requests: برای هر پاد نگهدارنده
100m
CPU و200Mi
حافظه رزرو میکند.
همچنین میتوانید محدودیتها را به این صورت اضافه کنید:
keeper:
replicaCount: 3
resources:
requests:
cpu: 100m
memory: 200Mi
limits:
cpu: 5000
memory: 100Gi
پیکربندی ذخیرهسازی (Storage Configuration)
persistence:
size: 5Gi
storageClassName: vcd-nvme
- ذخیرهسازی پایدار:
- size: 5 گیگابایت
- storageClassName:
vcd-nvme
— از کلاس دیسک سریع مبتنی بر NVMe استفاده میکند.
پارامترهای PostgreSQL
این بخش بر اساس فایل پیکربندی postgres است.
pgParameters:
min_wal_size: 1GB
pg_stat_statements.track: all
shared_buffers: 100MB
shared_preload_libraries: pg_stat_statements
wal_buffers: 16MB
- min_wal_size: حداقل اندازه لاگهای پیشنویس (Write-Ahead Logs) (1 گیگابایت).
- pg_stat_statements.track: ردیابی تمام دستورات SQL برای تحلیل عملکرد.
- shared_buffers: مقدار حافظه برای کش PostgreSQL (100 مگابایت).
- shared_preload_libraries: بارگذاری کتابخانه
pg_stat_statements
در زمان راهاندازی. - wal_buffers: اندازه بافر برای نوشتن WAL (16 مگابایت).
رپلیکا و سوپریوزر (Replication & Superuser)
replicationPassword: '{{ vars.DATABASE_ROOT_PASSWORD }}'
replicationUsername: postgres
superuserPassword: '{{ vars.DATABASE_ROOT_PASSWORD }}'
superuserUsername: postgres
- replicationPassword / superuserPassword: از متغیر
DATABASE_ROOT_PASSWORD
تنظیم شده است —thisispass
. - replicationUsername:
postgres
— کاربر رپلیکا بین نودها. - superuserUsername:
postgres
— سوپریوزر اصلی PostgreSQL.
مثال کامل و قابل نصب
apiVersion: k8s.kubit.ir/v1alpha1
kind: Pack
metadata:
name: test
namespace: new-test-ns
spec:
chart:
name: postgresql-ha
repository:
kind: ClusterPackRepository
name: kubit-packs
version: ~=0.6.17
vars:
DATABASE_ROOT_PASSWORD: thisispass
values:
backup:
enabled: true
maxBackups: 2
provider: s3
s3:
accessKey: KAJMO44L018YG9OMR594
bucket: democo-postgresql-backup
endpoint: https://s3.kubit.ir
region: us-east
secretKey: CeQPAbDcihilB4rTogpl97wnkpZlpo3BxKyAwXYU
schedule: 0 0 * * *
databases:
- database: test
password: thisispass
username: test-user
image:
tag: '16'
keeper:
replicaCount: 3
resources:
requests:
cpu: 100m
memory: 200Mi
persistence:
size: 5Gi
storageClassName: vcd-nvme
pgParameters:
min_wal_size: 1GB
pg_stat_statements.track: all
shared_buffers: 100MB
shared_preload_libraries: pg_stat_statements
wal_buffers: 16MB
replicationPassword: '{{ vars.DATABASE_ROOT_PASSWORD }}'
replicationUsername: postgres
superuserPassword: '{{ vars.DATABASE_ROOT_PASSWORD }}'
superuserUsername: postgres
دیاگرام مثال
در اینجا یک دیاگرام معماری مبتنی بر متن از آنچه این YAML در کلاستر کوبرنتیز راهاندازی میکند، ارائه شده است:
┌─────────────────────────────────────────────────────────────┐
│ Kubernetes Namespace: new-test-ns │
│-------------------------------------------------------------│
│ Custom Resource: Pack (postgresql-ha) │
│ │
│ ┌──────────────────────────-┐ ┌──────────────────────┐ │
│ │ Keeper Pod #1 │ │ Keeper Pod #2 │ │
│ │---------------------------│ │----------------------│ │
│ │ PostgreSQL 16 │ │ PostgreSQL 16 │ │
│ │ Role: Primary or Replica │ │ Replica │ │
│ │ Data Volume: 5Gi NVMe PVC | │ 5Gi NVMe PVC │ │
│ │ CPU: 100m, Mem: 200Mi │ │ CPU: 100m, Mem:200Mi │ │
│ └───────────────────────────┘ └──────────────────────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌──────────────────────────────────────────┐ │
│ │ Keeper Pod #3 │ │
│ │ PostgreSQL 16 (Replica) │ │
│ │ Data Volume: 5Gi NVMe PVC │ │
│ └──────────────────────────────────────────┘ │
│ │
│ Replication: │
│ - Replication user: postgres │
│ - Password: thisispass │
│ │
│ Databases: │
│ - Name: test │
│ - User: test-user/ Pass: thisispass │
│ │
│ PostgreSQL Parameters: │
│ - WAL min size: 1GB │
│ - Shared Buffers: 100MB │
│ - WAL Buffers: 16MB │
│ - pg_stat_statements loaded │
│ │
│ Backups: │
│ - Enabled: true │
│ - Max stored: 2 │
│ - Schedule: Daily @ 00:00 │
│ - Provider: S3 (https://s3.kubit.ir) │
│ - Bucket: democo-postgresql-backup │
│ - Access/Secret Keys provided │
│ │
│ Chart Source: kubit-packs repo (version ~0.6.14) │
└─────────────────────────────────────────────────────────────┘
موارد نمایش شده:
- 3 پاد نگهدارنده (موجودیتهای PostgreSQL) برای دسترسی بالا (HA)
- ذخیرهسازی پایدار مبتنی بر NVMe برای هر نگهدارنده (keeper)
- ساخت رپلیکا بین گرهها با استفاده از کاربر
postgres
- پشتیبانگیری روزانه به S3 با سیاست نگهداری
- پایگاه داده اولیه
test
با اعتبارنامههای خاص خود - پارامترهای تنظیم PostgreSQL که در زمان راهاندازی اعمال میشوند