آموزش نصب گام به گام نمونه پک 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: برای هر پاد نگهدارنده
100mCPU و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 که در زمان راهاندازی اعمال میشوند