נתקלנו במצבים שבהם 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-2 ימים).
- עיצוב תצורה עם circuit breaking ומעקב.
- יישום בסביבת staging עם בדיקות עומס.
- פריסה ל-production עם העברת תעבורה הדרגתית.
- תיעוד והדרכת צוות.
התוצאה: תשתית 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 ימים |
תקציב הפרויקט מחושב באופן אישי לאחר ביקורת. קבלו ייעוץ — צרו קשר, ונכין הערכה ראשונית.







