لوکی - جمع آوری سیاههها با استفاده از رویکرد پرومتئوس

درود، خابرووی ها! در انتظار شروع ثبت نام جدید برای دوره "روش ها و ابزارهای DevOps" ترجمه ای از مطالب جالب را برای شما آماده کرد.

این مقاله معرفی مختصری از لوکی است. پروژه لوکی توسط Grafana پشتیبانی می شود و با هدف جمع آوری متمرکز لاگ ها (از سرورها یا کانتینرها) است.

الهام بخش اصلی لوکی بود تیتان فرزند پاپتوس با ایده به کارگیری رویکردهای او در مدیریت لاگ:

  • استفاده از برچسب ها برای ذخیره داده ها
  • مصرف کم منابع

ما به اصول پرومتئوس باز می گردیم و نمونه هایی از کاربرد آن در زمینه کوبرنتس را بیان می کنیم.

چند کلمه در مورد پرومتئوس

برای درک کامل نحوه عملکرد لوکی، مهم است که یک قدم به عقب بردارید و کمی پرومتئوس را دوباره ببینید.

یکی از ویژگی های متمایز Prometheus استخراج معیارها از نقاط جمع آوری (از طریق صادرکنندگان) و ذخیره آنها در TSDB (پایگاه داده سری زمانی، پایگاه داده سری زمانی) با افزودن ابرداده در قالب برچسب است.

چرا لازم است

اخیراً Prometheus به استاندارد واقعی در دنیای کانتینرها و Kubernetes تبدیل شده است: نصب آن بسیار ساده است و یک خوشه Kubernetes در ابتدا یک نقطه پایانی برای Prometheus دارد. Prometheus همچنین می‌تواند معیارها را از برنامه‌های مستقر در یک ظرف استخراج کند و در عین حال برچسب‌های خاصی را حفظ کند. بنابراین، نظارت بر برنامه ها بسیار آسان است.

متأسفانه هنوز راه حلی برای مدیریت لاگ وجود ندارد و باید برای خود راه حلی پیدا کنید:

  • سرویس ابری مدیریت شده برای متمرکز کردن گزارش‌ها (AWS، Azure یا Google)
  • سرویس نظارت "نظارت به عنوان یک سرویس" (به عنوان مثال، Datadog)
  • ایجاد سرویس جمع آوری گزارش خود

برای گزینه سوم، من به طور سنتی از Elasticsearch استفاده می کنم، علیرغم این واقعیت که همیشه از آن راضی نبودم (مخصوصاً سنگینی و پیچیدگی راه اندازی آن).

Loki به گونه ای طراحی شده است که اجرای آن بر اساس اصول زیر آسان باشد:

  • برای شروع آسان باشد
  • منابع کمی را مصرف کند
  • به طور مستقل بدون هیچ گونه تعمیر و نگهداری خاصی کار کنید
  • به عنوان یک افزونه برای Prometheus برای کمک به بررسی اشکالات خدمت می کند

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

بررسی حادثه

برای درک بهتر اینکه چرا Loki به نمایه سازی نیاز ندارد، اجازه دهید به روش بررسی حادثه که توسط توسعه دهندگان Loki استفاده می شود، برگردیم:

لوکی - جمع آوری سیاههها با استفاده از رویکرد پرومتئوس
1 هشدار ← 2 داشبورد ← 3 پرس و جو Adhoc ← 4 تجمیع گزارش ← 5 ردیابی توزیع شده ← 6 رفع مشکل!
(1 اخطار ← 2 داشبورد ← 3 پرس و جو Adhoc ← 4 تجمیع گزارش ← 5 ردیابی توزیع شده ← 6 رفع مشکل!)

