هلم چارت Genpack

این چارت هلم (Helm Chart) که توسط کوبیت (Kubit) طراحی شده، به‌عنوان یک چارت عمومی و قابل‌سفارشی‌سازی برای استقرار آسان اپلیکیشن‌های کانتینری مورد استفاده قرار می‌گیرد.

با استفاده از اطلاعات پیکربندی وارد شده، پک اپراتور (Pack Operator) کوبیچی به‌صورت خودکار تمامی منابع موردنیاز کوبرنیتیز را (مانند Deployment، Service، ConfigMap و ...) ایجاد کرده و آن‌ها را به‌طور مداوم با وضعیت مطلوب (spec) همگام (sync) نگه می‌دارد.

پیش‌نیازها (Prerequisites)

برای استفاده از این چارت، موارد زیر باید در محیط شما فراهم باشد:

  • کوبرنیتیز نسخه 1.20 به بالا
  • ابزار Helm نسخه 3 به بالا
  • پشتیبانی از PV Provisioner در زیرساخت (در صورت استفاده از Volumes)

آموزش سریع نصب چارت

افزودن مخزن هلم (Helm Repository)

ابتدا مخزن هلم مربوط به کوبیت را اضافه کنید:

helm repo add kubit-packs https://repo.sabz.dev/artifactory/kubit-packs

نصب چارت با نام دلخواه

برای نصب چارت با نام نسخه (Release) دلخواه مثلاً my-release در فضای‌نام (namespace) my-namespace:

helm install -n my-namespace my-release kubit-packs/genpack -f my-values.yaml

این دستور چارت genpack را روی کلاستر با پارامترهای داده‌شده نصب می‌کند و مقادیر موردنظر شما را از فایل my-values.yaml برای استفاده در فایل کانفیگ می‌خواند.
مقادیر قابل پیکربندی در بخش پارامترها آورده شده‌اند.

نکته: برای مشاهده لیست تمام نسخه‌های منتشرشده از دستور helm list استفاده کنید.


حذف چارت (Uninstall)

برای حذف نسخه نصب‌شده (my-release) و تمام منابع وابسته:

helm delete -n my-namespace my-release

این دستور تمام بخش‌ها و منابع ایجادشده توسط این چارت را حذف کرده و نسخه را پاک می‌کند.


پارامترها (Parameters)

جدول زیر بخش‌های اصلی قابل پیکربندی در چارت genpack را نمایش می‌دهد:

بخش (Section)توضیح
globalتنظیمات سراسری شامل مقادیر مشترک، توکن‌ها، آدرس رجیستری، و متغیرهای عمومی
gonbadتعریف ورک‌لودها (Workloads) و منابع مربوط به اجرای اپلیکیشن در کلاستر

پارامترهای سراسری (Global)

بخش: global.*

این بخش شامل متغیرها و تنظیمات مشترک بین تمام منابع چارت است، مانند:

  • آدرس رجیستری تصاویر (Image Registry)
  • کلید و مقادیر خصوصی (سکرت) مشترک (Shared Secrets)
  • متغیرهای پیکربندی (ConfigMap)
  • گواهی‌ها و مجوزهای ورود
  • اطلاعات ورود به پایگاه داده یا سرویس‌های وابسته

نمونه پیکربندی:

global:
  commonImageRegistry: docker.sabz.dev
  commonImagePullSecrets:
    - name: docker-sabz-dev-registry
  sharedConfigs:
    POSTGRES_HOST: postgresql
    POSTGRES_PORT: 5432
    psk_conf: |
      TLSConnect=psk
      TLSAccept=psk
  sharedSecrets:
    POSTGRES_USER: user
    POSTGRES_PASSWORD: encrypted-password
#...

پارامترهای قابل پیکربندی در چارت genpack

پارامترنوع داده (Type)توضیحمقدار پیش‌فرض (Default)
issuerشیء (object)تنظیمات صادرکننده گواهی (Certificate Issuer)
issuer.nameرشته (string)(الزامی) نام صادرکننده؛ باید از الگوی ^[a-z][a-z0-9]*(-[a-z0-9]+)*$ پیروی کند
issuer.kindرشته (string)نوع صادرکننده: یکی از Issuer یا ClusterIssuerIssuer
certificateشیء (object)تنظیمات مربوط به گواهی SSL/TLS
certificate.hostsلیست (list)(الزامی) لیستی از دامنه‌هایی که گواهی برای آن‌ها صادر می‌شود (حداقل یک دامنه لازم است)
certificate.createبولی (boolean)آیا گواهی ایجاد شود یا نهfalse
certificate.secretNameرشته (string)نام سکرتی (Secret) که گواهی در آن ذخیره می‌شود
commonImageRegistryرشته (string)رجیستری پیش‌فرض برای تصاویر داکر (Docker Registry)
commonImagePullSecretsلیست از imagePullSecretلیستی از pull secrets برای کشیدن تصاویر، در تمام ورک‌لودها استفاده می‌شود
sharedConfigsلیست (map: key-value)تعریف متغیرهای مشترک پیکربندی به‌صورت key: value تعریف‌شده و برای ساخت ConfigMap استفاده‌می‌شوند
sharedSecretsلیست (map: key-value)تعریف مقادیر حساس مشترک به‌صورت key: value که برای ایجاد Secret استفاده می‌شوند
sharedConfigmapNameرشته (string)نام ConfigMap مشترک ایجادشده از global.sharedConfigs[.Release.name]-shared
sharedSecretNameرشته (string)نام Secret مشترک ایجادشده از global.sharedSecrets[.Release.name]-shared
ingress.tlsلیست (list)TLS اضافی برای تمام Ingressها، جزئیات بیشتر در بخش ingresses
ingress.annotationsنگاشت (mapping)annotationهای اضافی برای همه‌ی Ingressها
metrics.serviceMonitor.namespaceرشته (string)فضای‌نام اختصاصی برای ServiceMonitor در metrics (متریک‌ها)

تعریف عمومی ورک‌لودها (Gonbad)

بخش: gonbad.*

بخش gonbad مهم‌ترین بخش و آبجکت اصلی در فایل پیکربندی values.yaml است. بر اساس مقادیر موجود در این فایل ورک‌لودها و مانیفست‌ها ایجاد می‌شوند. مهم‌ترین زیرمجموعه‌ی آن، بخش workloads است که برای ساده‌سازی ساخت و پیکربندی منابع مختلف کوبرنیتیز منابع مختلف کوبرنیتیز (مانند Deployment، Service، Ingress و ...) به کار می‌رود.

ساختار بخش‌ها

بخش (Section)توضیح
workloadsتعریف ورک‌لودها، که به‌صورت خودکار به منابعی مانند Deployment، StatefulSet، و ... تبدیل می‌شود
staticFilesبرای مانت (mount) و قراردادن فایل‌های پیکربندی کوچک درون کانتینرها
volumesتعریف Volumeها برای ورک‌لودها
ingressesساخت سریع منابع Ingress برای دسترسی به سرویس‌ها از خارج کلاستر
externalServicesساخت سرویس‌هایی برای اتصال به سرویس‌های خارجی از داخل کلاستر، با استفاده از DNS داخلی
prometheusRuleساخت قوانین مانیتورینگ Prometheus به‌صورت خودکار
rawResourcesافزودن منابع خام کوبرنیتیز به‌صورت مستقیم در کنار منابع تولید شده توسط این چارت

نمونه پیکربندی

gonbad:
  workloads:
    server:
      kind: deployment
      replicaCount: 1
      service:
        type: NodePort
      containers:
        server:
          image:
            repository: zabbix/zabbix-server-pgsql
            tag: ubuntu-5.2.0
          ports:
            10051:
              name: server
              nodePort: 30051
            10052:
              enabled: false
              name: jmx

    web:
      kind: deployment
      replicaCount: 3
      containers:
        web:
          image:
            repository: zabbix/zabbix-web-nginx-pgsql
            tag: ubuntu-5.2.0
          ports:
            8080:
              name: http
            3040:
              name: metrics
              scrapePath: /metrics

      hostAliases:
        - ip: 1.2.3.4
          hostnames:
            - app1.local
            - app2.local

  ingresses:
    web:
      workloadName: web
      servicePort: http
      hosts:
        - host: zabbix.example.com

