المستوى المطلوب: متوسط. الكلام ده مبني على فرضية إنك تعرف أساسيات Kubernetes (يعني عارف الـ Pod والـ Service وبتشغّل kubectl)، ومش لازم تكون لمست الـ Ingress قبل كده.
Kubernetes Ingress: ازاي توصّل كل خدماتك من باب واحد
لو بتعمل type=LoadBalancer لكل خدمة في الكلاستر، انت بتدفع IP عام وفاتورة سحابية منفصلة لكل خدمة. الـ Ingress بيخلّيك تخرّج عشرات الخدمات من باب HTTP/HTTPS واحد، بـ IP واحد، وبتوفّر أغلب الفاتورة دي. هنا هتطلع بملف Ingress شغّال تقدر تنسخه دلوقتي.
المشكلة باختصار
عندك كلاستر فيه 12 microservice، وكل واحدة محتاجة توصل من برّه. الطريقة المباشرة إنك تعمل لكل خدمة Service بنوع LoadBalancer. اللي بيحصل فعلاً إن السحابة بتـ provision لك Load Balancer حقيقي + IP عام لكل خدمة. يعني 12 خدمة = 12 Load Balancer = 12 فاتورة + 12 IP تديرهم وتأمّنهم. ده غالي ومتعب من غير داعي.
يعني إيه Ingress؟ بمثال الأول
تخيّل مبنى شركة كبير فيه أقسام كتير: مبيعات، دعم فني، حسابات. مفيش مدخل خارجي مستقل لكل قسم. فيه باب واحد، وعنده موظف استقبال. الزائر بيقول "أنا جاي لقسم المبيعات"، الموظف بيوجّهه للمكان الصح جوّه. الزوار كلهم بيدخلوا من باب واحد، والتوجيه بيحصل بالداخل.
الـ Ingress هو موظف الاستقبال ده بالظبط. وعلميًا: الـ Ingress هو كائن في الـ Kubernetes API بيعرّف قواعد توجيه لطلبات HTTP وHTTPS الجاية من برّه الكلاستر لخدمات جوّاه، بناءً على الـ host (زي shop.example.com) أو الـ path (زي /api). بيدعم كمان إنهاء الـ TLS في مكان واحد.
نقطة مهمة: الـ Ingress لوحده مش بيعمل حاجة
ركز هنا، لأن دي بتوقّع ناس كتير. الـ Ingress مجرد قواعد. اللي بينفّذ القواعد دي اسمه Ingress Controller — وده reverse proxy حقيقي (زي NGINX أو Traefik أو HAProxy) شغّال جوّه الكلاستر وبيقرا قواعدك ويعمل الـ routing الفعلي. لو طبّقت ملف Ingress من غير ما يكون عندك Controller متركّب، مفيش حاجة هتحصل خالص. الـ Controller هو اللي بياخد الـ Load Balancer الواحد بتاعك.
مثال تطبيقي: ملف Ingress كامل قابل للنسخ
أول حاجة، ركّب الـ NGINX Ingress Controller بـ Helm:
# تركيب الـ controller (بيـ provision لك Load Balancer واحد بس)
helm upgrade --install ingress-nginx ingress-nginx \
--repo https://kubernetes.github.io/ingress-nginx \
--namespace ingress-nginx --create-namespace
# استنى لحد ما ياخد IP خارجي
kubectl get svc -n ingress-nginx ingress-nginx-controllerبعدين عرّف قاعدة توجيه بـ host وpath، مع TLS: