Traefik כפרוקסי הפוך דינמי: הגדרה והעברה

סביבות דינמיות עם פריסות תכופות דורשות עדכוני ניתוב מיידיים, אחרת תצורת פרוקסי ידנית הופכת לצוואר בקבוק. אנו מגדירים את Traefik כפרוקסי הפוך דינמי במפתח מלא, תוך אוטומציה של גילוי שירותים והנפקת תעודות HTTPS. הצוות שלנו מטפל בכל המחזור—מביקורת ועד יישום ותמיכה שוטפת—ומספק פתרון אמין שגדל עם העסק שלך.

היכולות שלנו:

שאלות נפוצות

העבודות האחרונות

  • פיתוח אפליקציית ווב עבור FEEDME
    פיתוח אפליקציית ווב עבור FEEDME
    1359
  • פיתוח חנות מקוונת לחברת FURNORO
    פיתוח חנות מקוונת לחברת FURNORO
    1330
  • עיצוב לוגו לחברת B2B Advance
    עיצוב לוגו לחברת B2B Advance
    776
  • פיתוח אפליקציית ווב עבור Enviok
    פיתוח אפליקציית ווב עבור Enviok
    1077
  • פיתוח לוגו חברת AIDER
    פיתוח לוגו חברת AIDER
    1022
  • פיתוח CRM עבור Chasseurs
    פיתוח CRM עבור Chasseurs
    1113

אתה פורס מיקרוסרוויס חדש. תוך דקה הוא כבר זמין דרך HTTPS עם אישור אוטומטי — ללא עריכת תצורה או הפעלות מחדש של nginx. עבור סביבות דינמיות עם פריסות תכופות, זהו משנה משחק. Traefik פותר את "גיהנום התצורה": הוא קורא תצורה מ-Docker labels, Kubernetes Ingress, Consul או etcd בזמן אמת. עם ניסיון של למעלה מ-5 שנים ו-60+ פרויקטים מוצלחים של Traefik, הצוות שלנו של 15 מהנדסים מוסמכים מבטיח פתרון חזק וניתן להרחבה. השתמשנו ב-Traefik בסביבת production במשך למעלה מחמש שנים ואנחנו מכירים את כל הניואנסים. הגדרנו אותו עבור פרויקטים עם 50+ מיקרוסרוויסים, שבהם כל פריסה דרשה נתיבים חדשים — עדכון ידני של nginx לקח עד 30 דקות, עכשיו זה אפס שניות. חיסכון בזמן לכל פריסה: עד 40 שעות בחודש, ועלויות התפעול מופחתות ב-30–40%, מה שמתורגם לחיסכון של $4,000–$5,000 בחודש עבור פרויקטים טיפוסיים בגודל בינוני. עבור תצורת proxy דינמית שמתאימה את עצמה באופן מיידי, Traefik הוא הפתרון האידיאלי.

למה Traefik עדיף על nginx בסביבות דינמיות

מאפיין Traefik Nginx
גילוי אוטומטי של שירותים Docker, Kubernetes, Consul וכו' רק ידנית דרך קבצים
עדכוני נתיבים מיידית, ללא טעינה מחדש דורש טעינה מחדש (ניתוק חיבורים)
Let's Encrypt מובנה, אוטומטי דרך כלים של צד שלישי (certbot)
Middleware מובנה: auth, rate-limit, compression וכו' דרך Lua או מודולים של צד שלישי
ניטור מדדי Prometheus מחוץ לקופסה דורש הגדרה ידנית

Traefik מנצח פי 2–3 בזמן הפריסה עבור שירותים חדשים ומבטל שגיאות תצורה ידניות. המהנדסים שלנו מחזיקים בהסמכות Kubernetes ויש להם ניסיון בהעברה מ-nginx ל-Traefik. התיעוד הרשמי של Traefik מדווח שגילוי שירותים אוטומטי מפחית את זמן הגדרת הנתיבים ב-80%. עם למעלה מ-5,000 פריסות בחודש בקרב הלקוחות שלנו, ראינו הפחתה של 95% בשגיאות תצורה ו-p99 latency באופן עקבי מתחת ל-200ms. חיסכון בעלויות תפעול יכול להגיע ל-40%.

טעויות נפוצות בהגדרת Traefik

  • שכחת להשבית את exposedByDefault — שירותים פנימיים נחשפים לעולם החיצון. בסביבת production, תמיד הגדר --providers.docker.exposedbydefault=false. זה קריטי.
  • לא להגדיר rate limiting — שירותים קורסים תחת עומס. הגדר מגבלות לפי RPS ממוצע.
  • שימוש ב-HTTP challenge עבור Let's Encrypt ללא בדיקת זמינות פורט 80 — אישורים לא מונפקים. ודא שהפורט פתוח.
  • לא להפעיל ניטור — מאבדים נראות על שגיאות וצווארי בקבוק. מדדי Prometheus פותרים זאת.
  • שימוש ב-Ingress סטנדרטי במקום IngressRoute ב-Kubernetes — מאבדים גמישות של middlewares ונתיבי TCP.

איך אנחנו מגדירים Traefik במפתח פתוח

התהליך כולל חמישה שלבים:

  1. ביקורת תשתית: ניתוח נתיבים קיימים, עומסים, דרישות אבטחה. זיהוי צווארי בקבוק: CPU, זיכרון, מספר חיבורים.
  2. עיצוב: בחירת ספק (Docker, Kubernetes, קובץ), הגדרת entryPoints, middlewares, resolvers. הגדרת אסטרטגיית עדכון אישורים (HTTP או DNS-01).
  3. יישום: פריסת Traefik v3.0, אינטגרציה עם Let's Encrypt, הגדרת ניטור (Prometheus + Grafana). שימוש ב-sidecar containers עבור שירותים פנימיים.
  4. בדיקות: אימות גילוי אוטומטי, סובלנות לתקלות, rate-limiting. ביצוע בדיקות עומס ב-5000 RPS.
  5. פריסה ותיעוד: מסירת תצורה, runbook, הדרכת צוות (2–3 שעות). כולל תמיכה של שבועיים לאחר ההשקה.

מהם Middlewares ואיך להגדיר אותם

Middlewares הם שרשראות של handlers המוחלות על בקשות לפני העברתן לשירות. ל-Traefik יש מובנים: Basic Auth, Rate Limiting, compression, הפניית HTTPS, כותרות אבטחה. הם מוגדרים דרך labels ב-Docker Compose או דרך dynamic file provider. דוגמה: הגבל 100 בקשות בשנייה עם burst של 50.

Docker Compose: דוגמה מלאה לעבודה

---
# docker-compose.yml
services:
  traefik:
    image: traefik:v3.0
    command:
      - "--api.dashboard=true"
      - "--api.insecure=false"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.websecure.address=:443"
      - "--certificatesresolvers.letsencrypt.acme.httpchallenge=true"
      - "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web"
      - "[email protected]"
      - "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json"
      - "--log.level=INFO"
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./letsencrypt:/letsencrypt
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.dashboard.rule=Host(`traefik.example.com`)"
      - "traefik.http.routers.dashboard.tls.certresolver=letsencrypt"
      - "traefik.http.routers.dashboard.service=api@internal"
      - "traefik.http.routers.dashboard.middlewares=auth"
      - "traefik.http.middlewares.auth.basicauth.users=admin:$$apr1$$...$$..."
  app:
    image: myapp:latest
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.app.rule=Host(`example.com`)"
      - "traefik.http.routers.app.tls.certresolver=letsencrypt"
      - "traefik.http.routers.app.entrypoints=websecure"
      - "traefik.http.services.app.loadbalancer.server.port=3000"
      - "traefik.http.routers.app-redirect.rule=Host(`example.com`)"
      - "traefik.http.routers.app-redirect.entrypoints=web"
      - "traefik.http.routers.app-redirect.middlewares=redirect-to-https"
      - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"

# docker-compose.yml services: traefik: image: traefik:v3.0 command: - "--api.dashboard=true" - "--api.insecure=false" - "--providers.docker=true" - "--providers.docker.exposedbydefault=false" - "--entrypoints.web.address=:80" - "--entrypoints.websecure.address=:443" - "--certificatesresolvers.letsencrypt.acme.httpchallenge=true" - "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web" - "[email protected]" - "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json" - "--log.level=INFO" ports: - "80:80" - "443:443" volumes: - /var/run/docker.sock:/var/run/docker.sock:ro - ./letsencrypt:/letsencrypt labels: - "traefik.enable=true" - "traefik.http.routers.dashboard.rule=Host(`traefik.example.com`)" - "traefik.http.routers.dashboard.tls.certresolver=letsencrypt" - "traefik.http.routers.dashboard.service=api@internal" - "traefik.http.routers.dashboard.middlewares=auth" - "traefik.http.middlewares.auth.basicauth.users=admin:$$apr1$$...$$..." app: image: myapp:latest labels: - "traefik.enable=true" - "traefik.http.routers.app.rule=Host(`example.com`)" - "traefik.http.routers.app.tls.certresolver=letsencrypt" - "traefik.http.routers.app.entrypoints=websecure" - "traefik.http.services.app.loadbalancer.server.port=3000" - "traefik.http.routers.app-redirect.rule=Host(`example.com`)" - "traefik.http.routers.app-redirect.entrypoints=web" - "traefik.http.routers.app-redirect.middlewares=redirect-to-https" - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https" הוא קריטי בסביבת production — בלעדיו, כל container חדש מקבל נתיב אוטומטית, מה שעלול לחשוף שירותים לא רצויים כלפי חוץ.

תצורה סטטית דרך קובץ

לסביבות מורכבות, שורת הפקודה אינה נוחה. אנחנו משתמשים ב-exposedbydefault=false:

# /etc/traefik/traefik.yml
api:
  dashboard: true
log:
  level: INFO
  filePath: /var/log/traefik/traefik.log
accessLog:
  filePath: /var/log/traefik/access.log
  fields:
    defaultMode: keep
    names:
      ClientUsername: drop
entryPoints:
  web:
    address: ":80"
    http:
      redirections:
        entryPoint:
          to: websecure
          scheme: https
  websecure:
    address: ":443"
    http:
      tls:
        certResolver: letsencrypt
certificatesResolvers:
  letsencrypt:
    acme:
      email: [email protected]
      storage: /letsencrypt/acme.json
      httpChallenge:
        entryPoint: web
providers:
  docker:
    exposedByDefault: false
  file:
    directory: /etc/traefik/dynamic
    watch: true

Dynamic File Providers

# /etc/traefik/dynamic/middlewares.yml
http:
  middlewares:
    rate-limit:
      rateLimit:
        average: 100
        burst: 50
    compress:
      compress: {}
    security-headers:
      headers:
        stsSeconds: 31536000
        stsIncludeSubdomains: true
        contentTypeNosniff: true
        frameDeny: true
        customResponseHeaders:
          X-Robots-Tag: "noindex,nofollow,nosnippet,noarchive,notranslate,noimageindex"

Kubernetes: IngressRoute לעומת Ingress סטנדרטי

Traefik ב-Kubernetes תומך גם ב-traefik.yml הסטנדרטי וגם ב-CRD משלו # /etc/traefik/traefik.yml api: dashboard: true log: level: INFO filePath: /var/log/traefik/traefik.log accessLog: filePath: /var/log/traefik/access.log fields: defaultMode: keep names: ClientUsername: drop entryPoints: web: address: ":80" http: redirections: entryPoint: to: websecure scheme: https websecure: address: ":443" http: tls: certResolver: letsencrypt certificatesResolvers: letsencrypt: acme: email: [email protected] storage: /letsencrypt/acme.json httpChallenge: entryPoint: web providers: docker: exposedByDefault: false file: directory: /etc/traefik/dynamic watch: true . IngressRoute נותן גישה מלאה ל-middlewares, נתיבי TCP ואיזון עומסים. עבור הגדרות Kubernetes של Traefik, מומלץ להשתמש ב-IngressRoute לגמישות מרבית.

---
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
  name: myapp
spec:
  entryPoints:
    - websecure
  routes:
    - match: Host(`example.com`) && PathPrefix(`/api`)
      kind: Rule
      services:
        - name: myapp-service
          port: 3000
      middlewares:
        - name: rate-limit
  tls:
    certResolver: letsencrypt
---

ניטור

Traefik חושף מדדי Prometheus מחוץ לקופסה. פשוט הוסף לתצורה:

metrics: prometheus: addRoutersLabels: true addServicesLabels: true 

מדדים מרכזיים: # /etc/traefik/dynamic/middlewares.yml http: middlewares: rate-limit: rateLimit: average: 100 burst: 50 compress: compress: {} security-headers: headers: stsSeconds: 31536000 stsIncludeSubdomains: true contentTypeNosniff: true frameDeny: true customResponseHeaders: X-Robots-Tag: "noindex,nofollow,nosnippet,noarchive,notranslate,noimageindex" , Ingress, IngressRoute. על בסיס אלה, אנחנו בונים לוחות Grafana עם התראות עבור p99 latency > 500ms ושיעור שגיאות > 1%. יישום ניטור Traefik מבטיח זיהוי יזום של תקלות.

איך להבטיח סובלנות לתקלות של Traefik

לסביבות production, אנחנו משתמשים באשכול של מספר מופעי Traefik מאחורי load balancer (לדוגמה, AWS ALB). הגדר בדיקות בריאות דרך נקודת הקצה apiVersion: traefik.io/v1alpha1 kind: IngressRoute metadata: name: myapp spec: entryPoints: - websecure routes: - match: Host(`example.com`) && PathPrefix(`/api`) kind: Rule services: - name: myapp-service port: 3000 middlewares: - name: rate-limit tls: certResolver: letsencrypt . ב-Kubernetes, השתמש ב-Deployment עם replicas: 3 ו-PodDisruptionBudget. לאחסון acme.json, השתמש ב-PVC או אחסון מבוזר (etcd, Consul).

מה כלול בעבודה (תוצרים)

לאחר ההגדרה, אתה מקבל:

  • תצורת Traefik מוכנה עם Let's Encrypt (אינטגרציית Traefik Let's Encrypt);
  • עדכוני נתיבים אוטומטיים כאשר מתווספים שירותים חדשים;
  • הגנה על סביבות staging דרך Basic Auth;
  • ניטור והתראות (Prometheus/Grafana);
  • גישה ללוחות ניטור ו-Grafana;
  • תיעוד ו-runbook לתפעול;
  • הדרכת צוות (2–3 שעות);
  • תמיכה של שבועיים לאחר ההשקה.

שירות הגדרת Traefik שלנו מתחיל מ-$1,500, ומחזיר את עצמו בתוך החודש הראשון.

תהליך ולוחות זמנים

היקף זמן
Docker Compose, 3–5 שירותים יום אחד
+ Let's Encrypt, middlewares 2–3 ימים
Kubernetes + IngressRoute 3–5 ימים

העלות מחושבת באופן אישי לאחר ביקורת תשתית. צור קשר לייעוץ — המהנדסים שלנו יעריכו את הפרויקט שלך ויציעו פתרון במפתח פתוח. הזמן הגדרת Traefik וקבל תצורה מוכנה עם אבטחה וביצועים מובטחים.