Gateway API في Kubernetes
Gateway API في Kubernetes
صُمِّم Kubernetes Ingress عام 2015 لحالة استخدام ضيقة: توجيه حركة HTTP/HTTPS إلى الخدمات الخلفية. مع الوقت، تراكمت عليه تعليقات توضيحية (annotations) خاصة بكل بائع — NGINX وAWS ALB وTraefik وIstio — حتى أصبح manifest الـIngress الواحد نادرًا ما يعمل على كلاسترات مختلفة. Kubernetes Gateway API (وصل إلى GA في الإصدار 1.28 يونيو 2023) هو الجواب المعياري: واجهة برمجية تراعي الأدوار الوظيفية، وتتسم بالتعبيرية والقابلية للتوسع، لإدارة حركة المرور على كل طبقة.
GatewayClass وGateway وHTTPRoute (إضافةً إلى TLSRoute وTCPRoute وGRPCRoute). هذا الفصل يطابق مباشرةً كيفية توزيع المسؤوليات بين فرق المنصة والشبكة والتطبيقات في شركات التكنولوجيا الكبرى.
نموذج الأدوار الثلاثية
يُرسّخ Gateway API نموذجًا تنظيميًا يعكس ملكية البنية التحتية الفعلية:
- GatewayClass — يمتلكه مزود البنية التحتية (فريق السحابة أو مدير الكلاستر). يُعلن عن المتحكم الذي ينفّذ الـGateway (مثل Envoy Gateway أو Cilium أو AWS Load Balancer Controller). فكّر فيه كالمشغّل (driver).
- Gateway — يمتلكه فريق المنصة/الشبكة. يرتبط بـGatewayClass ويُعرّف المستمعين (المنافذ والبروتوكولات وشهادات TLS). يمكن لـGateway واحد خدمة تطبيقات متعددة.
- HTTPRoute / GRPCRoute / TLSRoute — يمتلكها فريق التطبيق. ترتبط بـGateway وتُعرّف قواعد التوجيه الدقيقة (مطابقة المسار والترويسة والاستعلام والطريقة؛ توزيع الحركة؛ تعديل الطلبات).
تثبيت متحكم Gateway (Envoy Gateway)
لا تُثبَّت CRDs الخاصة بـGateway API افتراضيًا — تُثبّت الـCRDs مرة واحدة، ثم تُثبّت المتحكم (التطبيق) بشكل منفصل. Envoy Gateway هو التطبيق المرجعي المدعوم من CNCF والمبني على Envoy Proxy.
تعريف GatewayClass و Gateway
ينشئ فريق المنصة GatewayClass وGateway مرة واحدة. هذه موارد تشمل الكلاستر كله أو مقيّدة بـnamespace معين، ترتبط بها مسارات فرق التطبيقات دون أن تلمس هي manifest الـGateway.
كتابة HTTPRoute (فريق التطبيق)
يعيش HTTPRoute في namespace فريق التطبيق ويرتبط بالـGateway المشترك. يدعم مطابقة المسارات (exact وprefix وregex)، ومطابقة الترويسات والاستعلامات، وتوزيع الحركة للنشر التدريجي (canary)، وتعديل الطلبات والردود — كل ذلك بدون annotations.
توزيع الحركة والنشر التدريجي بدون Annotations
يحل حقل weight في backendRefs محل فوضى annotations مثل nginx.ingress.kubernetes.io/canary-weight بمُنشأ أول من نوعه، مستقل عن المتحكم. تقود خطوط تسليم الإنتاج في شركات التكنولوجيا الكبرى (Flagger وArgo Rollouts) هذا الحقل برمجيًا لتحويل الحركة 5% في كل مرة بناءً على بوابات مقاييس، ثم ترقية الإصدار أو التراجع عنه تلقائيًا.
ReferenceGrant عندما يكون HTTPRoute في namespace مختلف عن Gateway. بدونه يفشل الارتباط بصمت ويبقى المسار غير مرتبط — تحقق من kubectl get httproute -n api-team -o yaml وابحث في .status.parents[].conditions عن Accepted: False بسبب NotAllowedByParent.
GRPCRoute و TLSRoute
Gateway API يُدرك البروتوكولات. لخدمات gRPC المتناظرة، استخدم GRPCRoute الذي يمكنه المطابقة على اسم الخدمة واسم الطريقة — أمر بالغ الأهمية لتوجيه طبقة gRPC دون الحيل المبنية على مسار HTTP. لـTLS الخام (قواعد البيانات وسماسرة MQTT)، يُوجّه TLSRoute بواسطة SNI دون إنهاء جلسة TLS.
أنماط الفشل في الإنتاج
- المسار لم يرتبط: المشكلة الأكثر شيوعًا. تحقق من
kubectl get gateway prod-gateway -n infra -o yaml— عداد.status.listeners[].attachedRoutesيخبرك كم مسارًا مرتبطًا. الصفر عادةً يعني عدم تطابق محدد namespace أو غيابReferenceGrant. - شهادة TLS غير موجودة: إذا كان السر المشار إليه في
certificateRefsفي namespace مختلف، يحتاج Envoy Gateway إلىReferenceGrantفي ذلك الـnamespace أيضًا — نفس نموذج الثقة العابر للـnamespace كالمسارات. - المتحكم لا يُطابق: تراقب متحكمات Gateway API الـ
GatewayClass.spec.controllerNameالمحددة. إذا ثبّتت متحكمَين (مثل Nginx وEnvoy)، فقط المطابق للاسم يُطابق الـGateway. الآخر يتجاهله. - تفاوت إصدارات CRD: تشغيل متحكم v1.1 مع CRDs v1.0 (أو العكس) يتسبب في فشل مُطابقة صامت. طابق دائمًا إصدارات المتحكم والـCRD في CI قبل الترقية للإنتاج.
app.example.com ينشئ عنوانَي IP خارجيَّين يتنافسان على نفس سجل DNS، مما يؤدي إلى أخطاء 502 متقطعة وتوجيه لا يمكن التنبؤ به — صعب جدًا تشخيصه في الساعة الثالثة صباحًا.
المراقبة: قراءة حالة المسار
كل مورد من موارد Gateway API يكشف conditions مُهيكلة في .status. أتمتة فحوصات الصحة في خط CD الخاص بك بقراءة هذه الحالات — المسار الذي يُنشر بدون خطأ لكنه لا يرتبط أبدًا هو فشل صامت لم يكن Ingress ليكشفه أبدًا.
Gateway API هو مستقبل توجيه الدخول في Kubernetes — لن يتلقى Ingress ميزات جديدة. إذا كنت تبني كلاستر جديدًا اليوم، ابدأ بـGateway API. إذا كنت تنتقل، فمعظم المتحكمات (NGINX وTraefik وIstio) تدعم الآن Gateway API إلى جانب Ingress؛ يمكنك تشغيل كليهما أثناء الانتقال وتحويل DNS عند الاستقرار.