تمرین‌های هلم (Helm) و نکات ضرروی آن

وقتی صحبت از مدیریت پیکربندی Kubernetes می‌شود، Helm یکی از ابزارهای کلیدی مورد استفاده بسیاری از سازمان‌ها است. این مطلب بخش‌های ساده اما ضروری از بهترین تمرین‌های هلم (Helm) و نکات ضرروی آن را که باید هنگام استفاده از آنها در پروژه‌های سازمانی خود بدانید، پوشش می‌دهد.

استفاده از کامیونیتی چارت

نیازی به نوشتن تک تک نمودارهای Helm از ابتدا نیست زیرا ما نمودارهای Helm رسمی و انجمنی زیادی داریم که از همه بهترین تمرین‌ها پیروی می‌کنند.
معمولا همه از این community charts به عنوان مرجع استفاده می‌کنند یا آنها را مستقیم برای مطابقت با نیازهای پروژه خود با رعایت دستورالعمل‌های امنیتی تغییر می‌دهند. این نمودارهای سفارشی سپس در یک رجیستری داخلی Helm (مانند JFrog، S3 و غیره) میزبانی می‌شوند.

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

برای توضیح بیشتر، از Prometheus Helm Chart به عنوان مثال استفاده خواهیم کرد.

درک SubCharts

فرض کنید چارت Prometheus Helm را نصب می‌کنید. این نمودار اجزای زیر را نصب خواهد کرد:

  • Prometheus Server
  • AlertmanagerKube State Metrics
  • Node Exporter
  • Pushgateway

با این حال، این چارت فقط شامل تمپلیت‌هایی برای Prometheus Server است.

برای سایر کامپوننت‌ها، مانند Alertmanager، Kube State Metrics، Node Exporter و Pushgateway، از چارت‌های وابستگی (subcharts) نصب می‌شوند.
اگر فایل Chart.yaml را بررسی کنید، وابستگی‌های چارت اضافه شده را در آنجا مشاهده خواهید کرد.

هلم

این بدان معناست که هنگام استفاده از نمودار در شبکه‌های داخلی پروژه، باید زیرچارت‌های استفاده شده به عنوان وابستگی (مثلا Alertmanager، Kube State Metrics، Node Exporter و غیره) را از مخازن مربوطه دانلود کنید.

پس از دانلود و بررسی این چارت‌های وابستگی (مثلا Alertmanager، Kube State Metrics)، آنها را به charts/ دایرکتوری نمودار اصلی خود منتقل کنید.

در مرحله بعد، فایل اصلی Chart.yaml را تغییر دهید تا وابستگی‌های خارجی حذف شوند و فقط به زیرنمودارهای محلی ارجاع داده شوند.

Public Registry Images

تمام کامیونتی هلم چارت‌ها به طور پیش‌فرض از public registry images استفاده می‌کنند.
با این حال، سازمان‌هایی که از رعایت دقیق امنیت پیروی می‌کنند، هرگز اجازه استفاده از ایمیج‌های عمومی را نمی‌دهند.
در عوض، شما باید ایمیج‌های خود را با استفاده از ایمیج‌های پایه تایید شده سازمان بسازید. دلیل این امر این است که حتی Docker images نیز باید چرخه‌های عمر وصله‌گذاری (patching lifecycles) را برای رعایت استانداردهای امنیتی طی کنند.
برخی از سازمان‌ها ممکن است اجازه استفاده از ایمیج پایه رسمی را بدهند، اما این ایمیج هم باید به طور منظم، معمولا ظرف ۱ تا ۳ ماه، بسته به چرخه عمر وصله‌گذاری، وصله شود.

شناسایی ایمیج‌های استفاده شده

اگر چارت Prometheus Helm را به عنوان مثال در نظر بگیرید، ممکن است فرض کنید که فقط کامپوننت‌های Prometheus را نصب می‌کند.

با این حال، اگر chart و subchart‌های آن را با دقت بررسی و ایمیج استفاده شده را لیست کنید، ایمیج‌های اضافی مانند ایمیج Config Reloader و موارد دیگر را خواهید یافت.

به عنوان مثال،

$ helm list-images prometheus-community/Prometheus

quay.io/prometheus-operator/prometheus-config-reloader:v0.73.2
quay.io/prometheus/alertmanager:v0.27.0
quay.io/prometheus/node-exporter:v1.8.0
quay.io/prometheus/prometheus:v2.52.0
quay.io/prometheus/pushgateway:v1.8.0
registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.12.0

اگر استقرار را از یک شبکه اشتراکی اجرا می‌کنید، ممکن است به دلیل محدودیت‌های شبکه یا سیاست‌های امنیتی به ایمیج‌های عمومی دسترسی نداشته باشید.
برای استقرار چارت در چنین محیط‌هایی، ابتدا باید این ایمیج‌های مورد نیاز را به رجیستری کانتینر خصوصی سازمان خود ارسال کنید.

اگر دستورالعمل‌های امنیتی به شما اجازه نمی‌دهد community images را مستقیم به رجیستری‌های خصوصی (Private) ارسال کنید، باید ایمیج‌های خود را با استفاده از Dockerfiles ارجاع شده توسط community charts بسازید.

تبدیل چارت به مانیفست YAML

اگر می‌خواهید همه چیز را در مورد Helm chart، مانند اشیاء ایجاد شده، مقادیر پیش‌فرض و پیکربندی‌های آنها، درک کنید، می‌توانید چارت را به مانیفست‌های YAML تبدیل کنید.
برای مثال، برای مشاهده تمام مانیفست‌های YAML نمودار Prometheus، می‌توانید چارت را با استفاده از دستور زیر به فایل‌های YAML ساده تبدیل کنید:

$ helm template prometheus-community prometheus-community/prometheus --output-dir prometheus-manifests

در اینجا ساختار درختی مانیفست آمده است که به شما ایده روشنی از تمام اشیاء مورد استفاده می‌دهد.

➜ prometheus-manifests tree
.
└── prometheus
├── charts
│ ├── alertmanager
│ │ └── templates
│ │ ├── configmap.yaml
│ │ ├── serviceaccount.yaml
│ │ ├── services.yaml
│ │ └── statefulset.yaml
│ ├── kube-state-metrics
│ │ └── templates
│ │ ├── clusterrolebinding.yaml
│ │ ├── deployment.yaml
│ │ ├── role.yaml
│ │ ├── service.yaml
│ │ └── serviceaccount.yaml
│ ├── prometheus-node-exporter
│ │ └── templates
│ │ ├── daemonset.yaml
│ │ ├── service.yaml
│ │ └── serviceaccount.yaml
│ └── prometheus-pushgateway
│ └── templates
│ ├── deployment.yaml
│ ├── service.yaml
│ └── serviceaccount.yaml
└── templates
├── clusterrole.yaml
├── clusterrolebinding.yaml
├── cm.yaml
├── deploy.yaml
├── pvc.yaml
├── service.yaml
└── serviceaccount.yaml

مقادیر پیش‌فرض

هنگام استقرار Helm chart ، درک مقادیر پیش‌فرض تعریف شده در فایل values.yaml مهم است.
اگر از کامیونیتی چارت برای پروژه خود استفاده می‌کنید، باید فایل values.yaml را برای برآورده کردن نیازهای خاص محیط خود سفارشی کنید.

به عنوان مثال،
می‌توانید با استفاده از دستور زیر، تمام مقادیر پیش‌فرض را از چارت در یک فایل values.yaml استخراج کنید:

helm show values prometheus-community/prometheus > values.yaml

معمولا پروژه‌ها برای محیط‌های توسعه، مرحله‌بندی و پروداکشن به پیکربندی‌های متفاوتی نیاز دارند.

با ایجاد فایل‌های values.yaml جداگانه برای هر محیط، می‌توانید تنظیمات را متناسب با نیازهای خاص سفارشی کنید.

به عنوان مثال،

• values-dev.yaml: از کپی‌های کوچک و بدون ماندگاری برای صرفه‌جویی در هزینه استفاده کنید.
• values-prod.yaml: از محدودیت‌های منابع بالا استفاده کنید و برای قابلیت اطمینان، پایداری را فعال کنید.

خرید سرور مجازی با منابع قابل انتخاب، تحویل آنی، و کنترل کامل روی سیستم‌عامل؛ همین حالا پلن مناسب خود را انتخاب کنید.

بهترین شیوه‌های Chart.yaml

از نسخه‌بندی معنایی (مثلا ۱.۰.۰) هم برای چارت (version) و هم برای اپلیکیشن (appVersion) استفاده کنید.

version: 1.2.3 # Chart version
appVersion: 4.5.6 # Application version

همچنین، توضیحات معنادار، کلمات کلیدی و فیلدهای maintainer را برای قابل کشف و قابل نگهداری کردن چارت خود اضافه کنید.

تست و اعتبارسنجی

برای گرفتن خطاها و اجرای قراردادها قبل از انتشار، helm lint را اجرا کنید.

helm lint ./my-chart

این دستور موارد زیر را بررسی می‌کند:

• فرمت مناسب YAML
• فیلدهای الزامی در Chart.yaml
• خطاهای رایج سینتکس تمپلیت
• نقض بهترین شیوه‌ها
قبل از استقرار در هر محیطی، از ویژگی dry-run برای تایید آنچه Helm واقعا تولید می‌کند استفاده کنید:

helm install my-release ./my-chart --dry-run --debug

نتیجه‌گیری

این‌ فقط نکات اساسی برای کمک به شما در صرفه‌جویی در زمان و پیروی از شیوه‌های خوب هنگام کار با کامیونیتی چارت Helm است.
شیوه‌های برتر بسیار بیشتری برای بررسی وجود دارد، اما آنها خارج از محدوده این مطلب هستند.