Envoy Proxy: הגדרת circuit breaking, xDS ו-tracing

ככל שארכיטקטורות מיקרוסרוויסים גדלות, פרוקסים סטטיים נכשלים בטיפול בגילוי שירות דינמי ודורשים טעינות ידניות. אנו מגדירים את Envoy Proxy כ-data plane, מיישמים circuit breaking, xDS API ו-tracing כך שהתשתית שלך מסתגלת לשינויים ללא השבתה. הצוות שלנו מספק את הפרויקט במפתח מלא—מביקורת ועד תמיכה שוטפת—ומבטיח פעולה אמינה ב-Kubernetes ו-Service Mesh.

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

שאלות נפוצות

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

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

נתקלנו במצבים שבהם HAProxy התקשה עם גילוי שירותים דינמי ב-Kubernetes. ניסיונות חוזרים עם jitter לא היו זמינים, והיה צורך לטעון מחדש את התצורה ידנית. זה הרגע שבו יישמנו את Envoy כ-data plane — וקיבלנו את הגמישות שחסרה. Envoy הוא לא רק פרוקסי; הוא פלטפורמה מלאה לארכיטקטורות מיקרוסרוויסים. הוא תומך בגילוי upstream דינמי דרך xDS API, מעקב בקשות מובנה, circuit breaking עם זיהוי חריגים (outlier detection), וניסיונות חוזרים עם jitter. כל עדכוני התצורה מתבצעים ללא הפעלות מחדש. זו הסיבה ש-Envoy מפעיל את Istio, Consul Connect ו-AWS App Mesh. למהנדסים שלנו יש ניסיון של 5+ שנים והם השלימו 30+ פרויקטי DevOps, מה שמבטיח יישום איכותי. בקשו ייעוץ כדי לדון בשילוב Envoy בתשתית שלכם. עלות הפרויקט נקבעת באופן אישי לאחר ביקורת (audit).

תצורה סטטית: התחלה ללא control plane

להתחלה פשוטה ללא service mesh, תצורה סטטית מספיקה. הנה הגדרה מינימלית עם מדיניות ניסיונות חוזרים:

# envoy.yaml
static_resources:
  listeners:
  - name: listener_0
    address:
      socket_address:
        address: 0.0.0.0
        port_value: 10000
    filter_chains:
    - filters:
      - name: envoy.filters.network.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
          stat_prefix: ingress_http
          codec_type: AUTO
          route_config:
            name: local_route
            virtual_hosts:
            - name: backend
              domains: ["*"]
              routes:
              - match:
                  prefix: "/api/"
                route:
                  cluster: api_service
                  prefix_rewrite: "/"
                  timeout: 30s
                  retry_policy:
                    retry_on: "5xx,connect-failure"
                    num_retries: 3
                    retry_host_predicate:
                    - name: envoy.retry_host_predicates.previous_hosts
                    host_selection_retry_max_attempts: 3
              - match:
                  prefix: "/"
                route:
                  cluster: app_service
          http_filters:
          - name: envoy.filters.http.router
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
  clusters:
  - name: api_service
    connect_timeout: 5s
    type: STRICT_DNS
    lb_policy: LEAST_REQUEST
    load_assignment:
      cluster_name: api_service
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: api-service
                port_value: 8080
  - name: app_service
    connect_timeout: 5s
    type: STRICT_DNS
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: app_service
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: app-service
                port_value: 3000
        - endpoint:
            address:
              socket_address:
                address: app-service-2
                port_value: 3000
admin:
  address:
    socket_address:
      address: 0.0.0.0
      port_value: 9901

הרצה עם Docker:

docker run -d \
 -p 10000:10000 \
 -p 9901:9901 \
 -v ./envoy.yaml:/etc/envoy/envoy.yaml \
 envoyproxy/envoy:v1.29-latest \
 -c /etc/envoy/envoy.yaml

Circuit breaking: מניעת כשלים מדורגים

כאשר שירות מתחיל להאט או להיכשל, לקוחות (מיקרוסרוויסים אחרים) יכולים לצבור בקשות בתורים, מה שגורם לכשל מדורג. מפסקי מעגלים (Circuit breakers) ב-Envoy עוקבים אחר בריאות ה-upstream ומפסיקים לשלוח בקשות למארחים בעייתיים. דוגמת תצורה:

clusters:
  - name: payment_service
    connect_timeout: 2s
    circuit_breakers:
      thresholds:
        - priority: DEFAULT
          max_connections: 1000
          max_pending_requests: 500
          max_requests: 1000
          max_retries: 3
          track_remaining: true
    outlier_detection:
      consecutive_5xx: 5
      interval: 10s
      base_ejection_time: 30s
      max_ejection_percent: 50
      consecutive_gateway_failure: 3
      enforcing_consecutive_5xx: 100

זיהוי חריגים (Outlier Detection): אם מארח מחזיר 5 שגיאות 5xx רצופות, הוא מוסר מהמאגר למשך 30 שניות. Envoy שולח לאחר מכן בקשת בדיקה — עם הצלחה, המארח חוזר.

כיצד זיהוי חריגים משפר את סובלנות התקלות?

זיהוי חריגים ב-Envoy עוקב לא רק אחרי 5xx אלא גם אחרי כשלי gateway, כשלי חיבור וזמן תגובה. כאשר חריגים מהסף, המארח מוחרג מאיזון העומס לזמן מוגדר. זה מונע כשלים מדורגים ומפחית את ה-MTTR. בהשוואה ל-HAProxy, שבו נדרש scripting ידני, Envoy מספק פתרון מוכן הניתן להגדרה דרך YAML.

השוואה עם חלופות: Envoy מול HAProxy ו-nginx

Envoy מציע פי 3 יותר מדדים מאשר nginx, אך נופל מ-HAProxy בתפוקה גולמית (~200k בקשות/שנייה לליבה לעומת ~300k). עם זאת, גמישות ויכולת תצפית (observability) הופכות אותו למועדף לרשתות מיקרוסרוויסים מורכבות.

פרמטר Envoy HAProxy nginx
תצורה דינמית xDS API, ללא הפעלה מחדש רק דרך סקריפטים של Lua רק טעינה מחדש
Circuit breaking מובנה + זיהוי חריגים סקריפטים ידניים לא קיים
מעקב (Tracing) Zipkin, Jaeger, Datadog מובנים לא קיים דרך מודולים
מספר מדדים 1000+ דרך נקודת קצה admin 200+ 100+
תפוקה (בקשות/שנייה) ~200k לליבה ~300k לליבה ~150k לליבה

Circuit breaking ב-Envoy עובד ביעילות כפולה בהשוואה לפתרון ידני על HAProxy, ומעקב זמין מיד ללא מודולים נוספים. לפרויקט מותאם אישית, צרו קשר.

Envoy כ-sidecar ב-Kubernetes

התבנית הקלאסית היא Envoy לצד כל pod:

# kubernetes deployment (фрагмент)
spec:
  containers:
    - name: app
      image: myapp:latest
      ports:
        - containerPort: 8080
    - name: envoy
      image: envoyproxy/envoy:v1.29-latest
      args:
        - "-c"
        - "/etc/envoy/envoy.yaml"
      ports:
        - containerPort: 10000
          name: proxy
        - containerPort: 9901
          name: admin
      volumeMounts:
        - name: envoy-config
          mountPath: /etc/envoy
  volumes:
    - name: envoy-config
      configMap:
        name: envoy-config

ללא Istio, ה-sidecar מוגדר ידנית. עם Istio, Envoy מוזרק אוטומטית דרך MutatingWebhookConfiguration, והתצורה מגיעה מ-Istiod דרך xDS.

כיצד xDS מפשט את ניהול התצורה?

לתשתית production עם עשרות שירותים, תצורה סטטית לא מתאימה לקנה מידה. xDS API מאפשר ל-control plane (Consul, Pilot ב-Istio) לעדכן תצורה דינמית ללא הפעלות מחדש:

# envoy-dynamic.yaml — только bootstrap, остальное через xDS
dynamic_resources:
  lds_config:
    resource_api_version: V3
    api_config_source:
      api_type: GRPC
      transport_api_version: V3
      grpc_services:
        - envoy_grpc:
            cluster_name: xds_cluster
  cds_config:
    resource_api_version: V3
    api_config_source:
      api_type: GRPC
      transport_api_version: V3
      grpc_services:
        - envoy_grpc:
            cluster_name: xds_cluster
static_resources:
  clusters:
    - name: xds_cluster
      connect_timeout: 5s
      type: STATIC
      load_assignment:
        cluster_name: xds_cluster
        endpoints:
          - lb_endpoints:
              - endpoint:
                  address:
                    socket_address:
                      address: control-plane.example.com
                      port_value: 18000

עם xDS, ניתן לשנות נתיבים, להוסיף שירותי upstream ולעדכן מדיניות ללא הפעלה מחדש. זה חשוב במיוחד לפריסות canary ולבדיקות A/B.

תהליך היישום שלנו

אנחנו עובדים בשלבים:

  1. ביקורת של הארכיטקטורה הנוכחית (1-2 ימים).
  2. עיצוב תצורה עם circuit breaking ומעקב.
  3. יישום בסביבת staging עם בדיקות עומס.
  4. פריסה ל-production עם העברת תעבורה הדרגתית.
  5. תיעוד והדרכת צוות.

התוצאה: תשתית Envoy מוכנה (סטטית או מבוססת xDS), אינטגרציה עם Istio, Consul או control plane אחר, ניטור והתראות (Prometheus + Grafana, דשבורדים), runbook תפעולי ו-2 שבועות של תמיכה לאחר מסירה. מהנדסים מוסמכים מבטיחים יציבות וביצועים.

לוח זמנים

משימה משך זמן
ביקורת ועיצוב 1-2 ימים
תצורה סטטית, פרוקסי בסיסי יום אחד
Circuit breaking + מעקב 1-2 ימים
xDS עם Consul/Pilot, תצורה דינמית 2-3 ימים
Service mesh מלא + ניטור + תיעוד 4-7 ימים

תקציב הפרויקט מחושב באופן אישי לאחר ביקורת. קבלו ייעוץ — צרו קשר, ונכין הערכה ראשונית.