الفصل 8.2 - Ingress Controller
أهداف التعلم
في نهاية هذا الفصل، ستكون قادرًا على:
- فهم ما هو Ingress Controller
- تثبيت NGINX Ingress Controller
- تكوين Ingress Controller
- فهم الأنواع المختلفة من وحدات التحكم
- إدارة التعليقات التوضيحية والتكوينات المتقدمة
- استكشاف أخطاء Ingress Controller وإصلاحها
مقدمة
Ingress Controller هو Pod يراقب موارد Ingress ويقوم بتكوين موازن تحميل لتنفيذ قواعد التوجيه. بدون Ingress Controller، لا تعمل موارد Ingress.
ما هو Ingress Controller؟
Ingress Controller هو وكيل عكسي يقوم بـ:
- مراقبة موارد Ingress في العنقود
- تكوين موازن تحميل وفقًا لقواعد Ingress
- إدارة توجيه HTTP/HTTPS
- إنهاء TLS/SSL
- توفير موازنة التحميل
مهم: يجب تثبيت Ingress Controller بشكل منفصل. لا يوفر Kubernetes وحدة تحكم افتراضية.
أنواع Ingress Controllers
1. NGINX Ingress Controller
الأكثر شعبية
المزايا:
- أداء عالي
- العديد من الميزات
- موثق جيدًا
- دعم نشط
التثبيت:
# Kubernetes officiel
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml
# Vérifier l'installation
kubectl get pods -n ingress-nginx
2. Traefik
بسيط وحديث
المزايا:
- التكوين التلقائي
- لوحة تحكم مدمجة
- تكوين بسيط
- دعم Let's Encrypt مدمج
التثبيت:
# Helm
helm repo add traefik https://traefik.github.io/charts
helm install traefik traefik/traefik
3. HAProxy Ingress
أداء عالي جدًا
المزايا:
- أداء استثنائي
- تكوين متقدم
- دعم TCP/UDP
4. Istio Gateway
للخدمة الشبكية
المزايا:
- تكامل مع Istio
- ميزات متقدمة
- شبكة خدمة كاملة
تثبيت NGINX Ingress Controller
الطريقة 1: Manifest Kubernetes
# Installation standard
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.1/deploy/static/provider/cloud/deploy.yaml
# Vérifier
kubectl get pods -n ingress-nginx
kubectl get svc -n ingress-nginx
الطريقة 2: Helm
# Ajouter le repository
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
# Installer
helm install ingress-nginx ingress-nginx/ingress-nginx \
--namespace ingress-nginx \
--create-namespace
التحقق
# عرض الـ Pods
kubectl get pods -n ingress-nginx
# عرض الـ Service
kubectl get svc -n ingress-nginx
# عرض عنوان IP الخارجي
kubectl get svc ingress-nginx-controller -n ingress-nginx
التكوين الأساسي
IngressClass
تحديد أي فئة Ingress لاستخدامها:
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: nginx
spec:
controller: k8s.io/ingress-nginx
Ingress Resource
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-ingress
spec:
ingressClassName: nginx
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
تعليقات NGINX التوضيحية
تسمح التعليقات التوضيحية بتكوين NGINX بطريقة متقدمة:
إعادة الكتابة
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: rewrite-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
ingressClassName: nginx
rules:
- host: example.com
http:
paths:
- path: /api/(.*)
pathType: Prefix
backend:
service:
name: api-service
port:
number: 80
إعادة توجيه SSL
metadata:
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "true"
تحديد المعدل
metadata:
annotations:
nginx.ingress.kubernetes.io/limit-rps: "100"
CORS
metadata:
annotations:
nginx.ingress.kubernetes.io/enable-cors: "true"
nginx.ingress.kubernetes.io/cors-allow-origin: "*"
المصادقة
metadata:
annotations:
nginx.ingress.kubernetes.io/auth-type: basic
nginx.ingress.kubernetes.io/auth-secret: basic-auth
nginx.ingress.kubernetes.io/auth-realm: "Authentication Required"
التكوين المتقدم
ConfigMap لـ NGINX
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-config
namespace: ingress-nginx
data:
proxy-body-size: "50m"
ssl-protocols: "TLSv1.2 TLSv1.3"
client-max-body-size: "50m"
تطبيق التكوين
apiVersion: apps/v1
kind: Deployment
metadata:
name: ingress-nginx-controller
namespace: ingress-nginx
spec:
template:
spec:
containers:
- name: controller
args:
- /nginx-ingress-controller
- --configmap=$(POD_NAMESPACE)/nginx-config
مثال كامل
الخطوة 1: الخدمة
apiVersion: v1
kind: Service
metadata:
name: web-service
spec:
selector:
app: web
ports:
- port: 80
targetPort: 8080
الخطوة 2: Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
ingressClassName: nginx
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
tls:
- hosts:
- example.com
secretName: example-tls
أوامر مفيدة
التحقق
# عرض Pods الخاص بـ Controller
kubectl get pods -n ingress-nginx
# Logs du Controller
kubectl logs -n ingress-nginx -l app.kubernetes.io/component=controller
# عرض الـ Services
kubectl get svc -n ingress-nginx
# عرض موارد Ingress
kubectl get ingress
kubectl describe ingress web-ingress
استكشاف الأخطاء وإصلاحها
# Vérifier la configuration NGINX
kubectl exec -n ingress-nginx <controller-pod> -- cat /etc/nginx/nginx.conf
# Tester la connectivité
curl -H "Host: example.com" http://<ingress-ip>/
# عرض الأحداث
kubectl get events -n ingress-nginx
أفضل الممارسات
1. Namespace مخصص
تثبيت Ingress Controller في Namespace مخصص (ingress-nginx).
2. الموارد
تحديد حدود الموارد لوحدة التحكم.
3. التوافر العالي
نشر عدة نسخ من وحدة التحكم للتوافر العالي.
4. المراقبة
مراقبة مقاييس وحدة التحكم (الطلبات، التأخير، الأخطاء).
5. الأمان
- استخدام TLS في كل مكان
- تكوين حدود المعدل
- تفعيل المصادقة إذا لزم الأمر
ملخص
في هذا الفصل، تعلمت:
Ingress Controller: Pod ينفذ قواعد Ingress
الأنواع: NGINX (شعبي)، Traefik (بسيط)، HAProxy (أداء عالي)، Istio (شبكة خدمة)
التثبيت: Manifest Kubernetes أو Helm
التكوين: IngressClass، التعليقات التوضيحية، ConfigMap
التعليقات التوضيحية: إعادة الكتابة، إعادة توجيه SSL، تحديد المعدل، CORS، المصادقة
استكشاف الأخطاء وإصلاحها: السجلات، تكوين NGINX، الأحداث
أفضل الممارسات: Namespace مخصص، التوافر العالي، المراقبة، الأمان
الخطوات التالية
الفصل 8.3: التوجيه وTLS
المختبر 8.1: نشر Ingress Controller
تم إنشاء الفصل في: ديسمبر 2024