نظرة عامة على سلسلة K8S Envoy Gateway: بوابة دخول للمرور أكثر حداثة من Ingress
إذا سبق لك التعامل مع المرور الخارجي في Kubernetes، فالغالب أنك بدأت مع Ingress. هو يعمل، وبالنسبة لكثير من السيناريوهات فهو كافٍ فعلًا. لكن عندما تبدأ المتطلبات بالتعقّد أكثر، مثل وجود عدة listeners، وملكية مشتركة بين عدة فرق، و gRPC، و TCP، و TLS passthrough، وسياسات مرور دقيقة، فستجد نفسك حتمًا في وضع يصبح فيه "إبقاؤه حيًا عبر annotations" هو القاعدة. يبدأ الـ YAML وكأنه تعويذة، والناس الذين يصونونه يشعرون وكأنهم على وشك كسر ختم قديم.
وهنا يأتي دور Gateway API + Envoy Gateway، فهي العدة الجديدة. لا تجعل الأمور أعقد؛ بل تفصل المسؤوليات التي كانت متشابكة سابقًا بشكل نظيف، بحيث يصبح فهم مرور الدخول، وقواعد التوجيه، وإعدادات أمان TLS، وأنواع البروتوكولات، وملكية الفرق أسهل بكثير.
ما هذا بالضبط
لنقلها بوضوح في جملة واحدة:
Envoy Proxy: مستوى البيانات الذي يستقبل المرور فعليًا ويحوّل الطلبات، ويُسمّى أيضًا Gateway ProxyEnvoy Gateway: مستوى التحكم الذي يدير Envoy Proxy نيابةً عنكGateway API: الواجهة المعيارية التي تستخدمها في Kubernetes للتصريح بقواعد المرور
فكّر فيها هكذا:
Gateway APIهو المكان الذي تكتب فيه المتطلباتEnvoy Gatewayهو المدير الذي يترجم ويفوّضEnvoy Proxyهو الحارس الفعلي الواقف عند الباب
فائدة هذا الفصل أنك لا تحتاج إلى صياغة إعدادات Envoy منخفضة المستوى يدويًا، ولا إلى حفظ كل annotation خاص من مختلف الـ controllers. أنت تصرّح بموارد Kubernetes، و Envoy Gateway يترجمها إلى إعدادات يستطيع Envoy Proxy تنفيذها فعلًا.
Gateway مقابل Ingress: ما الفرق
الإجابة المختصرة: Ingress لم يصبح قديمًا، لكن Gateway API أنسب للأنظمة المتوسطة والكبيرة التي تحتاج إلى حوكمة أفضل.
| المقارنة | Ingress | Gateway API |
|---|---|---|
| نموذج Ingress | غالبًا يدمج الدخول والتوجيه في كائن واحد | يفصل بين GatewayClass و Gateway و Route |
| القدرة التعبيرية | يركّز غالبًا على HTTP/HTTPS، والميزات المتقدمة تعتمد على annotations | دعم أصيل لأنواع متعددة من الـ routes مع حقول أوضح |
| نموذج التوسعة | كثير من الإمكانات يعتمد على annotations خاصة بكل controller | حقول معيارية، مع نقاط توسعة عبر CRDs |
| دعم البروتوكولات | غالبًا متمحور حول HTTP/Web | يدعم HTTPRoute و GRPCRoute و TCPRoute و TLSRoute |
| ملكية الفرق | من السهل خلط إعدادات المنصة مع إعدادات التطبيق | أنسب لفرق المنصة لإدارة ingress وفرق التطبيقات لإدارة routes |
| قابلية النقل | غالبًا ما تكون annotations مرتبطة بـ controllers محددين | أكثر معيارية وأسهل قراءة بين التطبيقات المختلفة |
إذا كانت متطلباتك ببساطة:
- موقع واحد أو API بسيط
- توجيه أساسي حسب path أو host
- فريق صغير
فلا يزال Ingress خيارًا مناسبًا. لكن إذا بدأت متطلباتك تشمل:
- مدخل دخول واحد يخدم عدة بروتوكولات
- عدة listeners أو domains أو certificates
- HTTP و gRPC معًا
- فصل صلاحيات ingress الخاصة بالمنصة عن صلاحيات routes الخاصة بالتطبيق
- إعدادات تُقرأ كأنها API حقيقي وليست قائمة أمنيات من annotations
فعندها ستبدو Gateway API جذابة جدًا.
لماذا لا نكتفي بـ Ingress
الهدف الرسمي لـ Gateway API هو معالجة عدة نقاط ألم شائعة عند توسّع استخدام Ingress:
- قدرة تعبيرية أفضل: التوجيه و TLS وسياسات المرور وأنواع البروتوكولات محددة بشكل أوضح
- قابلية نقل أفضل: اعتماد أقل على annotations خاصة بكل controller
- فصل أدوار أكثر طبيعية: فرق المنصة تملك ingress، وفرق التطبيقات تملك routes
على سبيل المثال، كثير من إعدادات Ingress تبدو هكذا:
metadata:
annotations:
some.ingress.controller/rewrite-target: /
some.ingress.controller/auth-type: basic
some.ingress.controller/ssl-redirect: "true"ليس لأنها لا تعمل، لكن مع نمو المتطلبات تتحول annotations بسهولة إلى سحر أسود غامض داخل YAML. Gateway API تسحب هذه الاحتياجات إلى حقول واضحة. فتبدو كأنها "إعدادات" وليست "قائمة أمنيات".
البنية الطبقية
الصفحة الرسمية للمفاهيم تقسّم Envoy Gateway إلى ثلاث طبقات، ومن المفيد جدًا حفظها كخريطة ذهنية:
- User Configuration: موارد
Gateway APIو CRDs التوسعية الخاصة بـ Envoy Gateway التي تكتبها - Envoy Gateway Controller: يقرأ هذه الموارد ويترجمها إلى إعدادات قابلة للتنفيذ
- Envoy Proxy: مستوى البيانات الذي يتعامل فعليًا مع المرور الحي
عمليًا، ستقضي معظم وقتك في تعديل "الطبقة التصريحية"، وليس في الدخول عبر SSH إلى instances البروكسي لتعديل إعدادات منخفضة المستوى. هذه هي أناقة العمل بطريقة Kubernetes-native.
ماذا ستتعلّم في هذه السلسلة
تتبع هذه السلسلة ترتيب "ابنه أولًا ثم تعمّق" مع 10 مقالات بما في ذلك هذه النظرة العامة:
- البداية السريعة: ثبّت Envoy Gateway وشغّل أول طلب HTTP من البداية إلى النهاية
- المفاهيم الأساسية: افهم
GatewayClassوGatewayوListenerوEnvoy Proxy - التوجيه العملي لـ HTTP: تعمّق في
HTTPRoute، من host و path إلى header و filter و timeout - TLS والأمان: اضبط HTTPS وافهم
certificateRefsو TLS termination وTLSRoute - أفضل الممارسات: أهم العادات قبل الذهاب إلى الإنتاج
- ورقة غش لأنواع Route: قرّر بسرعة بين
HTTPRouteوGRPCRouteوTCPRouteوTLSRoute - دليل تصميم Listener: أنماط تصميم multi-port و multi-hostname و multi-ingress
- تعدد الـ Namespace وملكية الفرق: أتقن
allowedRoutesوReferenceGrantوحوكمة ingress المشتركة - دليل الحالة واستكشاف الأخطاء: اقرأ
AcceptedوResolvedRefsوProgrammedواتبع أقصر طريق للتشخيص
إذا كنت فقط تريد أن تشعر بطبيعة Envoy Gateway، فاذهب مباشرة إلى المقالة التالية. تشغيله فعليًا أفضل من حفظ كل مصطلح قبل البدء، تمامًا مثل الذهاب إلى النادي الرياضي: الحضور الفعلي أفضل من مشاهدة 30 فيديو على YouTube أولًا.
الموارد الأساسية التي ستصادفها
المبتدئون غالبًا يتعثرون لأنهم يفترضون أن Gateway API لا يحتوي إلا على Gateway و HTTPRoute. لكنه في الحقيقة عائلة كاملة من الموارد.
GatewayClass
يعرّف "أي implementation من Gateway يجب استخدامه في هذا الـ cluster."
وبالنسبة إلى Envoy Gateway، فالنقطة الأساسية هي أن يوجَّه controllerName إلى الـ controller الصحيح.
Gateway
يعرّف "كيف يبدو ingress." على سبيل المثال: ما المنافذ التي ستُفتح، وما البروتوكولات التي ستُستمع إليها، وكيفية إرفاق TLS، وأي routes يُسمح بها.
Listener
Listener هو إحدى أهم الوحدات داخل Gateway.
فكّر فيه على أنه فتحة مواجهة للخارج في الـ Gateway، وكل فتحة تعرّف:
- port
- protocol
- hostname
- TLS config
allowedRoutes
كثيرون ينظرون إلى Gateway كأنه صندوق أسود، لكن ما يحدد سلوك ingress فعليًا هو كل listener داخله على حدة.
عائلة Route
HTTPRoute: مرور HTTP/HTTPS وهو الأكثر شيوعًاGRPCRoute: مرور gRPC ويمكنه المطابقة على service و methodTCPRoute: مرور TCP خام، ولا يفسّر دلالات HTTPTLSRoute: يوجّه بناءً على TLS SNI، وهو شائع في TLS passthrough
ما تشترك فيه كل الـ routes: هي لا "تفتح الباب"، بل تقرر "كيف يُوجَّه المرور بعد دخوله".
نموذج ذهني مختصر
احتفظ بهذه الخريطة في رأسك:
GatewayClass # Which Gateway implementation to use in this cluster
Gateway # Which listeners this ingress opens
Listener # A port / protocol / hostname / TLS slot
Route # How to distribute traffic once it enters
Service # The backend actually serving requests in the cluster
Envoy Proxy # The data plane that ultimately handles the trafficمثال أدنى يبدو هكذا:
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: demo
spec:
parentRefs:
- name: eg
hostnames:
- "www.example.com"
rules:
- backendRefs:
- name: backend
port: 3000لا تحتاج إلى حفظ كل حقل الآن. فقط افهم ما الذي يفعله:
parentRefs: إلى أي Gateway ترتبط هذه القاعدةhostnames: أي domain يجب أن يطابق هذه القاعدةbackendRefs: إلى أي Service يجب إرسال المرور
لمحة سريعة: متى تستخدم كل Route
| المتطلب | المورد الموصى به |
|---|---|
| مواقع الويب و REST APIs والتوجيه حسب header/path | HTTPRoute |
| توجيه gRPC حسب service/method | GRPCRoute |
| خدمات TCP صِرفة (بروتوكول مخصص أو غير HTTP) | TCPRoute |
| الحفاظ على TLS من الطرف إلى الطرف وعدم فكّه عند Gateway | TLSRoute |
هذه المصفوفة عملية جدًا. قبل أن تكتب YAML، اسأل نفسك:
"هل أتعامل مع مرور HTTP أم gRPC أم TCP/TLS خام؟"
الخلاصة في سطر واحد
Envoy Gateway ليس مجرد مصطلح إضافي عليك حفظه، بل هو طريقة لرفع المرور الخارجي في Kubernetes من "يؤدي الغرض" إلى "شيء يشبه نظامًا هندسيًا حقيقيًا."
💡 إذا كانت هذه أول مرة لك مع هذه المجموعة، فلا تحاول تعلّم كل CRD دفعة واحدة. ثبّته، واجعل أول طلب يمر، ثم ارجع إلى المفاهيم لاحقًا، فمعدل الاستيعاب سيكون أسرع بكثير بهذه الطريقة.
الخطوة التالية
في المقالة التالية سننتقل إلى التطبيق العملي: تثبيت Envoy Gateway في الـ cluster وتشغيل أول Gateway + HTTPRoute:
👉 البداية السريعة