الفصل 8.3 - التوجيه و TLS
أهداف التعلم
في نهاية هذا الفصل، ستكون قادرًا على:
- تكوين التوجيه حسب اسم المضيف
- تنفيذ التوجيه حسب المسار
- تكوين TLS/SSL باستخدام الشهادات
- استخدام cert-manager لإدارة الشهادات تلقائيًا
- فهم أنواع المسارات
- إدارة إعادة الكتابة وإعادة التوجيه
مقدمة
يسمح التوجيه Ingress بتوجيه الحركة إلى خدمات مختلفة حسب اسم المضيف أو المسار. يتيح تكوين TLS تأمين الاتصالات باستخدام HTTPS.
التوجيه حسب اسم المضيف
التوجيه بناءً على اسم النطاق:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: multi-host-ingress
spec:
ingressClassName: nginx
rules:
- host: app1.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: app1-service
port:
number: 80
- host: app2.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: app2-service
port:
number: 80
- host: api.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: api-service
port:
number: 80
النتيجة:
app1.example.com→app1-serviceapp2.example.com→app2-serviceapi.example.com→api-service
التوجيه حسب المسار
التوجيه بناءً على مسار URL:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: path-based-ingress
spec:
ingressClassName: nginx
rules:
- host: example.com
http:
paths:
- path: /api
pathType: Prefix
backend:
service:
name: api-service
port:
number: 80
- path: /web
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
- path: /admin
pathType: Prefix
backend:
service:
name: admin-service
port:
number: 80
- path: /
pathType: Prefix
backend:
service:
name: default-service
port:
number: 80
النتيجة:
example.com/api→api-serviceexample.com/web→web-serviceexample.com/admin→admin-serviceexample.com/→default-service
أنواع المسارات
Prefix
يجب أن يبدأ المسار بالمقدمة المحددة:
- path: /api
pathType: Prefix
يتوافق مع:
/api/api/v1/api/users/api/v1/users
Exact
يجب أن يتطابق المسار تمامًا:
- path: /api
pathType: Exact
يتوافق مع:
/apiفقط
لا يتوافق مع:
/api/v1/api/users
ImplementationSpecific
يعتمد على تنفيذ Ingress Controller:
- path: /api
pathType: ImplementationSpecific
تكوين TLS
إنشاء Secret TLS
# توليد شهادة (مثال باستخدام openssl)
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout tls.key -out tls.crt \
-subj "/CN=example.com/O=example.com"
# إنشاء Secret
kubectl create secret tls example-tls \
--cert=tls.crt \
--key=tls.key
الاستخدام في Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: tls-ingress
spec:
ingressClassName: nginx
tls:
- hosts:
- example.com
- www.example.com
secretName: example-tls
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
- host: www.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
النتيجة: تمكين HTTPS لـ example.com و www.example.com.
Cert-Manager للشهادات التلقائية
يقوم cert-manager بإدارة الشهادات TLS تلقائيًا مع Let's Encrypt.
التثبيت
# Helm
helm repo add jetstack https://charts.jetstack.io
helm repo update
helm install cert-manager jetstack/cert-manager \
--namespace cert-manager \
--create-namespace \
--set installCRDs=true
ClusterIssuer (Let's Encrypt)
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: admin@example.com
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- http01:
ingress:
class: nginx
الاستخدام في Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: cert-ingress
annotations:
cert-manager.io/cluster-issuer: "letsencrypt-prod"
spec:
ingressClassName: nginx
tls:
- hosts:
- example.com
secretName: example-tls # تم إنشاؤه تلقائيًا بواسطة cert-manager
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
النتيجة: تم الحصول على شهادة TLS وتجديدها تلقائيًا بواسطة cert-manager.
إعادة الكتابة وإعادة التوجيه
إعادة الكتابة (NGINX)
إعادة كتابة URL قبل إرساله إلى الخلفية:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: rewrite-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
ingressClassName: nginx
rules:
- host: example.com
http:
paths:
- path: /api(/|$)(.*)
pathType: ImplementationSpecific
backend:
service:
name: api-service
port:
number: 80
النتيجة: example.com/api/users → api-service/users
إعادة التوجيه
إعادة التوجيه إلى URL آخر:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: redirect-ingress
annotations:
nginx.ingress.kubernetes.io/permanent-redirect: "https://www.example.com"
spec:
ingressClassName: nginx
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
مثال كامل: تطبيق متعدد الطبقات
الهيكلية
التكوين
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: app-ingress
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "true"
cert-manager.io/cluster-issuer: "letsencrypt-prod"
spec:
ingressClassName: nginx
tls:
- hosts:
- example.com
secretName: example-tls
rules:
- host: example.com
http:
paths:
# الواجهة الأمامية للويب
- path: /
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
# الخلفية API
- path: /api
pathType: Prefix
backend:
service:
name: api-service
port:
number: 8080
# لوحة الإدارة
- path: /admin
pathType: Prefix
backend:
service:
name: admin-service
port:
number: 8080
أوامر مفيدة
التحقق
# عرض Ingress
kubectl get ingress
# التفاصيل
kubectl describe ingress app-ingress
# عرض الشهادات
kubectl get certificates
kubectl describe certificate example-tls
# عرض أسرار TLS
kubectl get secrets | grep tls
الاختبار
# اختبار HTTP
curl -H "Host: example.com" http://<ingress-ip>/
# اختبار HTTPS
curl -k https://example.com/
# اختبار مع المسار
curl -H "Host: example.com" http://<ingress-ip>/api/health
أفضل الممارسات
1. TLS في كل مكان
استخدام HTTPS لجميع الاتصالات الخارجية.
2. Cert-Manager
استخدام cert-manager لإدارة الشهادات تلقائيًا.
3. أنواع المسارات
اختيار نوع المسار المناسب (Prefix في معظم الحالات).
4. التعليقات التوضيحية
استخدام التعليقات التوضيحية للميزات المتقدمة (إعادة الكتابة، إعادة التوجيه).
5. المراقبة
مراقبة الشهادات وانتهاء صلاحيتها.
ملخص
في هذا الفصل، تعلمت:
التوجيه حسب اسم المضيف: عدة نطاقات مع Ingress واحد
التوجيه حسب المسار: التوجيه حسب المسار إلى خدمات مختلفة
أنواع المسارات: Prefix، Exact، ImplementationSpecific
TLS: التكوين باستخدام أسرار Kubernetes
cert-manager: إدارة الشهادات تلقائيًا مع Let's Encrypt
إعادة الكتابة: إعادة كتابة URLs باستخدام التعليقات التوضيحية
إعادة التوجيه: إعادة التوجيه الدائم أو المؤقت
أفضل الممارسات: TLS في كل مكان، cert-manager، المراقبة
الخطوات التالية
الوحدة 9: الأمان و RBAC
المختبر 8.2: تكوين Ingress لتطبيق
المختبر 8.3: شهادات TLS مع Cert-Manager
تم إنشاء الفصل في: ديسمبر 2024