Ingress ووحدات تحكم Ingress
Ingress ووحدات تحكم Ingress
تُنشئ خدمة Kubernetes من نوع LoadBalancer موزِّع تحميل سحابيًا لكل خدمة على حدة. عند عشر خدمات، يعني ذلك عشرة عناوين IP عامة، وعشرة فواتير شهرية، وعشرة شهادات TLS لتجديدها. تُشغِّل الكتل الإنتاجية الحقيقية عشرات إلى مئات أحمال عمل HTTP. Ingress هو كائن واجهة برمجة Kubernetes الذي يحل هذه المشكلة: نقطة دخول واحدة للكتلة، مع قواعد توجيه L7 (HTTP/HTTPS) تُوزِّع الحركة إلى الخدمات الصحيحة بناءً على اسم المضيف والمسار — دون موارد سحابية إضافية لكل خدمة.
واجهة Ingress API مقابل وحدة تحكم Ingress
كائن Ingress API هو مجرد إعلان تهيئة مُخزَّن في etcd — لا يفعل شيئًا بمفرده. يقوم بالعمل الفعلي Ingress Controller: نشر داخل الكتلة يراقب كائنات Ingress ويُبرمج وكيلًا عكسيًا حقيقيًا وفقًا لذلك. أكثر وحدتَي التحكم انتشارًا هما:
- ingress-nginx (يُصونه مجتمع Kubernetes) — يُغلِّف NGINX؛ الاختيار الافتراضي للكتل ذاتية الإدارة وإعدادات EKS/GKE الأساسية.
- AWS Load Balancer Controller — يُنشئ موزِّع تحميل تطبيقات (ALB) لكل Ingress أو يُشاركه عبر Ingresses باستخدام ربط مجموعة الأهداف؛ إلزامي على EKS عند الحاجة إلى WAF أو إدارة شهادات AWS الأصلية.
وحدات التحكم الأخرى تشمل Traefik وHAProxy Ingress وContour. مواصفة Ingress مستقلة عن وحدة التحكم: تعمل نفس YAML (في معظمها) عبر وحدات التحكم؛ يُعبَّر عن السلوك الخاص بكل وحدة تحكم عبر annotations على كائن Ingress.
تثبيت ingress-nginx
في كتلة حقيقية، يُثبَّت ingress-nginx عبر Helm. ينشئ المخطط نشر وحدة التحكم، وخدمة من نوع LoadBalancer (موزِّع التحميل السحابي الوحيد)، وجميع أذونات RBAC اللازمة.
كتابة مانيفست Ingress
Ingress بسيط يوجِّه مضيفَين افتراضيَّين إلى خدمتين مختلفتين:
الحقول الأساسية لفهمها:
spec.tls— يُفعِّل HTTPS. تُنهي وحدة التحكم TLS هنا وتُعيد توجيه HTTP العادي إلى خدمة الخلفية.spec.rules[*].host— مطابقة اسم مضيف دقيقة؛ تستخدم وحدة التحكم رأس HTTPHostلاختيار القاعدة.pathType: Prefix— يطابق أي مسار يبدأ بالنص المحدد.Exactيطابق المسار الحرفي فقط.ImplementationSpecificيُفوِّض التفسير لوحدة التحكم.annotations— المنفذ لكل ما هو خارج مواصفة Ingress: تحديد المعدل، رأسيات CORS، المصادقة، قواعد WAF، أوزان الكناري، وما إلى ذلك.
إنهاء TLS بعمق
ينتهي TLS الخاص بـ Ingress عند وحدة التحكم. يجب أن يحتوي Secret على tls.crt وtls.key. الطريقة الأكثر احترافية في الإنتاج هي cert-manager، الذي يتكامل مع Let's Encrypt ويُجدِّد الشهادات تلقائيًا قبل انتهاء صلاحيتها:
nginx.ingress.kubernetes.io/ssl-redirect: "true" عالميًا حتى لا يُخدَّم HTTP أبدًا في الإنتاج.مخطط تدفق حركة Ingress
أنماط الفشل في الإنتاج
فهم ما يتعطل في الإنتاج — ولماذا — يُميِّز المهندسين الذين يُهيِّئون Ingress عمَّن يُشغِّلونه:
- غياب
ingressClassName/ التعليق التوضيحي: إذا أدَّرت وحدتَي تحكم (nginx وALB في آنٍ واحد) وأغفلت محدِّد الفئة، فلن تطالب أيٌّ منهما بـ Ingress. لن تصل الحركة أبدًا. اضبط دائمًاspec.ingressClassName: nginxأو ما يعادله. - عدم تطابق منفذ الخدمة: تُشير خلفية Ingress إلى المنفذ
80لكن الخدمة تُعرِض المنفذ8080. تُعيد وحدة التحكم 503 بصمت. تحقَّق دائمًا بـkubectl describe ingress <name>— ابحث عن Endpoints في الإخراج؛ إذا كان<none>، فتعيين الخلفية خاطئ. - Secret TLS في مساحة اسم خاطئة: يجب أن يكون Ingress وSecret
tls.secretNameفي نفس مساحة الاسم. يفشل الإشارة عبر مساحات الأسماء بصمت، تاركًا وحدة التحكم تُقدِّم شهادة موقَّعة ذاتيًا — أسوأ أنواع الفشل لأن HTTPS يعمل، لكن بشهادة خاطئة. - وحدة التحكم غير متوفرة بعالية: نشر ingress-nginx بنسخة واحدة يعني أن إعادة تشغيل Pod أو تحديث متجدِّد لوحدة التحكم يُسقط كل الحركة الواردة لثوانٍ. شغِّل دائمًا نسختين على الأقل وهيِّئ
PodDisruptionBudgetبـminAvailable: 1. - خطأ إملائي في التعليق التوضيحي: تُقرَأ تعليقات NGINX كنصوص خام — خطأ مثل
nginx.ingress.kubernetes.io/ssl-redirctيُتجاهَل دون إشعار بخطأ. تحقَّق من مانيفستك بـkubectl apply --dry-run=serverوراجع سجلات وحدة التحكم بعد التطبيق.
client_max_body_size هو 1 ميجابايت. ترفع عمليات الملفات والحمولات الكبيرة هذا الحد فورًا. اضبط التعليق التوضيحي nginx.ingress.kubernetes.io/proxy-body-size: "50m" على Ingress لأي خدمة تقبل ملفات مرفوعة، أو تجاوزه عالميًا في ConfigMap وحدة التحكم. تشخيص هذا محبِط لأن الخطأ يظهر عند العميل لا في سجلات التطبيق.فحص صحة Ingress
سير عمل من ثلاثة أوامر لتشخيص أي مشكلة في Ingress:
Ingress + ingress-nginx + cert-manager هو حزمة نقطة الدخول L7 القياسية في Kubernetes. في الدرس التالي ستتعرَّف على Gateway API — الخلف من الجيل التالي لـ Ingress الذي يحل قيوده في تعدد الإيجار والتعبيرية مع الحفاظ على نفس نية توجيه L7.