انتقل إلى المحتوى الرئيسي
العودة إلى الفئة

Traefik Reverse Proxy: موازن تحميل حديث لـ Docker وKubernetes

تثبيت Traefik، اكتشاف الخدمات التلقائي مع Docker provider، SSL من Let's Encrypt، تكوين middleware، dashboard، Kubernetes Ingress Controller وموازنة التحميل.

وقت القراءة: 18 دقيقة DevOps والأتمتة
traefikبروكسي عكسيموازن تحميلdockerkubernetesssldevops

جدول المحتويات

Traefik Reverse Proxy: موازن تحميل حديث لـ Docker وKubernetes

Traefik موجّه حافة وبروكسي عكسي حديث مصمم لمعماريات الخدمات المصغرة. بفضل تكامله العميق مع Docker وKubernetes، يكتشف الخدمات ويوجّهها تلقائياً.

ما هو Traefik؟

الميزات الرئيسية لـ Traefik:

  • اكتشاف الخدمات التلقائي: توجيه تلقائي عبر علامات Docker/Kubernetes
  • تكامل Let's Encrypt: إدارة شهادات SSL تلقائية
  • نظام Middleware: المصادقة، تحديد المعدل، إعادة التوجيه، الترويسات
  • Dashboard: واجهة مراقبة في الوقت الفعلي
  • مزودون متعددون: دعم Docker وKubernetes وConsul وetcd
  • توجيه TCP/UDP: دعم البروتوكولات غير HTTP

يوفر Traefik v3 أداءً أفضل وميزات جديدة مقارنة بـ v2. يركز هذا الدليل على Traefik v3.

تثبيت Traefik v3

التثبيت مع Docker Compose

hljs yaml
# docker-compose.yml
services:
  traefik:
    image: traefik:v3.0
    container_name: traefik
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
      - "8080:8080"  # Dashboard (أغلق في الإنتاج)
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./traefik.yml:/etc/traefik/traefik.yml:ro
      - ./config:/etc/traefik/config:ro
      - traefik_certs:/certs
    networks:
      - traefik-net
    labels:
      - "traefik.enable=true"
      # Dashboard
      - "traefik.http.routers.dashboard.rule=Host(`traefik.example.com`)"
      - "traefik.http.routers.dashboard.service=api@internal"
      - "traefik.http.routers.dashboard.middlewares=auth"
      - "traefik.http.middlewares.auth.basicauth.users=admin:$$apr1$$xyz$$hash"
      - "traefik.http.routers.dashboard.tls.certresolver=letsencrypt"

volumes:
  traefik_certs:

networks:
  traefik-net:
    external: true

تكوين traefik.yml

hljs yaml
# traefik.yml
global:
  checkNewVersion: true
  sendAnonymousUsage: false

api:
  dashboard: true
  insecure: false  # false في الإنتاج

entryPoints:
  web:
    address: ":80"
    http:
      redirections:
        entryPoint:
          to: websecure
          scheme: https
          permanent: true

  websecure:
    address: ":443"
    http:
      tls:
        certResolver: letsencrypt
    http3:
      advertisedPort: 443

certificatesResolvers:
  letsencrypt:
    acme:
      email: admin@example.com
      storage: /certs/acme.json
      httpChallenge:
        entryPoint: web
      # DNS challenge (لـ wildcard)
      # dnsChallenge:
      #   provider: cloudflare
      #   resolvers:
      #     - "1.1.1.1:53"

providers:
  docker:
    endpoint: "unix:///var/run/docker.sock"
    exposedByDefault: false
    network: traefik-net
  file:
    directory: /etc/traefik/config
    watch: true

log:
  level: INFO
  filePath: /var/log/traefik/traefik.log

accessLog:
  filePath: /var/log/traefik/access.log
  bufferingSize: 100

التوجيه التلقائي مع Docker Provider

سجّل الخدمات تلقائياً في Traefik باستخدام علامات Docker:

hljs yaml
# مثال تطبيق
services:
  webapp:
    image: nginx:alpine
    networks:
      - traefik-net
    labels:
      # تفعيل Traefik
      - "traefik.enable=true"

      # HTTP router
      - "traefik.http.routers.webapp.rule=Host(`app.example.com`)"
      - "traefik.http.routers.webapp.entrypoints=websecure"
      - "traefik.http.routers.webapp.tls.certresolver=letsencrypt"

      # منفذ الخدمة
      - "traefik.http.services.webapp.loadbalancer.server.port=80"

      # تطبيق middleware
      - "traefik.http.routers.webapp.middlewares=security-headers,rate-limit"

networks:
  traefik-net:
    external: true

مثال متعدد الخدمات

hljs yaml
services:
  api:
    image: myapi:latest
    networks:
      - traefik-net
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.api.rule=Host(`api.example.com`)"
      - "traefik.http.routers.api.entrypoints=websecure"
      - "traefik.http.routers.api.tls.certresolver=letsencrypt"
      - "traefik.http.services.api.loadbalancer.server.port=3000"
      # فحص الصحة
      - "traefik.http.services.api.loadbalancer.healthcheck.path=/health"
      - "traefik.http.services.api.loadbalancer.healthcheck.interval=30s"

  frontend:
    image: myfrontend:latest
    networks:
      - traefik-net
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.frontend.rule=Host(`example.com`) || Host(`www.example.com`)"
      - "traefik.http.routers.frontend.entrypoints=websecure"
      - "traefik.http.routers.frontend.tls.certresolver=letsencrypt"
      - "traefik.http.services.frontend.loadbalancer.server.port=80"

networks:
  traefik-net:
    external: true

تكوين Middleware

Middleware ثابت (traefik.yml أو ملف تكوين)

hljs yaml
# config/middlewares.yml
http:
  middlewares:
    # ترويسات الأمان
    security-headers:
      headers:
        stsSeconds: 31536000
        stsIncludeSubdomains: true
        stsPreload: true
        forceSTSHeader: true
        contentTypeNosniff: true
        frameDeny: true
        referrerPolicy: "strict-origin-when-cross-origin"
        customResponseHeaders:
          X-Powered-By: ""
          Server: ""

    # تحديد المعدل
    rate-limit:
      rateLimit:
        average: 100
        burst: 50
        period: 1m
        sourceCriterion:
          ipStrategy:
            depth: 1

    # Basic auth
    basic-auth:
      basicAuth:
        users:
          - "admin:$apr1$xyz$hashedpassword"
        removeHeader: true

    # قائمة IP المسموح بها
    ip-whitelist:
      ipAllowList:
        sourceRange:
          - "192.168.1.0/24"
          - "10.0.0.0/8"

    # إعادة توجيه www إلى non-www
    www-redirect:
      redirectRegex:
        regex: "^https://www\\.(.*)"
        replacement: "https://${1}"
        permanent: true

Dashboard

hljs yaml
# تكوين dashboard آمن
labels:
  - "traefik.enable=true"
  - "traefik.http.routers.traefik-dashboard.rule=Host(`traefik.example.com`) && (PathPrefix(`/api`) || PathPrefix(`/dashboard`))"
  - "traefik.http.routers.traefik-dashboard.service=api@internal"
  - "traefik.http.routers.traefik-dashboard.entrypoints=websecure"
  - "traefik.http.routers.traefik-dashboard.tls.certresolver=letsencrypt"
  - "traefik.http.routers.traefik-dashboard.middlewares=dashboard-auth"
  - "traefik.http.middlewares.dashboard-auth.basicauth.users=admin:$$apr1$$xyz$$hash"

إنشاء كلمة مرور basic auth:

hljs bash
# إنشاء كلمة مرور مع htpasswd
echo $(htpasswd -nB admin) | sed -e s/\\$/\\$\\$/g

# أو مع openssl
echo "admin:$(openssl passwd -apr1 'كلمتك_السرية')" | sed -e 's/\$/\$\$/g'

Kubernetes Ingress Controller

التثبيت مع Helm

hljs bash
# إضافة مستودع Traefik Helm
helm repo add traefik https://traefik.github.io/charts
helm repo update

# تثبيت Traefik
helm install traefik traefik/traefik \
  --namespace traefik \
  --create-namespace \
  --set deployment.replicas=2 \
  --set ports.web.redirectTo.port=websecure \
  --set ingressRoute.dashboard.enabled=true

IngressRoute (Traefik CRD)

hljs yaml
# ingressroute.yml
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
  name: webapp-ingress
  namespace: default
spec:
  entryPoints:
    - websecure
  routes:
    - match: Host(`app.example.com`)
      kind: Rule
      services:
        - name: webapp-service
          port: 80
      middlewares:
        - name: security-headers
  tls:
    certResolver: letsencrypt

Middleware CRD

hljs yaml
# middleware.yml
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
  name: security-headers
  namespace: default
spec:
  headers:
    stsSeconds: 31536000
    stsIncludeSubdomains: true
    contentTypeNosniff: true
    frameDeny: true

توجيه TCP/UDP

hljs yaml
# traefik.yml - نقطة دخول TCP
entryPoints:
  mysql:
    address: ":3306"
  redis:
    address: ":6379"
hljs yaml
# config/tcp.yml
tcp:
  routers:
    mysql-router:
      entryPoints:
        - mysql
      rule: "HostSNI(`*`)"
      service: mysql-service

  services:
    mysql-service:
      loadBalancer:
        servers:
          - address: "mysql:3306"

موازنة التحميل

hljs yaml
# موازنة التحميل مع نسخ متعددة
services:
  api:
    image: myapi:latest
    deploy:
      replicas: 3
    networks:
      - traefik-net
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.api.rule=Host(`api.example.com`)"
      - "traefik.http.services.api.loadbalancer.server.port=3000"
      # Sticky sessions
      - "traefik.http.services.api.loadbalancer.sticky.cookie=true"
      - "traefik.http.services.api.loadbalancer.sticky.cookie.name=traefik_session"
      - "traefik.http.services.api.loadbalancer.sticky.cookie.secure=true"
      # فحص الصحة
      - "traefik.http.services.api.loadbalancer.healthcheck.path=/health"
      - "traefik.http.services.api.loadbalancer.healthcheck.interval=10s"
      - "traefik.http.services.api.loadbalancer.healthcheck.timeout=3s"

الخلاصة

Traefik حل بروكسي عكسي وموازن تحميل قوي للبنى التحتية الحديثة للخدمات المصغرة. بتكامله العميق مع Docker وKubernetes وإدارة SSL التلقائية ونظام middleware الغني، إنه خيار موثوق لبيئات الإنتاج. يتيح تكوينه المبني على العلامات لكل خدمة تعريف قواعد التوجيه الخاصة بها.