انتقل إلى المحتوى الرئيسي

الفصل 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-service
  • app2.example.com → app2-service
  • api.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-service
  • example.com/web → web-service
  • example.com/admin → admin-service
  • example.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