در مثال بالا:

  • دو ورک‌لود تعریف شده: یکی به نام server و دیگری web، هر کدام با image و پورت‌های خاص خود.
  • برای ورک‌لود web یک Ingress نیز تعریف شده است که از طریق دامنه zabbix.example.com قابل دسترسی خواهد بود.
  • پورت‌ها می‌توانند دارای ویژگی‌هایی مانند scrapePath (برای متریک‌ها) و nodePort باشند.
  • می‌توان از hostAliases برای نگاشت نام‌های دامنه محلی استفاده کرد.

ورک‌لودهای Gonbad

بخش: gonbad.workloads.*

در سیستم Gonbad، پنج نوع ورک‌لود (Workload) تعریف‌پذیر هستند. ساده‌ترین نوع، ورک‌لود از نوع simple است که فقط با مشخص‌کردن یک image، یک دیپلویمنت (Deployment) ساده تک‌کانتینری ایجاد می‌کند.

در مقابل، ورک‌لود از نوع deployment نیاز به حداقل یک بخش container دارد و می‌تواند شامل چندین کانتینر نیز باشد. این نوع از ورک‌لود امکان کنترل دقیق و تنظیمات پیشرفته را بر روی جزئیات اجرای ورک‌لود مشخص‌شده فراهم می‌کند.

انواع دیگر ورک‌لودها شامل:

  • statefulset: مناسب برای اپلیکیشن‌هایی با وضعیت پایدار و وابسته به ذخیره‌سازی
  • daemonset: برای اجرای یک پاد روی تمام نودهای کلاستر
  • cronjob: برای اجرای زمان‌بندی‌شده‌ی وظایف خاص

برای آشنایی با هر نوع، می‌توانید به بخش‌های زیر مراجعه کنید:

برای تعریف یک ورک‌لود از نوع خاص، کافی‌ست مقدار gonbad.workload.<name>.kind را روی مقدار مورد نظر مانند simple قرار دهید.

هر ورک‌لود آبجکتی با یک نام (name) منحصربه‌فرد است. این نام به‌عنوان کلید (key) آن آبجکت در فایل values.yaml استفاده می‌شود.

ورک‌لود Simple

یک وروک‌لود simple با نام foo بدین شکل تعریف می‌شود:

gonbad:
  workloads:
    foo:
      kind: simple
      #...

پارامترهای قابل تنظیم برای ورک‌لود نوع simple:

پارامترنوعتوضیحمقدار پیش‌فرض
kindstring(الزامی) نوع ورک‌لود، باید مقدار simple داشته باشد--
enabledbooleanفعال یا غیرفعال بودن این ورک‌لودtrue
replicaCountpositive numberتعداد نمونه‌های (replica) این ورک‌لود. می‌تواند صفر یا بیشتر باشد1
imagecontainer.image(الزامی) ایمیج مورد استفاده برای تنها کانتینر این ورک‌لود--
strategydeployment.strategyاستراتژی به‌روزرسانی و دیپلوی مجدد این ورک‌لود--
usedSharedConfigslist of stringsاگرچه تمام sharedConfigs برای همه در دسترس‌اند، فقط زمانی در این بخش ریلود شوند که یکی از این کانفیگ‌ها تغییر کرده باشدتمام sharedConfigs
usedSharedSecretslist of stringsمشابه بالا، ولی برای sharedSecretsتمام sharedSecrets
commandlist of stringsدستور اولیه‌ی اجرا برای کانتینر، مانند ["de.sh", "-v", "-c"]--
argslist of stringsآرگومان‌هایی که به دستور command داده می‌شود--
envobjectتعریف متغیرهای محیطی (Environment Variables) برای کانتینر. به container.env مراجعه شود--
livenessProbecontainer.probeتعریف بررسی سلامت (Liveness Probe)--
readinessProbecontainer.probeتعریف بررسی آمادگی (Readiness Probe)--
resourcescontainer.resourcesتعریف محدودیت و درخواست منابع برای کانتینر--
portsmapping of container.portsتعریف پورت‌های بازشده برای این ورک‌لود--

ورک‌لود Deployment

یک وروک‌لود deployment با نام bar بدین شکل تعریف می‌شود:

gonbad:
  workloads:
    bar:
      kind: deployment
      #...

یک ورک‌لود deployment می‌تواند داری چند کانتینر (container) باشد.

پارامترهای قابل تنظیم برای ورک‌لود نوع deployment:

پارامترنوع دادهتوضیحمقدار پیش‌فرض
kindstring(الزامی) مقدار باید deployment باشدdeployment
enabledbooleanفعال یا غیرفعال بودن این ورک‌لودtrue
replicaCountpositive integerتعداد پادهای این ورک‌لود (حداقل ۰)1
containersmapping of container(الزامی) تعریف کانتینرهای این دیپلویمنت
initContainersmapping of containerکانتینرهایی که پیش از کانتینرهای اصلی اجرا می‌شوند و باید با موفقیت اجرا شوند؛ در صورت عدم موفقیت اجرا، پاد از کار می‌افتد (fail می‌شود)
strategydeployment.strategyاستراتژی استقرار (deploy) این دیپلویمنت
usedSharedConfigslist of stringsاگرچه تمام sharedConfigs برای همه در دسترس‌اند، فقط زمانی در این بخش ریلود شوند که یکی از این کانفیگ‌ها تغییر کرده باشدهمه sharedConfigs
usedSharedSecretslist of stringsمشابه مورد بالا، ولی برای sharedSecretsهمه sharedSecrets
serviceAccount.namestringنام ServiceAccount مورد استفاده در این دیپلویمنت
service.typestringنوع سرویس: ClusterIP یا NodePortClusterIP
service.labelsmappingلیبل‌های اضافی برای سرویس k8s.label regex مرتبط با این ورک‌لود
service.annotationsmappingannotationهای اضافی برای سرویس k8s.label regex
securityContextpod.securityContextتعریف context امنیتی در سطح پاد
labelsmappingلیبل‌های اضافی برای آبجکت Deployment *
annotationsmappingannotationهای اضافی برای آبجکت Deployment *
podLabelsmappingلیبل‌های اضافی در سطح Pod *
podAnnotationsmappingannotationهای اضافی در سطح Pod *
terminationGracePeriodSecondspositive integerتعین مدت‌زمان اختیاری (برحسب ثانیه) تا پایان‌یافتن پادها
hostNetworkbooleanفعال‌سازی hostNetwork مشابه با پیاده‌سازی بومی کوبرنیتیزfalse
hostAliasesilistنسبت hostname دلخواه به IP
hostAliases[].ipstringآدرس IP که نام‌های دامنه مشخص‌شده به آن نسبت داده‌شوند
hostAliases[].hostnameslist of stringsلیست نام‌هایی که باید به hostAliases.ip نسبت داده‌شوند
hpaworkload.hpaتعریف و فعال‌سازی HPA (مقیاس‌پذیری افقی خودکار)
pdbworkload.pdbتعریف محدودیت‌های مربوط به PodDisruptionBudget
antiAffinityModestringنحوه اعمال affinity ورک‌لود؛ در صورت عدم تعریف دستی، مقادیر معتبر preferred، required می‌باشند
antiAffinityTopologyKeyslist of stringsکلیدهای توپولوژی برای تنظیم حالت anti-affinity (مثلاً kubernetes.io/hostname)['kubernetes.io/hostname']
affinityobjectتعریف دستی affinity مانند نحوه‌ی تعریف در کوبرنیتیز
tolerationslistتعریف tolerationها برای اجرای پاد روی نودهای خاص همانند تعریف کوبرنیتیز
nodeSelectormappingتعریف کلید-مقدار برای nodeSelector (اختصاص پاد به نودهای خاص) مشابه تعریف خود کوبرنیتیز
dnsPolicystringسیاست DNS برای پاد؛ یکی از مقادیر: Default، ClusterFirst، ClusterFirstWithHostNet، None
fullnameOverridestringمقدار جایگزین برای نام کامل این ورک‌لود
minReadySecondspositive integerحداقل مدت زمانی که یک پاد باید آماده باشد در صورتی که کانتینری از آن کرش نکند
priorityClassNamestringاگر مشخص شود، اولویت پاد را نشان می‌دهد. باید PriorityClass با همین نام از پیش تعریف شده باشد
imagePullSecretslist of imagePullSecretلیستی از secretهایی که برای pull کردن ایمیج استفاده می‌شوند
topologySpreadConstraintslistتعریف نحوه‌ی پخش پادها در میان نواحی مختلف توپولوژیکی دامنه‌ها
topologySpreadConstraints[].maxSkewpositive integer(الزامی) مقدار انحراف مجاز در پخش پادها
topologySpreadConstraints[].topologyKeystring(الزامی) کلید توپولوژی برای پخش
topologySpreadConstraints[].whenUnsatisfiablestring(الزامی) یکی از: DoNotSchedule یا ScheduleAnyway
topologySpreadConstraints[].labelSelectormapping(الزامی) selector برای انتخاب پادها
topologySpreadConstraintsSkewpositive integerفعال‌سازی ساده topologySpreadConstraints با مقدار skew مشخص شده

