Table of Contents
הקדמה: למה לנסח דברים במיקרו-שירותים
באדריכלות מיקרו-שירותים מודרניים, חסימה היא עמוד השדרה של observability.ללא אסטרטגיה של קידוד קוהרנטי, מחיקת כישלון מבוזר הופכת לסיוט של פעמים מפוזרות, נעדרים ההקשר, ופורמטים לא מתאימים.תבנית ה-oneton, דפוס עיצוב קלאסי, מציע פתרון אלגנטי: יחיד, משותף, לדוגמה, שכל השירותים לתוך הזנת בשילוב עם Kubernetes, מספק גישה מרכזית זו עם קנה עקבית.
מאמר זה מרחיב את הרעיון המקורי, צלילה עמוק לתוך פרטי יישום, עסקאות, ייצור שיטות הטובות ביותר.אנחנו לחקור כיצד לעצב שירות חדטון logging Kubernetes, למה זה עובד, וכאשר זה לא יכול להיות הבחירה הנכונה.עד הסוף, יהיה לך מפת דרכים ברורה לפרוס חד פעמית על פני צי המיקרו-שירותים שלך.
עיצוב יחיד: A Quickמרעננים
דפוס הטון מגביל מעמד לדוגמה אחת ומספק נקודת גישה גלובלית אליו.בעיצוב תוכנה, הוא שולט במשאבים משותפים כמו תצורה, בריכות חוט, או - כפי שאנו מתמקדים כאן - כניסה. בהקשר מיקרו-שירותים, מקרה הרישום של הטון מבטיח שכל כניסה מכל שירות זורם לאותו יעד, שמירה על הסדר וביטול של לוגיקה של רגולציה.
מבקרים לעתים קרובות מזהירים מפני שימוש בסינגלונים מכיוון שהם מציגים את המצב העולמי ואת התלויות הנסתרות.עם זאת, כאשר הם מוחלים על צינור ללא מדינה, היתרונות עולים על החסרונות.שירות הכניסה עצמו הוא שוקע ללא מדינה; הטון חל רק על שכבת ההסרה וההבהבה, לא על לוגיקה עסקית. קצב זה שומר את התבנית המעשית עבור מערכות מבוזרות.
יצירת אתגרים ייחודיים למיקרו-שירותים
קידוד מונוליטי מסורתי כותב לקובץ יחיד על דיסק. Microservices מנפץ את הפשטות הזו.כאן האתגרים המרכזיים שאנו שואפים לפתור עם גישה חד-טון:
- (ב) כל שירות כותב יומניו שלו, לעתים קרובות לאחסון מקומי או עוקץ, מה שהופך את המעבר בין-שירותי עבודה קשה.
- (FLT:0) פורמטים עקביים FLT:1 - צוותים עשויים להשתמש בספריות יומניות שונות, סגנונות פלט (JSON vs. טקסט רגיל), ורמות של הגשמה.
- (ב) ,0) גדל נפחFLT:1 - עם עשרות או מאות מקרים של שירות, ביוץ ועלויות אחסון ללא שליטה מרכזית.
- (FLT:0)קונטקסט קורלציה FLT:1 - בקשה למשתמש יחיד עשויה להבה על פני שירותים מרובים; יומני חייב לשאת תעודות זהות מקבילות כדי לשחזר את שרשרת.
- (ב) ,0) מורכבות תפעולית (FLT:1) – איסוף, קידוד וחיפושיות של מאגרי הסביבה מבוזרת, אמפירית כמו Kubernetes אינה טריוויאלית.
דפוס הכניסה של הטון מתייחס ישירות לפיצול וחוסר עקביות על ידי funneling כל יומני דרך צינור סטנדרטי אחד. in Kubernetes, הצינור הזה הופך ליחידה מנוהלת: פוד או שירות יחיד.
אדריכלות: Singleton Logging Service in Kubernetes
Kubernetes מציע דרכים מרובות להפעיל סוכן יחיד לרישום יחידטון.הפשוט ביותר הוא Deployment או StatefulSet עם FLT:0, מאחורי שירות לתגליות פנימיות.עם זאת, יחיד אמיתי דורש יותר מאשר רק ספירה העתקה - עליך למנוע מקרים מרובים מקריים מקריים מלהיות מתוכנן על נקודות שונות במהלך עדכונים או חלוקת רשתות מתגלגלות.
תמונה 1: Singleton Aggregator (Deployment)
§ Deploy agregator ייעודי - לדוגמה, Fluentd, Logstash, או שירות מותאם אישית - כ-replica Deployment. Microservices לשלוח יומני מעל HTTP, gRPC, או באמצעות צומת צד הפונה ל aggregator. aggregator pares, מעשירים, ו-Gates קדימה לאחסון ארוך טווח (Llastic Cloud), Loki).
המודל הזה פשוט להיגיון אבל מציג נקודה אחת של כשל וצוואר בקבוק.כדי לצמצם, להשתמש בנפח מתמשך כדי לטבול יומני המקומי אם הטון מתרסק, ולהסתמך על Liveness / readness של קובראנטס כדי לחדש אותו במהירות.עבור זמינות גבוהה, לשקול פאסיבי פעיל עם נקבובית שנייה רק מפעיל על כישלון - למרות שזה כפול הרעיון הבודד.
אפשרות 2: Sidecar-Per-Per-Service with Joint Forwarder
במקום שירותים שולחים יומני ישירות, כל שירות פועל מיכל צד (למשל, פלורנט קל משקל Bit) כי זנב את יומני של המכולה הראשי וספינות אותם למגרש הבודדטון.זה decouples מפורמט מלוגיקה עסקית ומאפשר ל-Fedbuffering.תבנית ה-sidecar היא נפוצה בייצור כי זה לא דורש שירותים כדי ליישם לקוח מותאם אישית.
⁇ 3: DaemonSet at Node Level - האנטי-Singleton?
Kubernetes (FLT:0) DaemonSetssetssssert 1 ; זה הגישה הסטנדרטית עבור סוכני כניסה ברמה של node-level (למשל, lingd-daemonset, lingbit-daemonset) בעוד לא אחד מופץ (כיוון שללאד מרובים יש עותק), הוא מספק per-de aggation לפני השכבה מרכזית של אספן אחד יכול להיות משולב עם אחד, אבל אחד, אבל אחד, אבל הוא אחד, אבל הוא אחד, 000 אחד, אבל הוא יכול להיות משולב אחד, אבל הוא יכול להיות אספן אחד, אבל אחד, אבל אחד, אבל הוא אחד, 000 אחד, 000 אחד, 000 אחד, אבל הוא יכול להיות משולב, 000 אחד, 000 אחד, 000 אחד, אבל הוא יכול להיות משולב.
אנו נתמקד בגישה של ה-oneton של ה-Aggregator המרכזית מכיוון שהיא הכי טובה לאכוף כיור יחיד הגיוני.
עקבו אחרי Singleton Behavior in Kubernetes
Kubernetes אינו מאויש על ידי אחד רץ פוד עבור פיזור על כישלונות של אשכול - אם מת צומת, הפוד הוא לשחזר על צומת אחר, אבל במהלך המעבר הזה אתה יכול להיות שני פודים בקצרה.
- (ב) [ה]] ב[[1924]], [[1924]]]], [[1924]]]]]], [[1924]]]]]]]], [[1924]]]]]]]]]]]]]]]]]], [[1924]]]]]]]]]]]]]], [[1924]]]]]]]]]]]]]], [[1924]]]]]]]]]]]]]], [[1924]]]]]]]]]]]]]]]]
- (ב) (ב) ,0) או מנהיג בחירות (החלל) 1:1 - השתמש באובייקט Kubernetes Lease (באמצעות FLT 3: 3) כדי לבחור מנהיג בין קבוצה של פודונים פוטנציאליים.
- (FLT:0) קובעי רוח עם Persistent Volume ProcioFLT:1) - A StatefulSet עם עותק אחד ו PVC מבטיח שרק אחד מהם יכול לכתוב לנפח הנתונים.אם שני פוצים מתחילים, השני לא יחייב את PVC.זה גם מספק עדכונים מתגלגלים, צמצום הסיכוי של מקרים כפולים.
- (FLT:0)Custom OperatoratorFLT:1 - כותב מפעיל Kubernetes שמנהל משאב חד-משמעי, מתנפח באופן פעיל או הורג פודים נוספים.
בפועל, עבור כניסה, התפלגות יחיד-החלופה עם בדיקות חיות וחקירה של מוכנות כי רק עובר כאשר הטון מוכן מספיק עבור רוב התרחישים.אם למקבץ שלך יש FLT:0PodDisruptionBudgetsFLT:1, להגדיר FLT:4 כדי למנוע פינוי מרצון של יחידון.
שלב-בי-Step: § Aggregator
בואו נלך באמצעות יישום קונקרטי באמצעות פלורנטיד כמאגר הבודד של ה-Foneton. Fluentd הוא אספן נתונים קוד פתוח פופולרי עם תמיכה חזקה Kubernetes.
1. ליצור התקוממות פלוגדור
Define a ConfigMap for Fluentd שמקשיב בנמל (למשל, 9880) עבור יומני מיקרו-שירותים ומקדם אותם אל-אסליקוס או עוד גב לאחור.
apiVersion: v1
kind: ConfigMap
metadata:
name: fluentd-config
data:
fluent.conf: |
<source>
@type http
port 9880
bind 0.0.0.0
body_size_limit 32m
keepalive_timeout 10s
</source>
<match **>
@type elasticsearch
host elasticsearch-logging
port 9200
logstash_format true
flush_interval 5s
</match>
Define the Singleton Deployment with Anti-Affinity
apiVersion: apps/v1
kind: Deployment
metadata:
name: fluentd-singleton
spec:
replicas: 1
selector:
matchLabels:
app: fluentd-singleton
template:
metadata:
labels:
app: fluentd-singleton
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- fluentd-singleton
topologyKey: kubernetes.io/hostname
containers:
- name: fluentd
image: fluent/fluentd:v1.16-1
ports:
- containerPort: 9880
volumeMounts:
- name: config
mountPath: /fluentd/etc
volumes:
- name: config
configMap:
name: fluentd-config
האנטי-תועלת הזו מונעת משני פודונים לרוץ על אותה צומת, אך אינה מונעת מהם על צומתים שונים.
3.החשוף את הסינגלטון באמצעות שירות ללא ראש
שירות ללא ראש מאפשר ל-DNS עגול-רובין על פני הפודונים, אך אנו רוצים רק נקודת קצה אחת. השתמש בשירות סטנדרטי של ClusterIP:
apiVersion: v1
kind: Service
metadata:
name: fluentd-svc
spec:
selector:
app: fluentd-singleton
ports:
- port: 9880
targetPort: 9880
מיקרו-שירות יכול לשלוח לו יומני ל-FLT:8
4.הגדירו מיקרו-שירותי שלח Logs
כל מיקרו-שירות צריך לכתוב כדי להזיז / צ'רדר (הדרך של Kubernetes) מיכל של סובייקט סטרלינג להרים את הלוגים האלה ושולח אותם לשירות של פלויד הבודדטון. לחלופין, היישום עצמו יכול לשלוח לוויות JSON ישירות באמצעות לקוח HTTP ל-FLT:9 לעקביות, אנו ממליצים על שיטת ה- Sidecar כדי למנוע שינוי קוד.
דוגמה להגדרה של מיכל צדא באותה פוד:
containers:
- name: app
image: myapp
...
- name: fluentbit-sidecar
image: fluent/fluent-bit:latest
args: ["-c", "/etc/fluent-bit.conf"]
volumeMounts:
- name: varlog
mountPath: /var/log
env:
- name: FLUENTD_HOST
value: "fluentd-svc"
- name: FLUENTD_PORT
value: "9880"
התצורה של ה-Blowion של Fluent Bit מציגה את קובץ ה- log של היישום או קריאה מנהג הלוגן של דוקר, ואז מעבירה את הסינגלטון.
תגובות על Deeper Dive
(ב) ב[[1824]], [[1924]]]], [[1924]]]]]], [[1924]]]]]], [[1924]]]]]], [[1924]]]]]]]]]]]]]], [[1924]]]]]]]]]]]]]], [[1924]]]]]]]]]]]]]], [[1924]]]]]]]]]]]], [[1924]]]]]]]]]]]]]]]]]], [[1924]]]]]]]]]]]]]], [[1924]]]]]]]], [[1924]]]]]]]]]]]]]]]]]]]]]]]]]]]]]], [[1924]]]]]]]]]]]]]]]], [[1924]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
היתרונות של Singleton Logging (Expanded)
- (ב) ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
- (ב) ,0) הוכח כי מדיניות שימור הלוגים המרכזית קלה יותר לאכיפת כל הצי.
- (ב) [ה]התשתיות של ה-ULT:0] ל-[[1924]], במקום כל שירות שמנהל את ספינת הגונד שלו (עם צנרת כפולה ומחסן), הטון מטפל במגירה, ומפחית את פני השטח.
- (ב) ויקרא י"א: "לא צריך להצטרף למקורות מרובים אלא אם כן תבחר.
- (ב) ,0) רמות של קידוד עקביות (FLT:1) - הטון יכול לאכוף את סף רמת הגלם העולמית (למשל, רק FLT:11 ומעלה בייצור) או להזריק תעודות זהות באופן אוטומטי.
- (FLT:0) מקורות בידוד של ההרחבה:1 - ניתן להקצות את הפודטון בקשות משאבים ומגבלות, להבטיח שיש לו מספיק CPU / זיכרון כדי לטפל בעומס, עצמאי של פוד יישומים.
• מסחר-offs ומתי להימנע מ- Singleton Logging
אין אדריכלות מושלמת. Singleton logging מציג כמה מערות:
- (ב) אם הפעוט של ה-FLT:1, אם ה-oneton pod מת, יומני אבודים (אלא אם כן אתה מנוקב בצד הלקוח) בסביבות בעלות גבוהה, אפילו כמה שניות של זמן למטה יכול להפיל אלפי שורות יומן.
- (FLT:0)Bottleneck CapacityFLT:1 - מקרה אחד פלויד חייב להתמודד עם כל התנועה של הגיטואל.בכמויות גבוהות מאוד (מאות של ג'יגהבייט ליום), אתה צריך בקנה מידה אנכי או לעבור ל aggregator מבוזר כמו קפקא מול הטון, אשר שובר את התבנית של טוטון טהור.
- (ב) ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
- (FLT:0) המורכבות של יחידון אמיתי 1 ; Achieving בדיוק מקרה אחד פועל תחת כל תנאי הכישלון (ללא יוצא, עדכון מתגלגל, מוחץ) דורש בחירות מנהיג או מנעול חיצוני, הוספת נטל תפעולי.
- (FLT:0) גמישות רבה (FLT:1) - צוותים שרוצים לשלוח יומנים לחזרות שונות (Dev vs. Prod, או שירותים ניסיוניים) עשויים למצוא אחד נוקשה מדי.
שקול דפוסים חלופיים אם אשכול שלך גדל מעבר ל-20-50 צמתים או אם נפח כניסה עולה על מה שפוד אחד יכול להתמודד עם.FLT:0;0)DaemonSet + Central StorageFLT:1 דפוס הוא תקן דה פקדו עבור אשכולות גדולים. השתמש בסינגלטון רק כאשר אתה צריך עקביות חזקה על פני צי מיקרו-שירות קטן-מול, או כמושלים לרמה של שאילתות עדיין שאילתות ברמה עולמית.
Best Practices for Singleton Logging in הפקה
שימוש ב-Moderd Logging from Applications
(ג) עודדו את כל השירותים לפלט ⁇ בפורמט מובנה (ג'ון) עם שדות עקביים: (FLT:12, 13; 13; 13) ,FLT:15, 15,FLT:16, FLT:16, ניתן ליישב, אינדקס, מסונן ללא ניחושים.
שם מקור: Survive Singleton Outages
ב-[[1924]], [[1924]], [[1924]], [[1924]]]], [[1924]]]], [[1924]]]]]], [[1924]]]]]]]]]], [[1924]]]]]]]], [[1924]]]]]]]]]]]]]], [[1924]]]]]]]]]], [[1924]]]]]]]]]]]]]]
עקבו אחרי Singleton's Health
הגדר מדדי פרוטות עבור הטון (כלומר, מספר אירועים מעובדים, שיעור שגיאות, גודל buffer) ליצור התראות עבור כאשר ה-buffer ממלא או כאשר ה-oneton מפסיק לקבל יומני. השתמש KubernetesFLT:24 אינו חל על יחידטון, אלא על ידי כוונון אנכי (VPA) יכול להתאים את המשאבים.
יישום Retry and Backpressure
צינור הכניסה צריך לטפל בגיבוי קדמית.אם הטון מוצפת, זה צריך להחזיר 429 יותר מדי בקשות רבות, ולקוחות (או מחסומים) צריכים ליישם את ההיפוף האקספוננציאלי.
להבטיח את התוקפנות
חשוף את שירות הטון רק בתוך אשכול (ClusterIP) אם עליך לחשוף חיצוני, להגביל את NetworkPolicies ולהשתמש ב-TLS לצורך תחבורה ציבורית.
ארכיון תגיות: Stateless Singleton with Buffer Layer
כדי להתגבר על הדאגה לצוואר הבקבוק, לשקול להוסיף שכבת כפייה כמו FLT:0KafkaphaFLT 1 או FLT:2 RedisFLT 3 לפני ה-oneton. Microservices (או Sidecars) לכתוב לנושאים של קפקאטון לצרוך מחלוק נושא אחד, ולהבטיח עיבוד על ידי ה-Acoptto עצמו הוא בגדר בעיה, אך ורק על ידי שמירה על מערכת אחסון חד פעמית, תוך שמירה על לחץ דם יחיד.
מסקנה
יישום דפוס בודדטון עבור כניסה במיקרו-שירותים עם Kubernetes מספק צינור נקי, עקבי, ולנהל את הצנרת עבור אשכולות של קנה מידה מתון. על ידי ריכוז של גרף לתוך מקרה אחד, אתה להפחית פיצול, לאכוף פורמט אחיד, ופשט את פתרון בעיות מבוזר.עם זאת, זה דורש תשומת לב זהירה לזמינות, בחירות, ודרגת משאבים רבים, משמש רק דפוס אחד גדול כדי להצדיק את הערימה מלאה.
קח את הזמן להעריך את נפח הכניסה שלך, סובלנות כשלון, ומומחיות הצוות.חשב החל עם אגרטור חד פעמי, ולאחר מכן להתפתח לקראת אספן מבוסס DaemonSet כיור מרכזי ככל הצרכים שלך להרחיב.