ایده این است که ما نوعی هشدار دریافت می کنیم (Slack Notification، SMS و غیره) و پس از آن:

  • به داشبورد گرافانا نگاه کنید
  • به معیارهای خدمات نگاه کنید (به عنوان مثال، در Prometheus)
  • به ورودی های گزارش نگاه کنید (به عنوان مثال، در Elasticsearch)
  • شاید نگاهی به آثار توزیع شده (Jaeger، Zipkin و غیره) بیندازید.
  • و در نهایت مشکل اصلی را برطرف کنید.

در اینجا، در مورد پشته Grafana + Prometheus + Elasticsearch + Zipkin، باید از چهار ابزار مختلف استفاده کنید. برای صرفه جویی در زمان، خوب است که بتوانید تمام این مراحل را با یک ابزار انجام دهید: Grafana. شایان ذکر است که این رویکرد تحقیق از نسخه 6 در Grafana پیاده سازی شده است. بنابراین دسترسی مستقیم به داده های Prometheus از Grafana امکان پذیر می شود.

لوکی - جمع آوری سیاههها با استفاده از رویکرد پرومتئوس
تقسیم صفحه کاوشگر بین پرومتئوس و لوکی

از این صفحه، می توانید گزارش های مربوط به معیارهای Prometheus را در Loki با استفاده از مفهوم تقسیم صفحه مشاهده کنید. از نسخه 6.5، Grafana به شما امکان می دهد شناسه ردیابی را در ورودی های Loki log تجزیه کنید تا پیوندهای ابزارهای ردیابی توزیع شده مورد علاقه خود (Jaeger) را دنبال کنید.

تست محلی لوکی

ساده ترین راه برای آزمایش Loki به صورت محلی استفاده از docker-compose است. فایل docker-compose در مخزن Loki قرار دارد. با دستور زیر می توانید مخزن را دریافت کنید git:

$ git clone https://github.com/grafana/loki.git

سپس باید به دایرکتوری تولید تغییر دهید:

$ cd production

پس از آن، می توانید آخرین تصاویر Docker را دریافت کنید:

$ docker-compose pull

در نهایت، پشته Loki با دستور زیر شروع می شود:

$ docker-compose up

معماری لوکی

در اینجا یک نمودار کوچک با معماری لوکی آمده است:

لوکی - جمع آوری سیاههها با استفاده از رویکرد پرومتئوس
اصول معماری لوکی

سرویس گیرنده وب برنامه ها را روی سرور اجرا می کند، Promtail گزارش ها را جمع آوری می کند و آنها را به Loki می فرستد، سرویس گیرنده وب نیز ابرداده ها را برای Loki ارسال می کند. لوکی همه چیز را جمع می کند و به گرافانا می دهد.
لوکی در حال دویدن است. برای مشاهده اجزای موجود، دستور زیر را اجرا کنید:

$ docker ps

در مورد یک Docker تازه نصب شده، دستور باید خروجی زیر را برگرداند:

IMAGE               PORTS                  NAMES
grafana/promtail:                          production_promtail_1
grafana/grafana: m  0.0.0.0:3000->3000/tcp production_grafana_1
grafana/loki: late  80/tcp,0.0.0.0:3100... production_loki_1

ما اجزای زیر را می بینیم:

  • Promtail: عاملی که مسئول متمرکز کردن لاگ ها است
  • Grafana: ابزار معروف داشبورد
  • Loki: شبح تمرکز داده ها

به عنوان بخشی از یک زیرساخت کلاسیک (به عنوان مثال، بر اساس ماشین های مجازی)، عامل Promtail باید در هر ماشین مستقر شود. Grafana و Loki را می توان روی یک دستگاه نصب کرد.

استقرار در Kubernetes

نصب کامپوننت های Loki در Kubernetes به صورت زیر خواهد بود:

  • daemonSet برای استقرار عامل Promtail بر روی هر یک از ماشین های موجود در خوشه سرور
  • استقرار لوکی
  • و آخرین مورد استقرار Grafana است.

خوشبختانه، Loki به عنوان یک بسته Helm در دسترس است که استقرار آن را آسان می کند.

نصب از طریق Heml

