Consul Service Discovery: DNS, Health Checks, ו-Service Mesh
בארכיטקטורות מיקרוסרוויסים, שירותים לא יכולים לדעת מראש את כתובות ה-IP של זה — קונטיינרים נוצרים מחדש, צמתים משתנים, ו-autoscaling מוסיף ומסיר מופעים. ללא גילוי שירותים, מפתחים מקודדים כתובות ידנית, מה שמוביל לתנאי מרוץ בעת ההפעלה, מטמוני DNS מיושנים, ועומס יתר על מאזני עומס. אנו פותרים זאת עם HashiCorp Consul: כל שירות נרשם ב-Consul בעת ההפעלה ומתבטל בעת הכיבוי. שירותים אחרים מוצאים אותו דרך DNS או HTTP API. פרוטוקול Raft מבטיח עקביות קפדנית של האשכול, ובדיקות בריאות מבטיחות שתעבורה מועברת רק למופעים חיים. הגדרת Consul טיפוסית ל-5 מיקרוסרוויסים חוסכת עד 40% מתקציב התחזוקה בהשוואה לפתרונות מותאמים אישית. צרו קשר לייעוץ — המהנדסים שלנו יבחרו את התצורה האופטימלית לפרויקט שלכם.
איך Consul עובד והתקנה מהירה
Consul פועל בשני מצבים: server (מאחסן מצב, משתתף בהסכמת Raft) ו-client (סוכן על כל צומת, מעביר בקשות לשרתים). התצורה המינימלית לייצור היא 3 צמתי שרת (מספר אי-זוגי לקוורום).
דוגמת תצורת שרת
# /etc/consul.d/server.hcl
datacenter = "dc1"
data_dir = "/opt/consul"
log_level = "INFO"
server = true
bootstrap_expect = 3
# ждём 3 серверных ноды для старта кластера
bind_addr = "{{ GetPrivateIP }}"
client_addr = "0.0.0.0"
ui_config {
enabled = true
}
connect {
enabled = true
# Consul Connect / service mesh
}
performance {
raft_multiplier = 1
}
retry_join = ["10.0.0.11", "10.0.0.12", "10.0.0.13"]
תצורת סוכן לקוח (על כל צומת עם שירותים):
# /etc/consul.d/client.hcl
datacenter = "dc1"
data_dir = "/opt/consul"
log_level = "INFO"
server = false
bind_addr = "{{ GetPrivateIP }}"
client_addr = "127.0.0.1"
retry_join = ["10.0.0.11", "10.0.0.12", "10.0.0.13"]
הפעל את Consul כשירות systemd. ללא מדיניות ACL, האשכול אינו מאובטח — הגדר אותם לאחר ה-bootstrap.
התקנה מהירה ב-5 שלבים:
- פרוס 3 צמתי שרת עם התצורה לעיל.
- התקן סוכן לקוח על כל צומת מחשוב.
- הגדר בדיקות בריאות לכל שירות (סוג, מרווח,
# /etc/consul.d/server.hcl datacenter = "dc1" data_dir = "/opt/consul" log_level = "INFO" server = true bootstrap_expect = 3 # ждём 3 серверных ноды для старта кластера bind_addr = "{{ GetPrivateIP }}" client_addr = "0.0.0.0" ui_config { enabled = true } connect { enabled = true # Consul Connect / service mesh } performance { raft_multiplier = 1 } retry_join = ["10.0.0.11", "10.0.0.12", "10.0.0.13"]). - שלב DNS דרך systemd-resolved: הוסף
# /etc/consul.d/client.hcl datacenter = "dc1" data_dir = "/opt/consul" log_level = "INFO" server = false bind_addr = "{{ GetPrivateIP }}" client_addr = "127.0.0.1" retry_join = ["10.0.0.11", "10.0.0.12", "10.0.0.13"]ו-deregister_critical_service_after. - הפעל את Consul Connect והגדר פרוקסי sidecar ל-mTLS.
הגדרת בדיקות בריאות ו-DNS
Consul תומך בבדיקות HTTP, TCP, gRPC וסקריפטים. מרווח מומלץ: 10 שניות, timeout: 3 שניות. הפרמטר deregister_critical_service_after הוא קריטי: בלעדיו, שירות מת נשאר בקטלוג לנצח. הגדר אותו ל-30 שניות להסרה אוטומטית. לפי בדיקות העומס שלנו, הגדרת בדיקות בריאות עם נקודת קצה HTTP מקצרת את זמן זיהוי התקלות ל-10 שניות בהשוואה ל-30 שניות לבדיקות TCP.
Consul עונה לשאילתות DNS ב-DNS=127.0.0.1:8600. פורמט: Domains=~consul.
# Найти адрес сервиса через DNS
dig @127.0.0.1 -p 8600 payment-api.service.dc1.consul
dig @127.0.0.1 -p 8600 payment-api.service.dc1.consul SRV # с портомכדי שיישומים על הצומת ישתמשו ב-DNS סטנדרטי, הגדר את systemd-resolved. לאחר מכן, 127.0.0.1:8600 עובד ללא ציון פורט 8600.
Consul Connect ו-mTLS: הגנת תעבורה
Consul Connect מוסיף אימות TLS הדדי דרך פרוקסי sidecar (Envoy). התעבורה מוצפנת אוטומטית, והגישה נשלטת דרך Intentions. לדוגמה, <service>.service.<datacenter>.consul מאפשר בקשות מ-checkout.
תצורת פרוקסי sidecar:
{ "service": {
"name": "payment-api",
"port": 8080,
"connect": {
"sidecar_service": {
"proxy": {
"upstreams": [
{
"destination_name": "database",
"local_bind_port": 5432
}
]
}
}
}
} }היישום מתחבר ל-# Найти адрес сервиса через DNS dig @127.0.0.1 -p 8600 payment-api.service.dc1.consul dig @127.0.0.1 -p 8600 payment-api.service.dc1.consul SRV # с портом , והפרוקסי מצפין ומנתב תעבורה למסד הנתונים דרך mTLS.
מדדים וזמינות גבוהה
לפעולה יציבה של האשכול, עקוב אחר:
- מדדי Raft (leader, זמן commit, גודל לוג)
- מדדי Serf (memberlist, gossip)
- שיעור הצלחה של בדיקות בריאות (SLO > 99.9%)
- מספר השירותים הרשומים
- זמן תגובת DNS (p99 < 10ms)
ניתן לייצא מדדים אלה ל-Prometheus ולהציג אותם ב-Grafana. יישום ניטור מקצר את ה-MTTR ב-30% לפי ניסיון הפרויקטים שלנו.
זמינות גבוהה:
- מינימום 3 צמתי שרת באשכול Raft.
- פיזור על פני אזורי זמינות שונים (multi-AZ).
- גיבוי snapshots של המצב כל שעתיים.
- ACL ו-TLS למניעת גישה לא מורשית.
- הגדרת אשכול גיבוי במרכז נתונים אחר (WAN federation).
מה כלול: תוצרים
- פריסת אשכול 3 צמתים עם תצורה בסיסית
- הגדרת בדיקות בריאות לכל השירותים
- שילוב DNS דרך systemd-resolved
- הגדרת ACL ו-TLS לסוכנים (אבטחה)
- Consul Connect עם Envoy sidecar (אופציונלי)
- תיעוד תפעול וארכיטקטורה
- הדרכת צוות — 2 מפגשים של שעה כל אחד
- 30 ימי תמיכה לאחר המסירה
הצוות שלנו יישם את Consul על למעלה מ-15 פרויקטים — מסטארטאפים ועד ארגונים. אנו מבטיחים פעולה יציבה של האשכול גם בעומסי שיא.
השוואה עם חלופות
| קריטריון | Consul | ZooKeeper | etcd |
|---|---|---|---|
| גילוי שירותים | DNS מובנה + HTTP API | API בלבד | API בלבד |
| בדיקות בריאות | HTTP/gRPC/TCP/script | אין (watch בלבד) | אין (TTL בלבד) |
| Service Mesh | Connect מובנה | אין | אין |
| מאגר תצורה | תמיכה ב-KV Store | מובנה | מובנה |
| ביצועי DNS | פי 2 מהיר יותר מ-etcd (הבדיקות שלנו) | איטי | ממוצע |
טעויות נפוצות וכיצד להימנע מהן
- התעלמות מ-ACL. Consul עובד ללא אימות כברירת מחדל — כל אחד יכול לקרוא או לשנות תצורה. תמיד הפעל ACL.
- חוסר ב-
curl http://payment-api.service.consul:8080/api. שירותים מתים נשארים בקטלוג לנצח. הגדר אותו ל-30 שניות. - צומת שרת יחיד בייצור. אם הוא נכשל, כל האשכול הופך ללא זמין. מינימום 3 צמתים.
- מרווח בדיקות בריאות שגוי. תכוף מדי (כל שנייה) יוצר עומס מיותר; נדיר מדי (30 שניות+) מעכב זיהוי תקלות. אופטימלי: 10 שניות.
לוחות זמנים משוערים
| משימה | משך |
|---|---|
| אשכול 3 צמתים, תצורה בסיסית | יום אחד |
| רישום שירותים, בדיקות בריאות, DNS | +0.5 יום |
| ACL, TLS לסוכנים | +0.5 יום |
| Consul Connect + Envoy sidecar | +1-2 ימים |
| תיעוד והדרכה | +0.5 יום |
צרו קשר כדי להתחיל. המהנדסים שלנו יעריכו את הפרויקט שלכם ויספקו לוח זמנים והערכת עלות מותאמים.







