نسخه آنلاین در حال بارگذاری زمان... تهران: ۲۶°C
۲۸ کاربر آنلاین

PNo.30Light

نشریه تخصصی هوش مصنوعی، سیستم‌های سرور و مهندسی داده

تازه ترین‌ها
زیرساخت و سرور
زمان مطالعه: ۲۴ دقیقه ۰ بازدید

Linkerd: Service Mesh فوق‌سبک با Rust — راهنمای کامل

نویسنده: تحریریه فنی P30Light
Linkerd: Service Mesh فوق‌سبک با Rust — راهنمای کامل
✦ خلاصه نکات کلیدی مقاله
  • Linkerd = ultralight service mesh — sidecar Rust (linkerd2-proxy)، نه Envoy؛ سادگی به‌جای پیچیدگی.
  • mTLS، observability و reliability بدون تغییر کد — inject با annotation.
  • CNCF Graduated (ژوئیه ۲۰۲۱) — اولین service mesh Graduated؛ Gateway API برای east-west، نه ingress جایگزین.

Service mesh قول می‌دهد امنیت، مشاهده‌پذیری و reliability بین سرویس‌ها — بدون دست زدن به کد. در عمل خیلی تیم‌ها با پیچیدگی و سنگینی mesh کنار می‌کشند.

Linkerd شعارش را صریح می‌گوید:

Service mesh without the mess — security, observability, and reliability without the complexity or bloat of other meshes.

۱۰۰٪ open source، CNCF Graduated، و تنها service mesh نوشته‌شده با Rust در این مقیاس. سازنده: Buoyant (۲۰۱۶). اولین service mesh که به Graduated رسید — ۲۸ ژوئیه ۲۰۲۱.

نسخه‌های docs تا 2.20 (rate-limit-aware load balancing، مصرف حافظه کمتر، متریک بهتر).


مشکل: mesh سنگین در برابر نیاز واقعی

Istio / Envoy-sidecar سنگین:
  قابلیت زیاد → ops زیاد، footprint بیشتر

بدون mesh:
  mTLS و retry و golden metrics را خودتان می‌نویسید

Linkerd:
  micro-proxy فوق‌سبک کنار هر Pod
  zero-config mTLS + metrics + retries/timeouts
معیارIstioCilium meshLinkerd
Data planeEnvoyeBPF ± Envoylinkerd2-proxy (Rust)
تمرکزfeature-richnetwork + securityساده و ultralight
mTLS✅ خودکار
تغییر کد اپ
Ingress داخلیGateway/IngressGateway❌ — با Contour/EG ترکیب کنید
CNCF mesh Graduated اولGraduated (CNI)✅ ۲۰۲۱

Linkerd عمداً عمومی‌ترین proxy جهان را انتخاب نکرد؛ یک micro-proxy مخصوص mesh ساخت — جزئیات در Why Linkerd doesn’t use Envoy.


Linkerd چیست؟

طبق Overview:

  • service mesh برای Kubernetes
  • runtime debugging، observability، reliability، security
  • بدون تغییر کد application
  • دو جزء: control plane + data plane (meshing / injecting)

Site: linkerd.io
Docs: linkerd.io/docs
Proxy: github.com/linkerd/linkerd2-proxy
Org: github.com/linkerd

License: Apache 2.0
Enterprise / support: اکوسیستم Buoyant


تاریخچه و CNCF

تاریخرویداد
۲۰۱۶ایجاد توسط Buoyant (Linkerd 1.x روی JVM/Finagle)
۲۳ ژانویه ۲۰۱۷ورود به CNCF (از اولین پروژه‌های Sandbox/Inception)
۶ آوریل ۲۰۱۸Incubating
Linkerd 2.xبازنویسی برای Kubernetes؛ proxy به Rust
۲۸ ژوئیه ۲۰۲۱CNCF Graduated — اولین service mesh Graduated
۲.۱۴+تمرکز روی Gateway API برای config
۲.۲۰LB آگاه از rate-limit، memory کمتر

Adopters شناخته‌شده در اعلام Graduated: Microsoft، Nordstrom، Expedia، JPMC و دیگران.


معماری: Control Plane و Data Plane

┌─────────────────────────────────────────┐
│ Control plane (namespace linkerd)       │
│  destination · identity · proxy-injector│
└───────────────┬─────────────────────────┘
                │ gRPC / policy / certs
     ┌──────────┼──────────┐
     ▼          ▼          ▼
  Pod+proxy  Pod+proxy  Pod+proxy
  (data plane: linkerd2-proxy)

Data plane — linkerd2-proxy

  • sidecar (از ۲.۲۰ اغلب به‌صورت native sidecar: init با restartPolicy: Always)
  • نوشته‌شده با Rust — حافظه امن‌تر، footprint کوچک
  • transparent proxy برای HTTP، HTTP/2، TCP
  • WebSocket، mTLS خودکار، LB مبتنی بر latency
  • متریک Prometheus برای HTTP و TCP
  • tap برای تشخیص on-demand