شما باید از قبل Heml را نصب کرده باشید. می توان آن را از مخزن GitHub پروژه دانلود کرد. با استخراج آرشیو مناسب برای معماری شما و افزودن فرمان به آن نصب می شود $PATH.

توجه: نسخه 3.0.0 Helm اخیرا منتشر شده است. از آنجایی که تغییرات زیادی در آن ایجاد شده است، به خواننده توصیه می شود قبل از شروع استفاده از آن کمی صبر کند..

افزودن منبع برای Helm

اولین مرحله اضافه کردن مخزن "loki" با دستور زیر است:

$ helm add loki https://grafana.github.io/loki/charts

پس از آن، می توانید بسته هایی با نام "loki" را جستجو کنید:

$ helm search loki

یافته ها:

loki/loki       0.17.2 v0.4.0 Loki: like Prometheus, but for logs.
loki/loki-stack 0.19.1 v0.4.0 Loki: like Prometheus, but for logs.
loki/fluent-bit 0.0.2  v0.0.1 Uses fluent-bit Loki go plugin for...
loki/promtail   0.13.1 v0.4.0 Responsible for gathering logs and...

این بسته ها دارای ویژگی های زیر هستند:

  • بسته لوکی/لوکی فقط با سرور Loki مطابقت دارد
  • بسته loki/fluent-bit به شما این امکان را می دهد که DaemonSet را با استفاده از fluent-bin برای جمع آوری لاگ ها به جای Promtail مستقر کنید
  • بسته loki/promtail حاوی یک عامل جمع آوری گزارش است
  • بسته loki/loki-stack، به شما امکان می دهد فورا Loki را همراه با Promtail مستقر کنید.

در حال نصب Loki

برای استقرار Loki در Kubernetes، دستور زیر را در فضای نام "مانیتورینگ" اجرا کنید:

$ helm upgrade --install loki loki/loki-stack --namespace monitoring

برای ذخیره در دیسک، گزینه را اضافه کنید --set loki.persistence.enabled = true:

$ helm upgrade --install loki loki/loki-stack 
              --namespace monitoring 
              --set loki.persistence.enabled=true

توجه: اگر می خواهید Grafana را همزمان اجرا کنید، پارامتر را اضافه کنید --set grafana.enabled = true

هنگامی که این دستور را اجرا می کنید، باید خروجی زیر را دریافت کنید:

LAST DEPLOYED: Tue Nov 19 15:56:54 2019
NAMESPACE: monitoring
STATUS: DEPLOYED
RESOURCES:
==> v1/ClusterRole
NAME AGE
loki-promtail-clusterrole 189d
…
NOTES:
The Loki stack has been deployed to your cluster. Loki can now be added as a datasource in Grafana.
See <a href="http://docs.grafana.org/features/datasources/loki/">http://docs.grafana.org/features/datasources/loki/</a> for more details.

با نگاهی به وضعیت غلاف ها در فضای نام "مانیتورینگ"، می بینیم که همه چیز مستقر شده است:

$ kubectl -n monitoring get pods -l release=loki

یافته ها:

NAME                 READY  STATUS   RESTARTS  AGE
loki-0               1/1    Running  0         147m
loki-promtail-9zjvc  1/1    Running  0         3h25m
loki-promtail-f6brf  1/1    Running  0         11h
loki-promtail-hdcj7  1/1    Running  0         3h23m
loki-promtail-jbqhc  1/1    Running  0         11h
loki-promtail-mj642  1/1    Running  0         62m
loki-promtail-nm64g  1/1    Running  0         24m

همه غلاف ها در حال اجرا هستند. حالا نوبت انجام چند تست است!

اتصال به Grafana

برای اتصال به Grafana تحت Kubernetes، باید یک تونل به غلاف آن باز کنید. دستور زیر برای باز کردن پورت 3000 برای Grafana pod است:

$ kubectl -n port-forward monitoring svc/loki-grafana 3000:80

