راه‌اندازی Observability با LGTM و Pyroscope، بخش ۱: پیش‌نیاز، یک Kubernetes ساده با k0s

در این مجموعه قدم‌به‌قدم یک سامانه‌ی کامل Observability می‌سازیم: با استک LGTM گرافانا (Loki برای لاگ، Grafana برای نمایش، Tempo برای ردیابی، Mimir برای متریک) به‌همراه Pyroscope برای پروفایلینگ پیوسته. یک اپلیکیشن ساده‌ی Django را به‌عنوان نمونه رصد می‌کنیم و همه‌ی اجزا را با روش GitOps و Argo CD مستقر می‌کنیم.

اما قبل از هر چیز به یک بستر نیاز داریم که این ابزارها روی آن اجرا شوند: یک cluster از Kubernetes. در این بخش، ساده‌ترین و سبک‌ترین راه برای داشتن یک Kubernetes آموزشی را انتخاب می‌کنیم: k0s.

در سراسر این مجموعه، منظور از «سرور» یک ماشین لینوکسی است که همه‌ی اجزا را روی آن نصب می‌کنیم؛ توصیه می‌شود برای این کار از یک ماشین مجازی استفاده کنید تا در صورت نیاز بتوانید آن را پاک کرده و از نو بسازید.

Kubernetes به زبان ساده

Kubernetes یک «ارکستراتور» برای کانتینرهاست؛ یعنی به‌جای مدیریت دستی کانتینرها، وضعیت مطلوب را به Kubernetes اعلام می‌کنید و آن را برقرار نگه می‌دارد. چند مفهوم پایه که در کل این مجموعه با آن‌ها کار داریم:

  • Node: یک ماشین (فیزیکی یا مجازی) که بار کاری روی آن اجرا می‌شود. در آزمایشگاه ما یک node داریم.
  • Pod: کوچک‌ترین واحد اجرا؛ یک یا چند کانتینر که کنار هم زندگی می‌کنند.
  • Deployment: می‌گوید چند نسخه (replica) از یک اپلیکیشن باید همیشه در حال اجرا باشد و اگر podی از بین رفت، جایگزینش می‌کند.
  • Service: یک آدرس ثابت داخل cluster که ترافیک را به pod های یک اپلیکیشن می‌رساند، حتی وقتی pod ها عوض می‌شوند.

چرا k0s؟

برای یادگیری، نصب‌های سنگین و چندسروری Kubernetes بیش از حد پیچیده‌اند. k0s یک توزیع سبک از Kubernetes است که در قالب یک فایل باینری واحد عرضه می‌شود؛ نه وابستگی پیچیده‌ای دارد و نه مراحل نصب طولانی. می‌توانیم آن را روی همان یک ماشین هم به‌عنوان master و هم به‌عنوان worker اجرا کنیم (حالت single-node) و در چند دقیقه یک cluster واقعی داشته باشیم.

پیش‌نیازها

یک ماشین مجازی با Ubuntu 24.04، حدود ۴ هسته پردازنده و ۸ تا ۱۲ گیگابایت رم، و اتصال به اینترنت. همین برای اجرای کل استک این مجموعه کافی است.

گام ۱: نصب k0s

ابتدا باینری k0s را دانلود می‌کنیم، سپس آن را در حالت controller تک‌گره نصب و اجرا می‌کنیم. گزینه‌ی --single یعنی همین یک ماشین هم نقش کنترل و هم نقش اجرای بار کاری را بر عهده می‌گیرد:

curl -sSLf https://get.k0s.sh | sudo sh
sudo k0s install controller --single
sudo k0s start

با دستور k0s status می‌توانید ببینید که سرویس بالا آمده و در حالت single-node است:

نصب k0s و بررسی وضعیت با k0s status
نصب k0s در چند خط. خروجی k0s status نشان می‌دهد نقش controller است، بار کاری روی همین گره اجرا می‌شود و حالت single-node فعال است.

گام ۲: بررسی cluster

k0s نسخه‌ای از kubectl (ابزار خط فرمان Kubernetes) را داخل خودش دارد. با آن وضعیت گره را می‌بینیم. کمی صبر کنید تا وضعیت گره به Ready برسد:

sudo k0s kubectl get nodes -o wide
گره cluster در وضعیت Ready
تنها گره‌ی ما در وضعیت Ready با نقش control-plane. آدرس داخلی و نسخه‌ی Kubernetes و runtime کانتینر (containerd) هم دیده می‌شود.

گام ۳: pod های سیستمی

Kubernetes خودش چند سرویس داخلی دارد که در namespace به نام kube-system اجرا می‌شوند؛ مثل CoreDNS (برای نام‌گذاری داخلی) و kube-proxy و شبکه‌ی cluster. با دستور زیر همه‌ی pod ها را در همه‌ی namespace ها می‌بینیم:

sudo k0s kubectl get pods -A
pod های سیستمی در وضعیت Running
سرویس‌های داخلی Kubernetes همگی در وضعیت Running هستند. وقتی این pod ها سالم باشند، cluster آماده‌ی اجرای اپلیکیشن‌های ماست.

گام ۴: اولین اپلیکیشن

برای اطمینان از درست کارکردن cluster، یک اپلیکیشن نمونه (وب‌سرور nginx) را مستقر می‌کنیم. یک Deployment می‌سازیم و با یک Service آن را در دسترس قرار می‌دهیم:

sudo k0s kubectl create deployment hello --image=nginx:stable
sudo k0s kubectl expose deployment hello --port=80
اولین Deployment و Pod و Service در حال اجرا
اولین اپلیکیشن ما: یک Deployment با یک نسخه (1/1)، pod آن در وضعیت Running، و یک Service با آدرس داخلی (ClusterIP) که ترافیک را به pod می‌رساند.

همین سه شیء ساده (Deployment، Pod، Service) الگوی پایه‌ی هر چیزی است که در بخش‌های بعد مستقر می‌کنیم؛ از اپلیکیشن Django گرفته تا خود ابزارهای Observability.

جمع‌بندی و بخش بعد

در این بخش یک Kubernetes واقعی اما سبک با k0s راه انداختیم، وضعیت آن را بررسی کردیم و اولین اپلیکیشن را مستقر کردیم. این بستر، پایه‌ی کل مجموعه است.

در بخش بعد، یک اپلیکیشن Django را کانتینری می‌کنیم و به‌جای دستورهای دستی، آن را با روش GitOps و Argo CD روی همین cluster مستقر می‌کنیم.

بخش‌های این مجموعه

← بازگشت به وبلاگ