linkerd-init: با iptables ترافیک TCP را از/به proxy می‌فرستد (مگر Linkerd CNI plugin فعال باشد).

Control plane — سه هسته

سرویسنقش
destinationservice discovery برای proxyها — endpointها، policy، hintهای routing
identityCA داخلی — صدور هویت mTLS به هر proxy (SPIFFE-style)
proxy-injectorMutating Admission Webhook — inject خودکار sidecar

همه proxyها به destination وصل می‌مانند؛ identity گواهی را می‌چرخاند؛ injector هنگام create شدن Pod کار می‌کند.


Proxy injection

با annotation روی namespace یا workload:

annotations:
  linkerd.io/inject: enabled

جریان:

  1. API server → webhook injector
  2. اگر injectable: اضافه شدن linkerd-init + linkerd-proxy
  3. از kube-system و cert-manager به‌طور پیش‌فرض inject نمی‌شود (برای جلوگیری از وابستگی دایره‌ای)

غیرفعال‌سازی موردی:

linkerd.io/inject: disabled

CLI:

linkerd inject deployment.yml | kubectl apply -f -
# یا فقط annotation:
kubectl annotate ns apps linkerd.io/inject=enabled

سه ستون ارزش

۱. Security — mTLS

  • رمزنگاری در مسیر بین Podهای meshed بدون config دستی cert
  • identity از control plane
  • Authorization policy (با Server + HTTPRoute/GRPCRoute و policy CRDها)

مکمل cert-manager برای certهای north-south / Ingress؛ east-west را Linkerd identity پوشش می‌دهد.

۲. Observability

  • golden metrics: success rate، RPS، latency
  • بدون instrument کردن کد
  • Prometheus scrape از proxyها
  • linkerd viz / dashboard و tap برای دیدن زنده درخواست‌ها

با Fluentd / Fluent Bit می‌توان access/telemetry را به SIEM فرستاد؛ با Falco رفتار syscall جدا مانیتور می‌شود.

۳. Reliability

  • latency-aware load balancing
  • retries و timeouts (از طریق Gateway API routes)
  • blue/green و traffic split
  • در ۲.۲۰: rate-limit-aware LB برای رفتار بهتر زیر فشار

Gateway API — مهم: mesh نه Ingress

Linkerd کنترلر Ingress/Gateway شمال–جنوب ندارد. اگر Gateway بسازید و انتظار IP عمومی از Linkerd داشته باشید، اتفاقی نمی‌افتد.

الگوی صحیح:

Internet
   → [Contour](/blog/contour-kubernetes-ingress-envoy-guide/) / Envoy Gateway / NGINX
   → Services داخل cluster
   → Linkerd proxies (east-west mTLS, retries, policy)

برای داخل mesh، Linkerd از انواع استاندارد Gateway API استفاده می‌کند:

نوعکاربرد
HTTPRouteپارامتر کردن درخواست HTTP — routing، timeout، …
GRPCRouteهمین برای gRPC

توسعهٔ ویژگی‌های جدید روی این انواع متمرکز است. ServiceProfiles و HTTPRoute قدیمی policy.linkerd.io هنوز کار می‌کنند اما مسیر آینده Gateway API استاندارد است.

نکته عملی: برای policy داخل mesh، parentRefs اغلب به منابع Linkerd مثل Server (policy.linkerd.io) اشاره می‌کند — نه لزوماً به Gateway لبه. قاطی کردن این دو مدل باعث می‌شود edge route شود ولی timeout/auth mesh اعمال نشود.

سازگاری نسخه Gateway API با Linkerd در جدول docs رسمی (مثلاً ۲.۱۸–۲.۲۰ با HTTPRoute/GRPCRoute v1) آمده است.


نصب

پیش‌نیاز

  • Kubernetes cluster
  • مجوز cluster-admin برای نصب اولیه
  • (توصیه) بررسی با linkerd check --pre

CLI

# نصب CLI — روش روز را از linkerd.io/releases بگیرید
curl --proto '=https' --tlsv1.2 -sSfL https://run.linkerd.io/install | sh

linkerd version
linkerd check --pre

Control plane

linkerd install --crds | kubectl apply -f -
linkerd install | kubectl apply -f -
linkerd check

Viz (مشاهده‌پذیری — اختیاری ولی رایج)

linkerd viz install | kubectl apply -f -
linkerd viz check
linkerd viz dashboard

Mesh کردن اپ

kubectl create ns demo
kubectl annotate ns demo linkerd.io/inject=enabled
# deploy apps در demo — Podها proxy می‌گیرند
linkerd viz edges -n demo

قابلیت‌های proxy (خلاصه)

از linkerd2-proxy:

  • transparent proxying HTTP / HTTP/2 / TCP
  • mTLS خودکار
  • L7 LB با آگاهی از latency؛ L4 برای غیر-HTTP
  • متریک Prometheus
  • WebSocket
  • discovery از DNS و Destination gRPC API

Opaque ports برای پروتکل‌هایی که نباید L7 parse شوند قابل تنظیم‌اند.


مقایسه با همسایه‌ها

نیازانتخاب
Mesh ساده، ultralight، RustLinkerd
Mesh feature-max با EnvoyIstio
eBPF network + optional meshCilium
North-south Ingress روی EnvoyContour / Envoy Gateway
Universal L7 engineEnvoy
App building blocksDapr

Linkerd و Contour/Envoy Gateway مکملاند: یکی east-west، یکی north-south.


امنیت و عملیات

  • سالانه security audit در مسیر Graduated
  • fuzz testing روی proxy
  • سطح حمله sidecar: فقط image رسمی، محدود کردن Who can annotate inject
  • Resource requests کوچک برای proxy — همچنان در cluster بزرگ جمع می‌شود؛ سایز را مانیتور کنید
  • Trust root identity را backup/rotate طبق docs
  • linkerd check را در CI بعد از upgrade بگذارید

Upgrade: همیشه مسیر رسمی نسخه به نسخه را بخوانید (CRD و Gateway API bump حساس است، مخصوصاً GRPCRoute).


Troubleshooting

علامتبررسی
Inject نشدannotation، webhook، namespace مستثنی
mTLS failidentity pods، clock skew، meshed نبودن یک طرف
متریک خالیviz نصب؟ scrape Prometheus؟
HTTPRoute بی‌اثرparentRefs درست؟ نسخه Gateway API؟
Init/CNI conflictCNI plugin Linkerd در برابر iptables init
linkerd check
linkerd diagnostics proxy-logs <pod>
kubectl -n linkerd get pods

ارتباط با stack شما

Clients
  → Ingress ([Contour](/blog/contour-kubernetes-ingress-envoy-guide/) / EG)
  → Service
  → Pod + linkerd-proxy  ←──mTLS──→  Pod + linkerd-proxy

         ├── metrics → Prometheus / Grafana
         └── logs → [Fluentd](/blog/fluentd-unified-logging-layer-guide/) / Bit

Foundation:
  [CoreDNS](/blog/coredns-kubernetes-dns-guide/) · [Cilium](/blog/cilium-ebpf-kubernetes-networking/) (CNI)
  [cert-manager](/blog/cert-manager-kubernetes-tls-certificates/) (edge TLS)
  [Harbor](/blog/harbor-cloud-native-registry-guide/) · [Falco](/blog/falco-runtime-security-ebpf-guide/)
  GitOps: [Argo](/blog/argo-project-kubernetes-gitops-cicd/)

Best practices

  1. اول linkerd check --pre و یک namespace canary
  2. Mesh را تدریجی کنید — نه همه cluster یک‌شبه
  3. Ingress جدا نگه دارید؛ از Linkerd انتظار LB عمومی نداشته باشید
  4. برای routing/timeout از HTTPRoute/GRPCRoute استاندارد شروع کنید
  5. Viz + Prometheus را از روز اول وصل کنید
  6. Opaque ports را برای DB/protocolهای خاص تنظیم کنید
  7. تزریق روی kube-system را عمداً باز نکنید
  8. در ۲.۲۰+ رفتار native sidecar را در محیط خود validate کنید
  9. Playbook upgrade و linkerd check در pipeline
  10. Authorization policy را بعد از mTLS پایدار اضافه کنید

چه زمانی Linkerd؟

✅ استفاده کنید

  • Kubernetes با نیاز mTLS و golden metrics بدون تیم mesh بزرگ
  • اولویت footprint و سادگی ops
  • east-west reliability (retry/timeout/LB)
  • تیم‌هایی که «mesh without the mess» می‌خواهند

⚠️ شاید نه

  • نیاز به صدها فیلتر Envoy سفارشی و multi-cluster فوق‌پیچیده → Istio را ارزیابی کنید
  • فقط NetworkPolicy بدون sidecar → Cilium ممکن است کافی باشد
  • انتظار Ingress همه‌کاره از خود Linkerd

جمع‌بندی

مفهومتوضیح
Linkerdultralight Kubernetes service mesh
linkerd2-proxymicro-proxy Rust — data plane
Control planedestination، identity، proxy-injector
Injectannotation → sidecar شفاف
ارزشmTLS + observability + reliability
Gateway APIHTTPRoute/GRPCRoute برای mesh config
Ingressجدا — Contour / Envoy Gateway / …
CNCFGraduated ژوئیه ۲۰۲۱ — اولین mesh Graduated

Linkerd شرط می‌بندد که service mesh باید کوچک، ایمن و قابل‌عملیات باشد — با Rust و یک proxy مخصوص، نه با کپی کردن تمام قابلیت‌های یک edge proxy عمومی داخل هر Pod.


قدم بعدی

  1. Get startedcheck --preinstallviz
  2. یک namespace demo با inject: enabled
  3. داشبورد golden metrics بین دو سرویس
  4. یک HTTPRoute برای timeout/retry
  5. جلوی cluster یک Contour/EG بگذارید و مسیر کامل north-south + east-west را تست کنید

منابع


منتشر شده در P30Light — بخش زیرساخت و سرور.

لینک گزارش با موفقیت کپی گردید!