نکته مهم دیگر نیاز به بازیابی پسورد مدیر Grafana است. رمز عبور مخفی نگه داشته می شود loki-grafana در زمینه .data.admin-user با فرمت base64

برای بازیابی آن باید دستور زیر را اجرا کنید:

$ kubectl -n monitoring get secret loki-grafana 
 --template '{{index .data "admin-password" | base64decode}}'; echo

از این رمز عبور همراه با حساب پیش فرض مدیر (admin) استفاده کنید.

تعریف منبع داده Loki در Grafana

اول از همه، مطمئن شوید که منبع داده Loki (پیکربندی / منبع داده) ایجاد شده است.
در اینجا یک مثال است:

لوکی - جمع آوری سیاههها با استفاده از رویکرد پرومتئوس
نمونه ای از راه اندازی یک منبع داده برای Loki

با کلیک بر روی "تست" می توانید اتصال با Loki را آزمایش کنید.

درخواست از لوکی

اکنون به Grafana بروید و به بخش "Explore" بروید. هنگام دریافت گزارش‌ها از کانتینرها، لوکی متادیتا را از Kubernetes اضافه می‌کند. بنابراین، مشاهده سیاهههای مربوط به یک ظرف خاص امکان پذیر می شود.

به عنوان مثال، برای انتخاب سیاهههای مربوط به کانتینر promtail، می توانید از پرس و جو زیر استفاده کنید: {container_name = "promtail"}.
فراموش نکنید که منبع داده Loki را نیز در اینجا انتخاب کنید.

این پرس و جو فعالیت کانتینر را به صورت زیر برمی گرداند:

لوکی - جمع آوری سیاههها با استفاده از رویکرد پرومتئوس
نتیجه پرس و جو در Grafana

اضافه شدن به داشبورد

با شروع Grafana 6.4، امکان قرار دادن اطلاعات گزارش به طور مستقیم بر روی داشبورد وجود دارد. پس از آن، کاربر می‌تواند به سرعت بین تعداد درخواست‌های سایت خود به ردیابی برنامه سوئیچ کند.

در زیر نمونه داشبوردی است که این تعامل را اجرا می کند:

لوکی - جمع آوری سیاههها با استفاده از رویکرد پرومتئوس
نمونه داشبورد با معیارهای پرومتئوس و سیاهههای مربوط به Loki

آینده لوکی

من استفاده از Loki را در ماه می/ژوئن با نسخه 0.1 شروع کردم. امروز نسخه 1 و حتی 1.1 و 1.2 منتشر شده است.

باید اعتراف کرد که نسخه 0.1 به اندازه کافی پایدار نبود. اما 0.3 قبلاً نشانه های واقعی بلوغ را نشان می داد و نسخه های بعدی (0.4 و سپس 1.0) فقط این تصور را تقویت کردند.

پس از 1.0.0، هیچ کس نمی تواند بهانه ای برای عدم استفاده از این ابزار فوق العاده داشته باشد.

بهبودهای بیشتر نباید در مورد Loki باشد، بلکه باید ادغام آن با Grafana عالی باشد. در واقع، Grafana 6.4 در حال حاضر ادغام خوبی با داشبورد دارد.

Grafana 6.5 که اخیراً منتشر شده است، با شناسایی خودکار محتویات گزارش‌ها در قالب JSON، این ادغام را بیشتر بهبود می‌بخشد.

ویدئوی زیر نمونه کوچکی از این مکانیسم را نشان می دهد:

لوکی - جمع آوری سیاههها با استفاده از رویکرد پرومتئوس
با استفاده از رشته های Loki ارائه شده در Grafana

برای مثال می توان از یکی از فیلدهای JSON استفاده کرد:

  • پیوند به یک ابزار خارجی
  • فیلتر کردن محتوای لاگ

برای مثال، می توانید روی traceId کلیک کنید تا به Zipkin یا Jaeger بروید.

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

منبع: www.habr.com