/* مثال‌های مجاز را در بخش k8s.label regex ببینید.

ورک‌لود StatefulSet

یک وروک‌لود statefulset با نام bar بدین شکل تعریف می‌شود:

gonbad:
  workloads:
    rex:
      kind: statefulset
      #...
      volumeClaimTemplates:
        data-vol:
          size: 10Gi
        log-vol:
          size: 1Gi
    #...

یک ورک‌لود statefulset می‌تواند شامل چندین کانتینر (container) باشد.

پارامترهای قابل تنظیم برای ورک‌لود نوع statefulset:

پارامترنوع دادهتوضیحمقدار پیش‌فرض
kindstring(الزامی) مقدار باید statefulset باشدstatefulset
enabledbooleanفعال یا غیرفعال بودن این ورک‌لودtrue
replicaCountpositive integerتعداد پادهای این ورک‌لود (حداقل ۰)1
containersmapping of container(الزامی) تعریف کانتینرهای این statefulset
initContainersmapping of containerکانتینرهایی که پیش از کانتینرهای اصلی اجرا می‌شوند و باید موفق شوند؛ در غیر این‌صورت پاد شکست می‌خورد
podManagementPolicystringتعیین نحوه ایجاد پادها هنگام scale اولیه؛ مقادیر مجاز: OrderedReady, ParallelOrderedReady
updateStrategy.typestringنوع استراتژی به‌روزرسانی StatefulSet؛ مقادیر مجاز: RollingUpdate, OnDeleteRollingUpdate
usedSharedConfigslist of stringsاگرچه تمام sharedConfigs برای همه در دسترس‌اند، فقط زمانی در این بخش ریلود شوند که یکی از این کانفیگ‌ها تغییر کرده باشدهمه sharedConfigs
usedSharedSecretslist of stringsمشابه بالا ولی برای sharedSecretsهمه sharedSecrets
serviceAccount.namestringنام ServiceAccount مورد استفاده برای این statefulset
service.typestringنوع سرویس مرتبط: ClusterIP, NodePort یا HeadlessClusterIP
service.labelsmappingلیبل‌های اضافی برای سرویس *
service.annotationsmappingannotationهای اضافی برای سرویس *
securityContextpod.securityContextتنظیمات امنیتی در سطح پاد *
labelsmappingلیبل‌های اضافی در محیط Deployment *
annotationsmappingannotationهای اضافی در محیط Deployment *
podLabelsmappingلیبل‌های اضافی برای پاد نهایی *
podAnnotationsmappingannotationهای اضافی برای پاد نهایی *
terminationGracePeriodSecondspositive integerمدت‌زمان (بر حسب ثانیه) تا خاتمه کار پاد
hostNetworkbooleanفعال‌سازی hostNetwork مشابه با پیاده‌سازی بومی کوبرنیتیزfalse
hostAliaseslistنسبت hostname دلخواه به IP
hostAliases[].hostnameslist of stringsلیست نام‌هایی که باید به IP مشخص شده نسبت شوند
hostAliases[].ipstringآدرس IP که نام‌های داده‌شده به آن نسبت می‌شوند
volumeClaimTemplatesvolumeClaimTemplatesتعریف ساده‌شده برای volumeClaimTemplateهای مربوط به StatefulSet
hpaworkload.hpaتعریف و پیکربندی HorizontalPodAutoscaler
pdbworkload.pdbتعریف و پیکربندی PodDisruptionBudget
dnsPolicystringسیاست DNS برای این ورک‌لود: یکی از Default, ClusterFirst, ClusterFirstWithHostNet, None
antiAffinityModestringتعیین نحوه affinity پیش‌فرض در صورت عدم تنظیم دستی؛ مقادیر معتبر: preferred, required
antiAffinityTopologyKeyslist of stringsکلیدهای توپولوژی برای anti-affinity، در صورت استفاده از antiAffinityMode['kubernetes.io/hostname']
affinityobjectتعریف کامل affinity در سطح پاد مشابه با تنظیمات کوبرنیتیز
tolerationslistتعریف toleration برای پاد مشابه کوبرنیتیز
nodeSelectormappingنگاشت کلید-مقدار برای تعیین نودهای هدف پاد
fullnameOverridestringمقدار جایگزین برای نام کامل ورک‌لود
minReadySecondspositive integerحداقل زمانی که یک پاد در صورت عدم کرش باید آماده باقی بماند
priorityClassNamestringتعیین اولویت پاد؛ باید از پیش PriorityClass متناظر تعریف شده باشد
imagePullSecretslist of imagePullSecretلیستی از سکرت‌هایی برای pull ایمیج‌ها
topologySpreadConstraintslistنحوه پخش پادها در دامنه‌های توپولوژیکی
topologySpreadConstraints[].maxSkewpositive integer(الزامی) میزان انحراف مجاز
topologySpreadConstraints[].topologyKeystring(الزامی) کلید توپولوژی
topologySpreadConstraints[].whenUnsatisfiablestring(الزامی) یکی از DoNotSchedule یا ScheduleAnyway
topologySpreadConstraints[].labelSelectormapping(الزامی) selector برای هدف قرار دادن پادها
topologySpreadConstraintsSkewpositive integerتعریف ساده‌ی topologySpreadConstraints با skew مشخص

/* مثال‌های مجاز labeling را در k8s.label regex و annotations را در k8s.annotation regex ببینید.

ورک‌لود Daemonset

یک ورک‌لود daemonset با نام jaz بدین صورت تعریف می‌شود:

gonbad:
  workloads:
    jaz:
      kind: daemonset
      #...

یک ورک‌لود daemonset می‌تواند چندین کانتینر (container) داشته‌باشد.

پارامترهای قابل تنظیم برای ورک‌لود نوع daemonset:

پارامترنوع دادهتوضیحمقدار پیش‌فرض
kindstring(الزامی) مقدار باید daemonset باشدdaemonset
enabledbooleanفعال یا غیرفعال بودن این ورک‌لودtrue
containersmapping of container(الزامی) تعریف کانتینرهای این daemonset
initContainersmapping of containerکانتینرهایی که یک‌بار و به ترتیب اجرا می‌شوند و باید موفق شوند تا کانتینرهای اصلی اجرا شوند
updateStrategystringیکی از مقادیر RollingUpdate یا OnDelete برای تعیین نحوه به‌روزرسانیRollingUpdate
usedSharedConfigslist of stringsاگرچه تمام sharedConfigs برای همه در دسترس‌اند، فقط زمانی در این بخش بازتعریف شوند که یکی از این کانفیگ‌ها تغییر کرده باشدهمه sharedConfigs
usedSharedSecretslist of stringsمشابه بالا، اما برای سکرت‌هاهمه sharedSecrets
serviceAccount.namestringنام ServiceAccount استفاده‌شده در این daemonset
service.typestringنوع سرویس: یکی از ClusterIP یا NodePortClusterIP
service.labelsmappingلیبل‌های اضافی برای سرویس مرتبط *
service.annotationsmappingannotationهای اضافی برای سرویس *
securityContextpod.securityContextتنظیمات امنیتی در سطح پاد
labelsmappingلیبل‌های اضافی برای آبجکت daemonset *
annotationsmappingannotationهای اضافی برای آبجکت daemonset *
podLabelsmappingلیبل‌های اضافی برای پاد نهایی *
podAnnotationsmappingannotationهای اضافی برای پاد نهایی *
terminationGracePeriodSecondspositive integerمدت‌زمان اختیاری (برحسب ثانیه) تا توقف پاد
hostNetworkbooleanفعال‌سازی hostNetwork برای این پاد مشابه کوبرنیتیز بومیfalse
hostAliaseslistنگاشت hostname به IP مشخص‌شده
hostAliases[].ipstringآدرس IP که hostAliases.hostnames به آن resolve شوند
hostAliases[].hostnameslist of stringsلیست نام‌هایی که باید به IP مشخص‌شده resolve شوند
antiAffinityModestringحالت anti-affinity پاد در صورت عدم تعریف دستی affinity؛ مقادیر: preferred, required
antiAffinityTopologyKeyslist of stringsکلیدهای توپولوژی برای anti-affinity['kubernetes.io/hostname']
affinityobjectتعریف کامل affinity به سبک کوبرنیتیز
tolerationslistتعریف toleration برای پاد مشابه کوبرنیتیز
nodeSelectormappingتعیین نودهای هدف اجرای پاد با نگاشت کلید-مقدار
dnsPolicystringسیاست DNS: یکی از Default, ClusterFirst, ClusterFirstWithHostNet, None
fullnameOverridestringمقدار جایگزین برای نام کامل این ورک‌لود
priorityClassNamestringتعیین کلاس اولویت پاد؛ باید PriorityClass با همین نام از پیش تعریف شده باشد
imagePullSecretslist of imagePullSecretلیستی از سکرت‌ها برای pull کردن ایمیج‌ها

/* مثال‌های مجاز labeling را در k8s.label regex و annotations را در k8s.annotation regex ببینید.

ورک‌لود CronJob

A cronjob workload name baz looks like:

gonbad:
  workloads:
    baz:
      kind: cronjob
      schedule: '0 */2 * * *'
      #...

A cronjob workload can have multiple containers.

پارامترهای قابل تنظیم برای ورک‌لود نوع cronjob:

پارامترهای قابل تنظیم برای ورک‌لود نوع cronjob

پارامترنوع دادهتوضیحمقدار پیش‌فرض
kindstring(الزامی) نوع ورک‌لود باید cronjob باشدcronjob
enabledbooleanفعال یا غیرفعال بودن این ورک‌لودtrue
schedulestring(الزامی) زمان‌بندی اجرا به‌صورت رشته‌ای شبیه crontab (مثلاً: 0 */2 * * * برای هر ۲ ساعت یک‌بار)
containersنگاشت از container(الزامی) تعریف کانتینرهای این cronjob
initContainersنگاشت از containerکانتینرهایی که قبل از کانتینرهای اصلی به‌صورت ترتیبی اجرا می‌شوند و باید موفق شوند تا پاد اجرا شود
startingDeadlineSecondsعدد صحیح مثبتحداکثر زمان (برحسب ثانیه) برای اجرای job در صورت جا افتادن زمان‌بندی به هر دلیل
concurrencyPolicystringنحوه مدیریت اجرای هم‌زمان چند job؛ مقادیر معتبر: Allow, Forbid, ReplaceAllow
successfulJobsHistoryLimitعدد صحیح مثبتتعداد jobهای موفق تکمیل‌شده که باید نگه‌داری شوند3
failedJobsHistoryLimitعدد صحیح مثبتتعداد jobهای شکست‌خورده که باید نگه‌داری شوند1
suspendbooleanاگر true باشد، اجرای بعدی job به حالت تعلیق درمی‌آیدfalse
restartPolicystringسیاست ری‌استارت برای کانتینرها در پاد؛ مقادیر: Always, OnFailure, NeverAlways
usedSharedConfigsلیست رشته‌ایفقط در صورتی این ورک‌لود ری‌لود شود که یکی از sharedConfigs استفاده‌شده تغییر کرده باشدهمه sharedConfigs
usedSharedSecretsلیست رشته‌ایمشابه بالا، اما برای sharedSecretsهمه sharedSecrets
securityContextpod.securityContextتعریف context امنیتی برای پاد
serviceAccount.namestringنام ServiceAccount که این cronjob از آن استفاده می‌کند
hostAliaseslistلیست نگاشت hostname به IP مشخص‌شده
hostAliases[].hostnamesلیست رشته‌ایلیست hostnameهایی که باید به IP مربوطه resolve شوند
hostAliases[].ipstringIP مقصد که hostnames به آن resolve می‌شوند
imagePullSecretsلیست از imagePullSecretلیستی از سکرت‌هایی که برای کشیدن ایمیج‌ها به کار می‌روند

فایل‌های ایستا (Gonbad Staticfiles)

بخش: gonbad.staticFiles

برای اینکه بتوانید تک فایل‌های ایستایی مانند فایل‌های پیکربندی (مثلاً .zshrc یا sshd.config) را درون کانتینر mount کنید، ابتدا باید آن‌ها را در بخش gonbad.staticFiles تعریف کنید.

پس از تعریف، می‌توان از طریق gonbad.workloads.containers.fileMounts به آن‌ها ارجاع داد و در کانتینر قرارشان داد.

به عنوان مثال فرض کنیم بخواهیم دو فایل ایستا به نام‌های .zshrc و sshd.config تعریف کنیم:

gonbad:
  #...
  staticFiles:
    .zshrc: |
      alias ll="ls -alh"
      alias g="git"
    sshd.config: |
      Port: 23412
  #...

در این حالت، فایل‌ها به‌صورت خودکار به ConfigMap تبدیل می‌شوند و Gonbad وظیفه‌ی حفظ یکپارچگی و یکنواختی نام‌گذاری آن‌ها را بر عهده دارد.

حجم‌ها (Gonbad Volumes)

بخش: gonbad.volumes

برای ایجاد PersistentVolumeClaim (PVC) و استفاده از آن، یا mount کردن Secrets و ConfigMaps در داخل پادها، ابتدا باید آن‌ها در بخش gonbad.volumes تعریف کنید. سپس از طریق containers.volumeMounts در داخل کانتینر مانت شوند.

انواع Volumeهای پشتیبانی‌شده عبارت‌اند از:

پارامترنوع دادهتوضیحمقدار پیش‌فرض
typestring(الزامی) نوع Volume؛ یکی از: persistentVolumeClaim, secret, configMap, emptyDir, ephemeral, existingPVC, hostPath

در ادامه توضیح هر یک را مشاهده می‌کنید.

نوع Volume: persistentVolumeClaim

پارامترنوع دادهتوضیحمقدار پیش‌فرض
typestring(الزامی) مقدار باید persistentVolumeClaim باشد
sizeعدد مثبت یا رشته مانند 2Gi(الزامی) اندازه حجم درخواستی
accessModestring(الزامی) یکی از: ReadOnlyMany, ReadWriteOnce, ReadWriteMany
storageClassstringنام کلاس ذخیره‌سازی مورد استفاده برای این PVC

نوع Volume: existingPVC

پارامترنوع دادهتوضیحمقدار پیش‌فرض
typestring(الزامی) مقدار باید existingPVC باشد
namestring(الزامی) نام PVC (نوع بالا) موجودی که قرار است استفاده شود
readOnlybooleanاگر true باشد، این Volume به‌صورت فقط‌خواندنی mount می‌شودfalse

نوع Volume: ephemeral

پارامترنوع دادهتوضیحمقدار پیش‌فرض
typestring(الزامی) مقدار باید ephemeral باشد
sizeعدد مثبت یا رشته مانند 1Gi(الزامی) اندازه حافظه موقت
accessModestring(الزامی) حالت دسترسی یکی از حالات ReadOnlyMany ،ReadWriteOnce یا ReadWriteOnce
storageClassstringکلاس ذخیره‌سازی مورد استفاده برای این ephemeral PVC

نوع Volume: emptyDir

پارامترنوع دادهتوضیحمقدار پیش‌فرض
typestring(الزامی) مقدار باید emptyDir باشد

نوع Volume: secret

پارامترنوع دادهتوضیحمقدار پیش‌فرض
typestring(الزامی) مقدار باید secret باشد
namestring(الزامی) نام سکرت مورد استفاده
itemslistاگر تعیین شود، فقط کلیدهای مشخص‌شده از سکرت در آدرس مشخص شده mount می‌شوند
items[].keystring(الزامی) کلید داخل Secret که باید مانت شود
items[].pathstring(الزامی) مسیر نسبی فایلی که کلید به آن نگاشت می‌شود
items[].modeintegerمجوز (permission) فایل را تعیین می‌کند؛ باید بین 0000 تا 0777 (به‌صورت octal) یا بین 0 تا 511 (به‌صورت دسیمال) باشد

نوع Volume: configMap

پارامترنوع دادهتوضیحمقدار پیش‌فرض
typestring(الزامی) مقدار باید configMap باشد
namestring(الزامی) نام ConfigMap مورد استفاده
itemslistاگر تعیین شود، فقط کلیدهای مشخص‌شده از configMap، mount می‌شوند
items[].keystring(الزامی) کلید داخل ConfigMap که باید mount شود
items[].pathstring(الزامی) مسیر نسبی فایلی که کلید به آن نگاشت می‌شود
items[].modeintegerمجوز (permission) فایل؛ باید بین 0000 تا 0777 (به‌صورت octal) یا بین 0 تا 511 (به‌صورت دسیمال) باشد

نوع Volume: hostPath

پارامترنوع دادهتوضیحمقدار پیش‌فرض
typestring(الزامی) مقدار باید hostPath باشد
pathstring(الزامی) مسیر از نود میزبان که باید به عنوان Volume استفاده شود
hostPathTypestring(الزامی) یکی از مقادیر: DirectoryOrCreate, Directory, FileOrCreate, File, Socket, CharDevice, BlockDevice

اینگرس‌ها (Gonbad Ingresses)

بخش: gonbad.ingresses

برای ایجاد منابع Ingress در کوبرنیتیز، باید آن‌ها را در زیر بخش gonbad.ingresses تعریف کرد. هر تعریف اینگرس با یک نام مانند ing مشخص می‌شود.

نمونه‌ای از پارامترهای قابل تنظیم:

پارامترنوع دادهتوضیحمقدار پیش‌فرض
enabledbooleanفعال یا غیرفعال بودن این ingresstrue
workloadNamestring(الزامی) نام ورک‌لودی که ترافیک باید به سرویس آن هدایت شود؛ (نام release-name به صورت داخلی به آن اضافه می‌شود) و نسبت به serviceName ارجح است
serviceNamestring(الزامی) نام سرویس backend که ترافیک به آن هدایت می‌شود
servicePortstring(الزامی) نام پورتی در سرویس backend باید استفاده شود
ingressClassNamestringکلاس اینگرس (مثلاً nginx, traefik)
fullnameOverridestringمقدار جایگزین برای نام کامل اینگرس
hostslist(الزامی) لیست hostهایی که این اینگرس برای آن‌ها تعریف می‌شود
hosts[].hoststring(الزامی) آدرس هاست به فرمت IDN که باید route شود
hosts[].pathslistمسیرهای مربوط به هر هاست؛ می‌تواند لیستی ساده از مسیرها باشد یا هر مسیر پیکربندی خاص خود را داشته باشد
hosts[].paths[].pathstring(الزامی) مسیر درخواستی (URL path) که باید route شود
hosts[].paths[].pathTypestring(الزامی) نوع مسیر؛ یکی از ImplementationSpecific, Exact, یا PrefixImplementationSpecific
hosts[].paths[].workloadNamestringنام ورک‌لود برای هدایت ترافیک (نسبت به serviceName ارجح است)از workloadName بالایی
hosts[].paths[].serviceNamestringنام سرویس backend برای هدایت ترافیکاز serviceName بالایی
hosts[].paths[].servicePortstring یا عدد صحیحپورت سرویس backendاز servicePort بالایی
labelsmappingلیبل‌های اختصاصی برای این ingress
annotationsmappingannotationهای اختصاصی برای این ingress
tlslistپیکربندی TLS برای این ingress
tls[].secretNamestring(الزامی) نام Secret که برای TLS استفاده می‌شود
tls[].hostsلیست رشته‌ایهاست‌هایی که باید توسط secretName پشتیبانی شوند

نکات:

  • workloadName فقط نام ریلیز را به صورت داخلی به نام سرویس اضافه می‌کند. این مقدار بررسی نمی‌کند که ورک‌لود موجود یا فعال است یا نه، برای دسترسی بیشر از مقدار workload.fullnameOverride استفاده کنید.
  • می‌توان مقادیر global.ingress.annotations و global.ingress.tls را نیز به صورت سراسری تعریف کرد که با مقادیر محلی اینگرس‌ها ادغام می‌شوند.

سرویس‌های خارجی (Gonbad ExternalServices)

بخش: gonbad.externalServices

برای ارجاع به سرویس‌هایی خارج از کلاستر کوبرنیتیز (مثلاً دیتابیس خارجی، API، یا DNS)، باید آن‌ها را در این بخش تعریف کنید.

توجه: برای تعریف معتبر یک سرویس خارجی، علاوه‌بر ports حتماً باید یکی از فیلدهای externalName یا externalIPs مقدار داشته باشند.

پارامترنوع دادهتوضیحمقدار پیش‌فرض
enabledbooleanفعال یا غیرفعال بودن سرویس خارجی
externalNamestringنام دامنه (IDN) سرویس خارجی (فقط این فیلد یا externalName باید تعریف شود)
externalIPslist of stringsلیست IP (IPv4 یا IPv6) مربوط به سرویس خارجی (فقط این فیلد یا externalName باید تعریف شود)
portscontainer.portsلیست پورت‌های مربوط به سرویس‌‌های خارجی

قوانین پرومتئوس (Gonbad PrometheusRule)

بخش: gonbad.prometheusRule

در این بخش می‌توان قوانین مانیتورینگ و هشدار Prometheus را تعریف کرد. این قابلیت به ویژه برای پروژه‌هایی که نیاز به پایش دقیق متریک‌ها دارند کاربرد دارد.

پارامترنوع دادهتوضیحمقدار پیش‌فرض
enabledbooleanفعال‌سازی این بخشtrue
tplstringاگر true باشد، قوانین به صورت قالب Helm پردازش می‌شوندfalse
intervalpositive integerفاصله زمانی بین اجرای هر rule
grafanaDomainstringدامنه گرافانا برای اتصال از Prometheus
ruleslistلیست قوانین Prometheus
rules[].exprstring یا int(الزامی) عبارت قانون در PromQL که قرار است محاسبه شود
rules[].alertstringاگر تنظیم شده باشد، این قانون به‌عنوان یک هشدار با این نام فعال می‌شود
rules[].recordstringاگر تنظیم شده باشد، نتیجه عبارت expr به‌صورت متریک جدید با این نام ذخیره می‌شود
rules[].forstringمدت زمانی که باید قبل از فعال شدن هشدار صبر کرد؛ باید با الگوی [0-9]+(ms\s\m\h)s
rules[].labelsmappingلیبل‌های اختصاصی برای این قانون
rules[].annotationsmappingتوضیحات (annotation) برای این قانون

منابع خام یا پردازش نشده (Gonbad RawResources)

بخش: gonbad.rawResources

اگر بخواهید منابع دلخواه کوبرنیتیز را خارج از سازوکار تعریف خودکار Gonbad به‌صورت مستقیم تعریف کنید (مثلاً CRD خاص یا تعریف دستی Secret)، می‌توانید آن‌ها را در این بخش وارد کنید. این منابع بدون اعتبارسنجی توسط پک اپراتور پردازش می‌شوند.

پارامترنوع دادهتوضیحمقدار پیش‌فرض
apiVersionstring(الزامی) نسخه API که برای منبع کوبرنیتیز مورد نظر استفاده می‌شود
kindstring(الزامی) نوع منبع (مثلاً Secret, Ingress, ConfigMap)
metadata.namestring(الزامی) نام منبع
metadata.namespacestringفضای نام (namespace) که منبع باید در آن ایجاد شود
metadata.labelsmappingلیبل‌های منبع (مطابق با قالب k8s.label regex) *
metadata.annotationsmappingannotationهای منبع (مطابق با قالب k8s.annotation regex) *
*هر نوعسایر فیلدهای دلخواه مربوط به منبع؛ بدون اعتبارسنجی توسط این چارت

