تخطَّ إلى المحتوى

Ingress و Gateway API

ستتعلم كيف يصل المستخدم من خارج cluster إلى Service داخلي، وكيف تكتب Ingress كامل، ومتى تبدأ التفكير في Gateway API.

Service من نوع ClusterIP يعمل داخل cluster. Ingress يضيف layer HTTP أمام Services حتى توجه traffic حسب host أو path، وغالبا يضيف TLS.

flowchart LR
U[Browser] --> LB[Load Balancer]
LB --> IC[Ingress Controller]
IC --> I[Ingress rules]
I --> S[Service ClusterIP]
S --> P[Pods]

service.yaml:

apiVersion: v1
kind: Service
metadata:
name: web
labels:
app: web
spec:
type: ClusterIP
selector:
app: web
ports:
- name: http
port: 80
targetPort: http

ingress.yaml:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx
rules:
- host: web.localtest.me
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web
port:
name: http

لو تستخدم minikube:

Terminal window
minikube addons enable ingress
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
kubectl apply -f ingress.yaml
kubectl get ingress web
curl -H "Host: web.localtest.me" http://$(minikube ip)

لو تستخدم kind، غالبا تحتاج تثبيت NGINX Ingress Controller الخاص بـ kind ثم تستخدم localhost حسب إعداداتك.

Expected output:

NAME CLASS HOSTS ADDRESS PORTS AGE
web nginx web.localtest.me 192.168.49.2 80 1m

Ingress يدعم TLS بهذا الشكل:

spec:
tls:
- hosts:
- web.example.com
secretName: web-tls
rules:
- host: web.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web
port:
name: http

في Production لا تنشئ certificate يدويا غالبا. استخدم cert-manager مع ClusterIssuer حتى يصدر ويجدد certificates تلقائيا.

Gateway API هو الجيل الأحدث من APIs الخاصة بالـ networking. يفصل بين:

المفهومالدور
GatewayClassنوع controller أو provider
Gatewayنقطة دخول traffic
HTTPRouteقواعد توجيه HTTP

مثال مختصر:

apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: web
spec:
parentRefs:
- name: public-gateway
hostnames:
- web.example.com
rules:
- backendRefs:
- name: web
port: 80
الحالةالاختيار العملي
تطبيق بسيط وcontroller موجودIngress
منصة كبيرة تحتاج delegation بين teamsGateway API
TCP/UDP خاص أو service meshGateway API أو controller-specific CRDs
تجربة محلية سريعةIngress مع NGINX أو Traefik
المشكلةالتشخيصالحل
Ingress بلا ADDRESSkubectl get ingressثبت Ingress Controller أو راجع ingressClassName
404 من controllerkubectl describe ingress webراجع host و path
502/503kubectl get endpoints webService لا يملك endpoints أو Pod غير ready
TLS لا يعملkubectl describe certificateراجع cert-manager و Secret و DNS

Lab: تعريض Nginx عبر Ingress

المستوى: مبتدئ الوقت: 45 دقيقة الأدوات: kubectl, curl, minikube أو kind

الهدف: إنشاء Service و Ingress، ثم اختبار routing وتشخيص endpoints.

  • Deployment باسم web يعمل.
  • Ingress Controller مثبت.
  1. طبق Service و Ingress:
Terminal window
kubectl apply -f service.yaml
kubectl apply -f ingress.yaml
  1. افحص Ingress:
Terminal window
kubectl get ingress web
kubectl describe ingress web
  1. اختبر الطلب:
Terminal window
curl -H "Host: web.localtest.me" http://127.0.0.1
  1. لو فشل الطلب:
Terminal window
kubectl get endpoints web
kubectl logs -n ingress-nginx -l app.kubernetes.io/component=controller --tail=50
<title>Welcome to nginx!</title>
Terminal window
kubectl delete -f ingress.yaml
kubectl delete -f service.yaml

الربط بالمشروع النهائي

Section titled “الربط بالمشروع النهائي”

Project 4 سيجمع Ingress و TLS و NetworkPolicy. هذا هو أول شكل قريب من دخول traffic في بيئة Production.