آموزش پیاده‌سازی Distributed Tracing با Jaeger روی Kubernetes

مقدمه

در معماری‌های مدرن مبتنی بر Microservices، یک درخواست کاربر معمولاً از چندین سرویس مختلف عبور می‌کند. زمانی که مشکلی در عملکرد سیستم یا تأخیر در پاسخ‌گویی به وجود می‌آید، پیدا کردن منبع اصلی مشکل می‌تواند بسیار دشوار باشد.

اینجاست که Distributed Tracing یا «ردیابی توزیع‌شده» وارد عمل می‌شود.

یکی از محبوب‌ترین ابزارهای متن‌باز برای این کار Jaeger است. Jaeger به شما کمک می‌کند مسیر کامل یک درخواست را در بین سرویس‌های مختلف مشاهده کرده و گلوگاه‌های عملکردی را شناسایی کنید.

در این مقاله با نحوه راه‌اندازی و استفاده از Jaeger در محیط Kubernetes آشنا می‌شویم.


Distributed Tracing چیست؟

Distributed Tracing روشی برای ردیابی یک درخواست در کل سیستم است.

فرض کنید کاربری سفارشی را در فروشگاه اینترنتی ثبت می‌کند:

User Request
     │
     ▼
API Gateway
     │
     ▼
User Service
     │
     ▼
Order Service
     │
     ▼
Payment Service
     │
     ▼
Notification Service

اگر یکی از این سرویس‌ها کند عمل کند، بدون ابزار ردیابی پیدا کردن علت مشکل زمان‌بر خواهد بود.

Distributed Tracing اطلاعات دقیقی از موارد زیر ارائه می‌دهد:

  • مدت زمان اجرای هر سرویس
  • مسیر کامل درخواست
  • خطاهای احتمالی
  • وابستگی بین سرویس‌ها
  • گلوگاه‌های عملکردی

Jaeger چیست؟

Jaeger یک پلتفرم متن‌باز برای Distributed Tracing است که توسط Uber توسعه داده شد و اکنون یکی از پروژه‌های رسمی CNCF محسوب می‌شود.

قابلیت‌های اصلی Jaeger:

  • مشاهده مسیر کامل درخواست‌ها
  • تحلیل زمان پاسخ سرویس‌ها
  • کشف Bottleneckها
  • مانیتورینگ معماری Microservice
  • پشتیبانی از OpenTelemetry
  • ادغام با Kubernetes

پیش‌نیازها

قبل از شروع باید موارد زیر را داشته باشید:

  • یک کلاستر Kubernetes
  • kubectl
  • Helm (اختیاری اما توصیه‌شده)
  • دسترسی مدیریتی به کلاستر

نصب Jaeger روی Kubernetes

ساده‌ترین روش استفاده از Helm است.

ابتدا ریپازیتوری Helm را اضافه کنید:

helm repo add jaegertracing https://jaegertracing.github.io/helm-charts

helm repo update

سپس Jaeger را نصب کنید:

helm install jaeger jaegertracing/jaeger

پس از نصب می‌توانید وضعیت Podها را بررسی کنید:

kubectl get pods

خروجی مشابه زیر خواهد بود:

NAME                      READY   STATUS
jaeger-0                  1/1     Running

نصب Jaeger Operator

در محیط‌های Production معمولاً از Jaeger Operator استفاده می‌شود.

ابتدا Operator را نصب کنید:

kubectl create namespace observability
kubectl apply -f https://github.com/jaegertracing/jaeger-operator/releases/download/v1.57.0/jaeger-operator.yaml

سپس یک نمونه Jaeger ایجاد کنید:

apiVersion: jaegertracing.io/v1
kind: Jaeger
metadata:
  name: jaeger
spec:
  strategy: allInOne

اعمال تنظیمات:

kubectl apply -f jaeger.yaml

دسترسی به رابط کاربری Jaeger

برای مشاهده داشبورد:

kubectl port-forward svc/jaeger-query 16686:16686

اکنون مرورگر را باز کرده و وارد آدرس زیر شوید:

http://localhost:16686

در این داشبورد می‌توانید تمام Traceها را مشاهده کنید.


Instrument کردن اپلیکیشن

نصب Jaeger به تنهایی کافی نیست.

برنامه شما باید Traceها را ارسال کند.

برای مثال در Node.js:

npm install jaeger-client

سپس:

const initTracer = require('jaeger-client').initTracer;

const config = {
  serviceName: 'user-service',
  sampler: {
    type: 'const',
    param: 1
  }
};

const tracer = initTracer(config);

هر درخواست ثبت‌شده به Jaeger ارسال خواهد شد.


استفاده از OpenTelemetry

امروزه بیشتر پروژه‌ها به جای کتابخانه اختصاصی Jaeger از OpenTelemetry استفاده می‌کنند.

مزایای OpenTelemetry:

  • استاندارد صنعتی
  • سازگاری با Jaeger
  • سازگاری با Prometheus
  • سازگاری با Grafana
  • پشتیبانی از چندین Backend

نمونه نصب:

npm install @opentelemetry/sdk-node

مشاهده Traceها

پس از ارسال داده‌ها، در داشبورد Jaeger می‌توانید:

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

user-service

مشاهده مدت زمان درخواست

Request Duration

مشاهده خطاها

Error Traces

بررسی وابستگی سرویس‌ها

Service Dependencies

معماری Jaeger

Jaeger از چند بخش اصلی تشکیل شده است:

Application
      │
      ▼
Agent
      │
      ▼
Collector
      │
      ▼
Storage
      │
      ▼
Query UI

Agent

دریافت Trace از سرویس‌ها

Collector

جمع‌آوری و پردازش داده‌ها

Storage

ذخیره اطلاعات در:

  • Elasticsearch
  • Cassandra
  • OpenSearch

Query

نمایش اطلاعات در داشبورد


استقرار Production

برای محیط عملیاتی بهتر است:

از Elasticsearch استفاده کنید

storage:
  type: elasticsearch

Replicaها را افزایش دهید

collector:
  replicas: 3

مانیتورینگ را فعال کنید

ادغام با:

  • Prometheus
  • Grafana

Sampling را تنظیم کنید

نمونه:

sampler:
  type: probabilistic
  param: 0.1

در این حالت فقط ۱۰٪ از درخواست‌ها ذخیره می‌شوند.


مزایای استفاده از Jaeger

  • عیب‌یابی سریع‌تر
  • شناسایی سرویس‌های کند
  • مشاهده وابستگی بین Microserviceها
  • تحلیل عملکرد سیستم
  • کاهش زمان رفع خطا
  • سازگاری کامل با Kubernetes

جمع‌بندی

در معماری‌های مبتنی بر Microservice، ردیابی مسیر درخواست‌ها اهمیت بسیار زیادی دارد. Jaeger یکی از قدرتمندترین ابزارهای Distributed Tracing است که به راحتی روی Kubernetes اجرا می‌شود و امکان مشاهده مسیر کامل درخواست‌ها، تحلیل عملکرد سرویس‌ها و شناسایی مشکلات را فراهم می‌کند.

اگر از Kubernetes و Microservice استفاده می‌کنید، پیاده‌سازی Jaeger می‌تواند دید بسیار دقیقی نسبت به رفتار سیستم در اختیار شما قرار دهد و فرآیند مانیتورینگ و عیب‌یابی را به شکل چشمگیری بهبود دهد.

 

 

از همراهی شما با پارمین کلود متشکریم.

Click to rate this post!
[Total: 0 Average: 0]

نظرات کاربران

دیدگاهی بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *