Linkerd: شبكة الخدمات الخفيفة
Linkerd: شبكة الخدمات الخفيفة
يهيمن Istio على النقاشات المتعلقة بشبكات الخدمات، لكنه ليس الخيار الوحيد للبيئات الإنتاجية — وفي كثير من حالات العمل، ليس الخيار الأنسب. Linkerd، مشروع CNCF المتخرج الذي تصونه شركة Buoyant، ينتهج فلسفة مختلفة جذريًا: أن تتقن شيئًا واحدًا، وتبقي البنية خفيفة، وتجعل العمليات شفافة تمامًا لفرق التطبيقات. في الشركات التي تُشغّل عشرات الخدمات على مجموعات متوسطة الحجم — أو في المؤسسات التي جرّبت Istio ووجدت تكلفته التشغيلية مرتفعة — يكون Linkerd في الغالب الخيار الأوفق.
يتناول هذا الدرس بنية Linkerd والمقايضات التي تحكمها، والحالات العملية التي يُجدي فيها اختيار الشبكة الأخف ثمنه في بيئات الإنتاج.
فلسفة Linkerd
بُنِي Linkerd حول ثلاثة قيود تصميمية صريحة تميّزه عن Istio:
- وكيل Rust المصغّر بدلًا من Envoy. يُشحن Linkerd بوكيله الخاص — linkerd2-proxy — المكتوب بالكامل بلغة Rust، وينفّذ فقط المزايا التي تحتاجها الشبكة: توجيه TCP/HTTP2/gRPC، ومTLS، وإعادة المحاولات، والمهل، والمقاييس. يبلغ حجم الملف التنفيذي نحو 7 ميجابايت ويستهلك حوالي 10 ميجابايت من ذاكرة الوصول العشوائي في وضع الخمول، مقارنةً بـ 50–100 ميجابايت لـ Envoy. عند تشغيل 200 حاوية على عقدة واحدة، يظهر هذا الفارق بوضوح في التكاليف الفعلية.
- صفر تكوين لنسبة الـ 80%. يمنحك حقن الوكيل الجانبي بأمر
linkerd inject(أو الحقن التلقائي عبر التعليق التوضيحي) على الفور mTLS ومقاييس الذهب (معدل النجاح، زمن الاستجابة P50/P95/P99، الطلبات/الثانية) وإعادة المحاولات — دون الحاجة إلى تأليفVirtualServiceأوDestinationRuleأوEnvoyFilter. - Kubernetes-native لا Kubernetes-adjacent. تتكوّن مستوى التحكم في Linkerd من ثلاثة نشرات فقط (
linkerd-destinationوlinkerd-identityوlinkerd-proxy-injector) بالإضافة إلى امتدادlinkerd-vizالاختياري. يعتمد على RBAC وSecrets وwebhooks الخاصة بـ Kubernetes القياسية.
بنية Linkerd
تنقسم مسؤوليات مستوى التحكم على ثلاثة مكوّنات مستقلة:
- linkerd-identity — يعمل بوصفه سلطة شهادات الشبكة، ويُصدر شهادات x.509 متوافقة مع SPIFFE قصيرة الأمد (24 ساعة افتراضيًا) لكل وكيل جانبي.
- linkerd-destination — محرك اكتشاف الخدمات والسياسات. تتدفق الوكلاء عبر gRPC لاستقبال تحديثات النقاط النهائية، وتُترجم هذا المكوّن CRDs الخاصة بـ Linkerd إلى توجيهات للوكيل.
- linkerd-proxy-injector — webhook قبول طافر يحقن حاوية
linkerd2-proxyفي الحاويات (pods) التي تحمل التعليق التوضيحيlinkerd.io/inject: enabled.
تثبيت Linkerd وحقن الشبكة
يتبع التثبيت نهج CLI أولًا. تتحقق واجهة أوامر linkerd من متطلبات ما قبل التثبيت، وتُنشئ قيم Helm، وتوفّر لوحة تحكم حية — وهي مكافئة لـ istioctl لكن أكثر تقييدًا في خياراتها.
linkerd install --identity-external-issuer وأصدر مرساة الثقة عبر cert-manager بمورد Certificate مدعوم بـ Vault أو AWS ACM PCA. يتيح ذلك تدوير CA الجذر دون إعادة تثبيت الشبكة.
سياسة حركة المرور: ServiceProfile و HTTPRoute
إدارة حركة المرور في Linkerd أقل تعقيدًا من Istio عن قصد، لكنها تغطي 90% من احتياجات الخدمات المصغّرة. الكائنان الرئيسيان هما:
- ServiceProfile — ميزانيات إعادة المحاولة، والمهل، وتصنيف الاستجابات لكل مسار. يُنشأ في namespace الخادم ويُستهلك من جميع العملاء.
- HTTPRoute (Gateway API) — اعتمد Linkerd 2.12+ على Gateway API للتوجيه بالترويسات وتقسيم حركة المرور، ليحل محل كائن
TrafficSplitالقديم.
سياسة التفويض
نموذج السياسة في Linkerd أبسط من AuthorizationPolicy في Istio، لكنه ذو حبيبية كافية في الممارسة. يُعلن كائن Server عن المنفذ المحمي في حاوية معينة، بينما تُحدد كائنات ServerAuthorization حسابات الخدمة المسموح لها بالاتصال.
المراقبة: امتداد Viz
ثبّت linkerd viz للحصول على كشط Prometheus ولوحات Grafana ولوحة التحكم الويب مع مقاييس الذهب لكل مسار. الامتداد اختياري عن قصد — يمكنك تخطيّه وكشط المقاييس مباشرةً من نقاط نهاية /metrics للوكيل إذا كان لديك Prometheus مسبقًا.
--set prometheusUrl=http://prometheus.monitoring:9090 لتوجيه Viz إلى نسخة Prometheus خارجية.
متى يتفوق Linkerd على Istio
جدول المقايضة واضح وعملي. اختر Linkerd عندما:
- حجم المجموعة أقل من 500 حاوية وفريقك أقل من 10 مهندسين — تكلفة Istio التشغيلية (انتشار CRDs، وتعقيد xDS، وضبط Istiod) تتجاوز قيمة مزاياه.
- تحتاج فقط mTLS ومقاييس الذهب — يوفرهما Linkerd فور التثبيت دون أي تأليف YAML.
- عقد محدودة الموارد — عقد الحافة، أو أنواع الحالات القابلة للتفجير، أو المواقع التي لا تُقبل فيها ميزانية RAM لـ Envoy.
- إعداد سريع — أمر
checkولوحة الويب في Linkerd يُقلّصان وقت الحصول على أول رؤية بشكل ملحوظ للفرق الجديدة على مفهوم الشبكة.
اختر Istio (الدروس 3–6) عندما تحتاج إلى توجيه L7 متقدم (مستند إلى JWT، أو عكس الترويسات، أو حقن الأعطال على نطاق واسع)، أو بوابات east-west متعددة المجموعات، أو كنت تستثمر أصلًا في منظومة Envoy للحافة وتريد لغة تحكم موحّدة عبر كامل البنية.
أنماط الفشل في الإنتاج الخاصة بـ Linkerd
- انتهاء صلاحية مرساة الثقة. لمرساة الثقة الافتراضية الموقّعة ذاتيًا صلاحية 10 سنوات، لكن إن أصدرت واحدة قصيرة الأمد (شائع مع cert-manager)، فإن انتهاء صلاحيتها يُعطّل mTLS عبر الشبكة بأكملها بصمت. راقب مقياس
linkerd_identity_cert_expiration_timestamp_secondsوأنشئ تنبيهًا عند اقتراب 30 يومًا. - ServiceProfile في namespace خاطئ. يجب إنشاء ServiceProfile في namespace الخادم. وضعه في namespace العميل لا يُنتج أي خطأ لكنه لا يُطبَّق — تمرّ إعادة المحاولات والمهل دون تأثير.
- عدم ترقية linkerd2-proxy. بعد ترقية مستوى التحكم، تحتفظ الحاويات القائمة بالإصدار القديم من الوكيل. شغّل
linkerd viz stat --proxy-version-mismatchللعثور على المتخلّفين ثم أعد تشغيلها دوريًا. - حاوية init في Jobs. لا يتلقى الوكيل في
Jobs إشارة إيقاف عند اكتمال المهمة، مما يُبقي الحاوية معلّقة. الحل هو ضبطconfig.linkerd.io/proxy-wait-before-exit-seconds: "0"واستدعاء إيقاف تشغيل الوكيل عبر خطاف postStop.
الخلاصة
يُثبت Linkerd أن الأداة الصحيحة ليست دائمًا الأكثر قوةً. يوفّر وكيل Rust المصغّر وسطح CRD المحدود والإعدادات الافتراضية المتضمّنة (mTLS، مقاييس الذهب، ميزانيات إعادة المحاولة) حلًا للمشكلات الفعلية لمعظم الفرق، بجزء من ثقل Istio التشغيلي. في الإنتاج، يجب أن تستند مقايضة اختيار الشبكة إلى متطلبات ملموسة — لا إلى مؤتمرات أو عروض البائعين. للغالبية العظمى من حمولات Kubernetes اليوم، البدء بـ Linkerd والانتقال إلى Istio فقط عندما يصبح فجوة الميزات حقيقية هو الخيار الافتراضي للمهندس الأول.