/* مثال‌های مجاز labeling را در k8s.label regex و annotations را در k8s.annotation regex ببینید.

پارامترهای تکمیلی (Additional Parameters)

این آبجکت‌ها به‌طور مستقیم استفاده نمی‌شوند، بلکه به‌عنوان زیرمجموعه (sub-type) برای تعریف دقیق‌تر ورک‌لودها و منابع بالا استفاده می‌شوند.


استراتژی استقرار (Deployment Strategy)

بخش: deployment.strategy

این پارامترها تعیین می‌کنند که هنگام بروزرسانی یا اعمال مجدد یک workload، چه نوع استراتژی استقراری اعمال شود:

پارامترنوع دادهتوضیحمقدار پیش‌فرض
typestringنوع استراتژی: یکی از Recreate یا RollingUpdate؛ اگر Recreate باشد، پارامترهای اضافه مجاز نیستندRollingUpdate
rollingUpdate.maxSurgestring یا positive integerحداکثر پاد اضافی هنگام استقرار از نوع RollingUpdate (مثلاً 2 یا 25%)25%
rollingUpdate.maxUnavailablestring یا positive integerحداکثر پاد غیرقابل استفاده همزمان در حین RollingUpdate (مثلاً 1 یا 25%)25%

ایمیج پول با سکرت (Workload ImagePullSecret)

این بخش برای معرفی سکرتی (secret) است که به‌کمک آن، ایمیج‌ها از رجیستری‌های خصوصی دریافت می‌شوند.

پارامترنوع دادهتوضیحمقدار پیش‌فرض
namestring(الزامی) نام secret از نوع kubernetes.io/dockerconfigjson که استفاده یا ایجاد می‌شود
registrystringآدرس رجیستری که سکرت برای آن ساخته می‌شود
usernamestringنام کاربری برای سکرت
passwordstringرمز عبور برای سکرت

مقیاس‌گذاری خودکار (Workload HPA)

بخش: workload.hpa

این بخش منجر به ایجاد منبع HorizontalPodAutoscaler برای workload مربوطه می‌شود و تنظیمات مقیاس‌پذیری را مشخص می‌کند.

پارامترنوع دادهتوضیحمقدار پیش‌فرض
minReplicasintegerحداقل تعداد replica که توسط HPA تنظیم می‌شوند1
maxReplicasinteger(الزامی) حداکثر تعداد replica در صورت تنظیم HPA
cpuAverageUtilizationintegerدسترسی سریع به میانگین استفاده بر اساس متریک های CPU
memoryAverageUtilizationintegerدسترسی سریع به میانگین استفاده از حافظه بر اساس متریک RAM
metricslistلیست متریک‌های سفارشی برای مقیاس‌گذاری خودکار
metrics[].typestring(الزامی) نوع متریک؛ یکی از Resource, Pods, Object, External
metrics[].namestring(الزامی) نام متریک
metrics[].metricSelectorobjectلیبل‌سلکتور برای فیلتر کردن متریک‌ها
metrics[].targetobjectمقدار هدف برای مقیاس‌گذاری (فقط یکی از زیر‌پارامترهای آن باید تنظیم شود)
metrics[].target.valuequantityمقدار دقیق متریک مورد نظر فقط برای انواع Resource, Object, External قابل تعریف هستند
metrics[].target.averageValuequantityمیانگین مقدار متریک بین تمام پادها
metrics[].target.averageUtilizationعدد صحیح مثبتمیانگین درصد استفاده از متریک بر پایه منابع (فقط برای Resource)
metrics[].describedObjectobjectمشخص‌کردن یک شی دیگر برای گرفتن متریک از آن (فقط برای نوع Object معتبر است)

بودجه قطع‌شدن پادها (Workload PDB)

بخش: workload.pdb

ایجاد منبع PodDisruptionBudget برای محافظت از تعداد حداقلی از پادها هنگام رخدادهایی مثل بروزرسانی نود یا قطع موقت:

پارامترنوع دادهتوضیحمقدار پیش‌فرض
minAvailableدرصد یا عدد صحیح مثبتحداقل تعداد پادهای قابل دسترس در هنگام حذف پادها توسط kubelet (قابل استفاده همزمان با maxUnavailable نیست)
maxUnavailableدرصد یا عدد صحیح مثبتحداکثر تعداد پادهای مجاز برای غیرفعال بودن در هنگام اختلالات (قابل استفاده همزمان با minAvailable نیست)

ویژگی‌های امنیتی پاد (Pod securityContext)

بخش: workload.securityContext

pod.securityContext شامل تنظیمات امنیتی سطح پاد است که برای تمام کانتینرها در یک پاد اعمال می‌شود. توجه داشته باشید که اگر پارامتر معادلی در container.securityContext نیز تعریف شود، اولویت با تنظیمات کانتینر خواهد بود.

پارامترنوع دادهتوضیحمقدار پیش‌فرض
runAsUserعدد صحیح مثبتUID کاربری که پروسه اصلی کانتینر با آن اجرا می‌شود. اگر مقدار نداشته باشد، مقدار پیش‌فرض زمان اجرا استفاده می‌شود.
runAsGroupعدد صحیح مثبتGID گروهی که پروسه اصلی کانتینر با آن اجرا می‌شود.
runAsNonRootbooleanاگر true باشد، تضمین می‌شود که کانتینر با کاربری غیر از root اجرا شود. در غیر این صورت، kubelet از اجرای آن جلوگیری می‌کند.
fsGroupعدد صحیح مثبتگروه ثانویه‌ای که برای مالکیت مشترک فایل‌ها در حجم‌ها (Volumes) استفاده می‌شود.
fsGroupChangePolicystringیکی از: Always یا OnRootMismatch. مشخص می‌کند که تغییر مالکیت و سطح دسترسی به حجم‌ها چگونه صورت گیرد. فقط برای نوع‌هایی از Volume که از fsGroup پشتیبانی می‌کنند اعمال می‌شود.

پارامترهای مجاز دیگر را با دستور kubectl explain pod.spec.securityContext دریافت کنید.

تعریف کانتینر (Container)

پارامترنوع دادهتوضیحمقدار پیش‌فرض
enabledbooleanفعال یا غیرفعال بودن این کانتینر در پادtrue
imagecontainer.imageایمیجی که کانتینر با آن ساخته می‌شود.
commandlist of stringsدستور اصلی هنگام اجرای کانتینر (مثلاً: ["de.sh", "-v", "-c"])
argslist of stringsآرگومان‌هایی که به دستور command پاس داده می‌شود
envobjectمتغیرهای محیطی به‌صورت key: value
envFromlist از container.envFromبارگذاری همه متغیرهای محیطی از یک Secret یا ConfigMap
livenessProbecontainer.probeتعریف پروب سلامت برای بررسی زنده بودن کانتینر
readinessProbecontainer.probeتعریف پروب آمادگی برای بررسی قابل استفاده بودن کانتینر
startupProbecontainer.probeتعریف پروب راه‌اندازی برای کنترل زمان آماده شدن اولیه کانتینر
resourcescontainer.resourcesمحدودیت‌ها و درخواست‌های منابع (CPU و RAM)
portscontainer.portsتعریف پورت‌هایی که توسط کانتینر باز می‌شوند
lifecyclecontainer.lifecycleمراحل lifecycle مانند preStop و postStart
securityContextcontainer.securityContextتنظیمات امنیتی خاص این کانتینر
fileMountslistتعریف فایل‌هایی که از طریق staticFiles به مسیر خاصی مانت می‌شوند
fileMounts[].namestringنام فایل از بخش staticFiles
fileMounts[].mountPathstringمسیر مانت فایل در کانتینر
fileMounts[].executablebooleanاگر true باشد، فایل به‌صورت اجرایی مانت می‌شود (0555)false
volumeMountslistتعریف Volumeهایی که باید در این کانتینر مانت شوند
volumeMounts[].namestringنام Volume
volumeMounts[].mountPathstringمسیر مانت Volume
volumeMounts[].subPathstringمسیر فرعی در Volume
volumeMounts[].readOnlybooleanاگر true باشد، Volume فقط‌خواندنی مانت می‌شودfalse
orderعدد صحیح مثبتترتیب ایجاد کانتینرها در Manifest نهایی (در صورت چندکانتینری بودن)

کانتینر ایمیج (Container Image)

بخش: container.image

پارامترنوع دادهتوضیحمقدار پیش‌فرض
repositorystring(الزامی) نام ریپازیتوری ایمیج؛ می‌تواند شامل آدرس رجیستری نیز باشد (مثلاً: docker.sabz.dev/grafana)
tagstring(الزامی) برچسب (tag) نسخه ایمیج
pullPolicystringسیاست دریافت ایمیج: یکی از Always یا IfNotPresentIfNotPresent
registrystringآدرس رجیستری از جایی که ایمیج دریافت می‌شود (مثلاً: docker.io یا docker.sabz.dev)

متغیرهای محیطی کانتینر (Container Env)

بخش: workload.container.env

در Gonbad، هر متغیر محیطی (env) در کانتینر می‌تواند به‌صورت مستقیم (مقدار رشته‌ای یا عددی) یا به‌صورت غیرمستقیم از منابعی مانند Secret، ConfigMap، منابع سیستم (fieldRef) یا منابع محدودیت منابع (resourceFieldRef) مقداردهی شود.

نکته: تنها یکی از فیلدهای value، secretRef، configMapRef، resourceFieldRef یا fieldRef باید تنظیم شود.

اولویت و ترتیب پردازش envها:

  1. envهایی که order مشخص دارند (به جز order: -1)
  2. envهای غیرترتیب‌دار از نوع secretRef، configMapRef، resourceFieldRef و fieldRef
  3. envهای ساده‌ی دارای value که حاوی $(...) نیستند
  4. envهای دارای value با $(...) (تمپلیتینگ کوبرنیتیز)
  5. envهایی با order: -1 (در آخر اعمال می‌شوند)
پارامترنوعتوضیحپیش‌فرض
orderintegerترتیب تعریف env برای زمانی که از تمپلیتینگ کوبرنیتیز (مثل $(...)) استفاده می‌شود. مقدار -1 یعنی در انتهای ترتیب.
valuestringمقدار مستقیم برای env
secretRefobjectاستفاده از یک Secret برای مقداردهی
secretRef.namestring(الزامی) نام سکرت
secretRef.keystring(الزامی) کلید مورد نظر در سکرت
secretRef.optionalbooleanتعیین اختیاری بودن وجود سکرت یا کلید مربوطه
configMapRefobjectمقداردهی از طریق ConfigMap
configMapRef.namestring(الزامی) نام ConfigMap
configMapRef.keystring(الزامی) کلید مورد نظر در ConfigMap
configMapRef.optionalbooleanتعیین اختیاری بودن وجود ConfigMap یا کلید مربوطه
resourceFieldRefobjectاستخراج مقدار از منابع کوبرنیتیز (مثل CPU یا حافظه)
resourceFieldRef.resourcestring(الزامی) نام منبع (مثل: limits.cpu، requests.memory)
resourceFieldRef.containerNamestringنام کانتینر (در صورت وجود چند کانتینر در یک پاد)
resourceFieldRef.divisorstringمقسومی برای نرمال‌سازی مقدار منبع
fieldRefobjectمقداردهی از طریق اطلاعات خود پاد (مثل نام یا namespace)
fieldRef.fieldPathstring(الزامی) مسیر فیلد مورد نظر در مانفیست پاد (مثلاً: metadata.name، spec.nodeName)

نمونه:

...:
  env:
    NUMBER: 123456
    SIMPLE: 'simple env value'

    SENTRY_DSN:
      configMapKeyRef:
        name: app-configmap
        key: sentry-dsn

    POSTGRESQL_PASSWORD:
      secretKeyRef:
        name: postgresql
        key: password

    POD_MEMORY_LIMIT:
      resourceFieldRef:
        resource: limits.memory

    POD_IP:
      fieldRef:
        fieldPath: status.podIP

    SIMPLE_ORDERED:
      value: foo
      order: 1

    POD_MEMORY_LIMIT_ORDERED:
      resourceFieldRef:
        resource: limits.memory
      order: 2

    COMPLEX:
      value: foo-$(SIMPLE_ORDERED)-$(POD_MEMORY_LIMIT_ORDERED)

    ANOTHER_COMPLEX:
      value: bar-$(POD_ID)
      order: -1 # -1 means last

متغیرهای محیطی از منابع خارجی (Container envFrom)

بخش: container.envFrom

با استفاده از این بخش می‌توان تمام key/value‌های موجود در یک Secret یا ConfigMap را به‌صورت یکجا به عنوان متغیرهای محیطی به کانتینر اضافه کرد. در هر تعریف فقط یکی از secretRef یا configMapRef باید مشخص شود.

پارامترنوعتوضیحپیش‌فرض
secretRefobjectبارگذاری همه متغیرها از یک Secret
secretRef.namestring(الزامی) نام Secret
configMapRefobjectبارگذاری همه متغیرها از یک ConfigMap
configMapRef.namestring(الزامی) نام ConfigMap
prefixstringپیشوندی که به کلیدهای واردشده افزوده می‌شود

پروب‌های کانتینر (Container Probes)

بخش‌ها: container.startupProbe، container.livenessProbe، container.readinessProbe

هر کانتینر می‌تواند دارای سه نوع پروب باشد:

  • Startup Probe: بررسی صحت اولیه اجرای کانتینر
  • Liveness Probe: بررسی اینکه کانتینر هنوز زنده است
  • Readiness Probe: بررسی آمادگی کانتینر برای دریافت ترافیک

ساختار همه آن‌ها یکسان است:

پارامترنوع دادهتوضیحپیش‌فرض
enabledbooleanفعال‌سازی پروب
portstring یا int(الزامی در صورت عدم وجود command) شماره یا نام پورتی که باید بررسی شود
pathstringمسیر درون HTTP برای بررسی
commandlist از string(الزامی در صورت عدم وجود path) لیست دستورات برای بررسی وضعیت
httpHeadersmappingسربرگ‌های HTTP برای درخواست پروب
initialDelaySecondsint مثبتتأخیر اولیه پیش از شروع بررسی
periodSecondsint مثبتفاصله زمانی بین هر بررسی
timeoutSecondsint مثبتحداکثر زمان انتظار برای پاسخ
successThresholdint مثبتحداقل تعداد موفقیت متوالی برای موفق در نظر گرفتن پروب (حداقل مقدار: 1)
failureThresholdint مثبتتعداد تلاش‌های ناموفق پیش از در نظر گرفتن خطا (حداقل مقدار: 1)

منابع کانتینر (Container Resources)

بخش: container.resources

با استفاده از این پارامترها می‌توان محدودیت‌ها و درخواست‌های منابع (CPU و RAM) را برای هر کانتینر تعریف کرد. با تعریف request منابع به صورت ذخیره می‌باشند و در صورتی که limit تعریف شود و منابع مورد استفاده از این محدودیت عبور کنند، کانتینر از کار می‌افتد.

پارامترنوع دادهتوضیحپیش‌فرض
requests.cpuint یا stringمیزان CPU رزروشده برای کانتینر (مثلاً 500m یا 1)
requests.memoryint یا stringمقدار RAM موردنیاز برای کانتینر (مثلاً 512Mi یا 2Gi)
limits.cpuint یا stringحداکثر CPU مجاز برای کانتینر؛ در صورت تجاوز، عملکرد کانتینر کاهش می‌یابد
limits.memoryint یا stringحداکثر RAM مجاز برای کانتینر؛ در صورت تجاوز، کانتینر کشته می‌شود و پاد ممکن است حذف شود

پورت‌های کانتینر (Container Ports)

بخش: container.ports

این قسمت برای تعریف پورت‌های در دسترس در کانتینر و تولید منابع مرتبط مثل Service، Ingress و ServiceMonitor استفاده می‌شود. کلیدها شماره پورت (مثلاً 8080 یا 16049/udp) و مقدار می‌تواند رشته (نام پورت)، null یا یک آبجکت با تنظیمات زیر باشد:

پارامترنوع دادهتوضیحپیش‌فرض
enabledbooleanفعال‌سازی این پورت
namestringنام پورت
protocolstringنوع پروتکل: TCP یا UDP
numberint مثبتشماره پورت (به‌صورت اختیاری؛ در صورت عدم وجود از کلید استفاده می‌شود)کلید این آبجکت
nodePortint مثبتاگر تنظیم شود، NodePort ساخته می‌شود و ترافیک مستقیم از نود به این پورت هدایت می‌شود
servicePortint مثبتاگر Ingress تعریف شود، باید پورت سرویس مشخص شود
scrapePathstringمسیر مورد استفاده‌ی Prometheus برای اسکرپ (مانند /metrics)
scrapeTimeoutint مثبتزمان‌انتظار Prometheus برای اسکرپ
scrapeIntervalint مثبتفاصله بین هر بار اسکرپ توسط Prometheus
scrapeExtraPropertiesobjectتنظیمات اضافه برای بخش endpoint در ServiceMonitor

چرخه‌ی حیات کانتینر (Container Lifecycle)

بخش: container.lifecycle

در این بخش می‌توان رفتار سیستم هنگام رویدادهای آغاز و پایان اجرای کانتینر را تعریف کرد. این رویدادها شامل:

  • postStart: بلافاصله پس از ایجاد کانتینر اجرا می‌شود.
  • preStop: بلافاصله پیش از حذف کانتینر (به‌دلیل API یا event مدیریتی) اجرا می‌شود.

در هر یک از این مراحل، تنها یکی از روش‌های exec (اجرای دستور)، httpGet (درخواست HTTP)، یا tcpSocket (ارتباط TCP) قابل استفاده است.

پارامترنوعتوضیحپیش‌فرض
postStartobjectدستور یا عملیات بعد از اجرای کانتینر. ساختار مشابه preStop دارد.
preStopobjectدستور یا عملیات قبل از توقف کانتینر
preStop.execobjectاجرای یک دستور خاص داخل کانتینر
preStop.exec.commandlist[string]لیست دستورات (مثلاً: ["sh", "-c", "echo hello"])
preStop.httpGetobjectارسال درخواست HTTP قبل از توقف
preStop.httpGet.portint یا string(الزامی) شماره یا نام پورت مقصد در کانتینر
preStop.httpGet.hoststringنام میزبان؛ پیش‌فرض IP پاد. بهتر است از Host در httpHeaders استفاده شود
preStop.httpGet.schemastringپروتکل ارتباط (مثلاً: HTTP یا HTTPS)HTTP
preStop.tcpSocketobjectاجرای بررسی اتصال TCP
preStop.tcpSocket.portint یا stringشماره یا نام پورت
preStop.tcpSocket.hoststringنام میزبان؛ پیش‌فرض IP پاد

تنظیمات امنیتی کانتینر (Container securityContext)

بخش: container.securityContext

تنظیمات امنیتی در سطح کانتینر. این پارامترها دسترسی‌ها، قابلیت ارتقاء سطح دسترسی، و ویژگی‌های سیستم‌عاملی کانتینر را کنترل می‌کنند. اگر تنظیمی هم در سطح pod و هم container انجام شود، مقدار container اولویت دارد.

پارامترنوعتوضیحپیش‌فرض
runAsUserint مثبتUID که فرایند اصلی کانتینر با آن اجرا می‌شود
runAsGroupint مثبتGID که فرایند اصلی کانتینر با آن اجرا می‌شود
runAsNonRootbooleanاطمینان از اجرای کانتینر توسط کاربر غیر ریشه (non-root)
privilegedbooleanاگر true باشد، کانتینر با سطح دسترسی کامل (شبیه root در هاست) اجرا می‌شود
allowPrivilegeEscalationbooleanاگر فعال باشد، فرایند می‌تواند سطح دسترسی خود را افزایش دهد
readOnlyRootFilesystembooleanاگر true باشد، فایل‌سیستم root فقط خواندنی خواهد بود
capabilitiesobjectقابلیت‌هایی که باید اضافه یا حذف شوند
capabilities.addlist[string]لیست قابلیت‌هایی که باید به کانتینر افزوده شوند (مثلاً: NET_ADMIN)
capabilities.droplist[string]لیست قابلیت‌هایی که باید حذف شوند

📎 برای پارامترهای بیشتر، از دستور زیر در Kubernetes استفاده کنید:

kubectl explain pod.spec.containers.securityContext

قالب Volume برای StatefulSet

بخش: statefulset.volumeClaimTemplates

برای هر پاد در یک StatefulSet، می‌توان به‌صورت خودکار یک Persistent Volume Claim (PVC) مجزا ایجاد کرد. این تعریف باید به‌صورت mapping باشد که کلید آن نام Volume و مقدار آن تنظیمات زیر است:

پارامترنوعتوضیحپیش‌فرض
enabledbooleanفعال‌سازی این قالب Volume برای StatefulSettrue
sizeint یا string(الزامی) حجم PVC (مثلاً 2Gi یا 1024)
accessModestring(الزامی) نوع دسترسی به Volume: یکی از ReadWriteOnce، ReadOnlyMany
storageClassstringکلاس ذخیره‌سازی (StorageClass) مورد نظر برای PVC

عبارات منظم قابل استفاده (Common Regexes)

Regex nameRegexاسناد
k8s.label.key^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?([A-Za-z0-9][A-Za-z0-9_.-]*)?[A-Za-z0-9]$link
k8s.label.value^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?$link
k8s.annotation.key^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?([A-Za-z0-9][A-Za-z0-9_.-]*)?[A-Za-z0-9]$link
k8s.annotation.valuestringlink

نمونه ها

در این بخش چندین مثال ببینید تا با جنبه‌های مختلف پیاده‌سازی این چارت بیشتر آشنا شوید.

Hello World Sample

#!/usr/bin/env -S helm template hello-world-sample genpack -f
gonbad:
  workloads:
    web:
      kind: deployment
      replicaCount: 1
      containers:
        web:
          image:
            registry: docker.io # optional, defaults to ''
            repository: tutum/hello-world
            tag: latest # optional, defaults to latest
          ports:
            80:
              name: http
              scrapePath: /metrics # optional, will create a ServiceMonitor object

  ingresses:
    web:
      workloadName: web
      servicePort: http
      hosts:
        - host: hello-world.example.dev

Volume Sample

#!/usr/bin/env -S helm template volume-sample genpack -f
gonbad:
  workloads:
    web:
      kind: deployment
      replicaCount: 1
      containers:
        web:
          image:
            repository: nginx
          ports:
            80: http
          volumeMounts:
            - name: www-vol
              mountPath: /var/lib/nginx/sites/default/
            - name: existing-pvc-vol
              mountPath: /var/lib/nginx/sites/another/
            - name: config-vol
              mountPath: /etc/nginx/

  ingresses:
    web:
      workloadName: web
      servicePort: http
      hosts:
        - host: example.dev

  volumes:
    www-vol:
      type: persistentVolumeClaim
      size: 10Gi
      accessMode: ReadWriteOnce
      storageClass: zfs-hdd

    existing-pvc-vol:
      type: existingPVC
      name: pvc-fullname
      readOnly: false

    config-vol:
      type: configMap
      name: nginx-configs

NodePort Sample

#!/usr/bin/env -S helm template nodeport-sample genpack -f
gonbad:
  workloads:
    nginx:
      kind: deployment
      service:
        type: NodePort
      containers:
        nginx:
          image:
            repository: nginx
          ports:
            80:
              name: http
              nodePort: 30080
            443:
              name: https
              nodePort: 30443

    coredns:
      kind: deployment
      service:
        type: NodePort
      containers:
        coredns:
          image:
            repository: coredns
          ports:
            53/tcp:
              nodePort: 30053
            53/udp:
              nodePort: 30053

ExternalServices Sample

#!/usr/bin/env -S helm template external-service-sample genpack -f
gonbad:
  externalServices:
    kuma:
      externalIPs:
        - 1.2.3.4
      ports:
        443:
          enabled: true
          name: https
          scrapePath: /metrics