लॉग पाइपलाइन: ईएलके और लोकी
1) क्यों और कब: लॉगिंग गोल
अवलोकन और आरसीए: देबग त्वरण, पोस्टमार्टम, एसएलओ/एसएलए नियंत्रण।
सुरक्षा और ऑडिट: पहुंच के निशान, विसंगतियां, जांच।
व्यवसाय मैट्रिक्स: रूपांतरण, भुगतान प्रवाह, पीएसपी त्रुटियां, उपयोगकर्ता व्यवहार।
अनुपालन: भंडारण, पीआईआई मास्किंग, प्रतिधारण नीतियां, कानूनी पकड़।
लॉग के प्रकार: एप्लिकेशन, इंफ्रास्ट्रक्चर (kubelet, kube-proxy, CNI, ingress), नेटवर्क, ऑडिट, भुगतान, वेब इवेंट, Nginx/Envoy, डेटाबेस।
2) उच्च-स्तरीय वास्तुशिल्प
विकल्प ए: ईएलके
उत्पादक Logshipper (Filebeat/Fluent Bit/Vector) Logstash/Beats इनपुट Elasticsearch
विकल्प बी: लोकी
निर्माता → प्रोमेल/फ्लेंट बिट → लोकी वितरक/इंगेस्टर/क्वेरियर → Grafana/Алертинг
हाइब्रिड
फुल-टेक्स्ट/फेस सर्च के लिए ईएलके, कम लागत वाले स्केलेबल स्टोरेज के लिए लोकी, और फास्ट ग्राफिंग जैसे प्रश्न; ग्राफाना में मैट्रिक्स/निशान के साथ सहसंबंध।
3) डेटा प्रवाह और प्रसंस्करण स्तर
1. संग्रह: बाइट टेल फ़ाइलें, जर्नल, syslog, stdout कंटेनर, HTTP।
2. संवर्धन: टाइमस्टैम्प सामान्यीकरण, होस्ट/पॉड/नेमस्पेस, एनवी (प्रोड/स्टेज), रिलीज, SHA, ट्रेस/स्पैन आईडी।
3. पार्सिंग: JSON → सपाट क्षेत्र; grok/regex; Nginx/दूत प्रारूप; भुगतान योजनाएं (PSP त्रुटि कोड)।
4. फ़िल्टरिंग/संपादन: कट पीआईआई (पैन, सीवीवी, ई-मेल, पते), रहस्य, टोकन।
5. रूटिंग: किरायेदार/सेवा/लॉग स्तर द्वारा; गर्म/गर्म/ठंडा; S3/object भंडारण के लिए।
6. भंडारण और प्रतिधारण: डेटा वर्ग द्वारा टीटीएल नीति।
7. एक्सेस/एनालिटिक्स/अलर्ट।
4) ईएलके: प्रमुख समाधान
4. 1 लॉगस्टैश/बीट्स
आसान पिकर के लिए नोड्स पर बीट्स/फ्लेंट बिट का उपयोग करें, केंद्रीय ईटीएल के रूप में लॉगस्टैश (ग्रोक, डिसेक्ट, म्यूटेट, जियोप, ट्रांसलेट)।
लॉगस्टैश पूल: इनगेस्ट-ईटीएल, सिक्योरिटी-ईटीएल, पेमेंट-ईटीएल - लोड को अलग करने के लिए।
4. 2 Elasticsearch
शार्डिंग: ~ 20-50 जीबी प्रति शार्ड पर ध्यान केंद्रित करें; "शार्द विस्फोट" से बचें।
निर्देशिका रणनीति: 'लॉग्स- <किरायेदार> -
- गर्म: एसएसडी, 1-7 दिन; गर्म: एचडीडी, 7-30 दिन; ठंड: वॉल्यूमेट्रिक; जमे हुए: धीमी पहुंच के साथ न्यूनतम लागत।
- मैपिंग - हार्ड-प्रकार के क्षेत्र, फील्डडेटा को प्रतिबंधित करें, और गतिशील क्षेत्र बनाएं।
- कैश और प्रश्न: कीवर्ड फ़ील्ड द्वारा फ़िल्टर, समुच्चय - बड़े करीने से; उच्च आवृत्ति खोज के लिए पिन-टू-हॉट।
4. 3 किबाना
मल्टी-टेनेंसी के लिए रिक्त स्थान।
सहेजे गए खोज, लेंस/टीएसवीबी, थ्रेशोल्ड/अलर्ट मेट्रिक्स।
इंडेक्स-पैटर्न ('लॉग-टेनेंट-') द्वारा RBAC।
5) लोकी: प्रमुख निर्णय
5. 1 लेबल मॉडल
लेबल लोकी के "इंडेक्स" हैं। "कम कार्डिनैलिटी का उपयोग करें: 'क्लस्टर', 'नेमस्पेस', 'ऐप', 'लेवल', 'एनवी', 'किरायेदार'।
उच्च कार्डिनैलिटी वाले क्षेत्र (uid, request_id) - एक पंक्ति में; LogQL के माध्यम से चुटकी लेने पर ' =', 'json', 'regexp' को पुनः प्राप्त करें।
5. 2 घटक
प्रोमेल: сбор stdout, files, जर्नल; पार्सर्स (JSON, regex, cri)।
वितरक/इंजेस्टर/क्वेरियर/क्वेरी-फ्रंटेंड: भूमिका द्वारा स्केलिंग; कैशिंग का अनुरोध करें।
चम्क लॉग के दीर्घकालिक भंडारण के लिए वस्तु भंडारण (S3/GCS/MinIO)।
5. 3 LogQL तकनीक
फास्ट ग्रेप: '{app = "भुगतान," स्तर =" त्रुटि"} = "अस्वीकृत"
JSON: ' {app =" api"} json code =" 5xx" unwrap अवधि avg ()'
मेट्रिक्स के साथ सहसंबंध: 'दर ({app = "nginx"} = "200" [5 मी]')
6) ईएलके बनाम लोकी तुलना (संक्षिप्त में)
खोज/एकत्रीकरण: ईएलके जटिल पूर्ण-पाठ और मुखर प्रश्नों के लिए मजबूत है; लोकी - ग्रेप जैसा, तेज और सस्ता।
लागत: लोकी अक्सर बड़ी मात्रा (वस्तु भंडारण + छोटा सूचकांक) पर सस्ता होता है।
परिचालन जटिलता: ELK को सूचकांकों/ILM, Javu-hips में अनुशासन की आवश्यकता होती है; लोकी - लेबल विषय।
मेट्रिक्स/निशान के साथ सहसंबंध: लोकी स्वाभाविक रूप से ग्राफाना/ओटेल स्टैक के साथ एकीकृत करता है; ईएलके यह भी जानता है कि कैसे, लेकिन एकीकरण के माध्यम से अधिक बार।
7) सुरक्षा और अनुपालन
किनारे पर पीआईआई संस्करण (शिपर): मास्क पैन, ई-मेल, फोन, पते, टोकन।
टीएलएस इन-ट्रांजिट, एजेंटों और बसों के बीच एमटीएलएस।
RBAC: प्रति-किरायेदार सूचकांक/लेबल; neimspaces/रिक्त स्थान का अलगाव।
रहस्य स्वच्छता: रहस्य के बिना पर्यावरण चर, व्यक्तिगत गुप्त प्रबंधक।
कानूनी पकड़: खंड/सूचकांक ठंड तंत्र; विवादित अवधि के लिए एक बार लिखें।
विलोपन/प्रतिधारण: डेटा वर्ग द्वारा टीटीएल नीतियां (प्रोड/स्टेटफुल/पेमेंट/ऑडिट)।
लॉग एक्सेस ऑडिट ट्रेल्स।
8) विश्वसनीयता और थ्रूपुट
बफरिंग और बैकप्रेशर: एजेंटों के लिए स्थानीय फ़ाइलें/डिस्क; घातीय बैकऑफ के साथ पीछे हटता है।
दोहराव के दौरान डुप्लिकेट से बचने के लिए 'ingest _ id '/' log _ id' fields।
HA: लोकी ES मास्टर्स/ingesters के लिए न्यूनतम 3 नोड्स; Antiaffinity AZ।
किरायेदार/सेवा द्वारा कोटा और दर-सीमा; "तूफान" लॉगिंग के खिलाफ सुरक्षा।
लॉग स्तर योजना: 'ERROR' सीमित, 'DEBUG' केवल अस्थायी रूप से गतिशील फ्लैग के माध्यम से.
9) प्रदर्शन और ट्यूनिंग
ईएलके:- जेवीएम 50% रैम (लेकिन ≤ ~ 30-32 जीबी प्रति नोड), पृष्ठ कैश महत्वपूर्ण है।
- स्मार्ट रोलओवर (20-50 जीबी/शार्ड), 'रिफ्रेश _ इंटरवल' - इंडेक्स के लिए।
- लॉगस्टैश में, "भारी" कराहने से बचें; यदि संभव हो, तो स्रोत पर JSON लॉगिंग।
- सही लेबल सेट गति की कुंजी है।
- बड़े टुकड़े - सस्ता भंडारण, लेकिन ingester पर अधिक महंगी स्मृति; संतुलन।
- बार-बार निवेदन के लिए क्वैरी-फ्रंटेंड + कैश (मेमे/रेडिस).
10) लॉग के लिए फिनोप्स (लागत)
क्षेत्रों/लेबलों की कार्डिनैलिटी में कमी।
DEBUG नमूना और गतिशील "लॉग स्विच"।
घूर्णन: वस्तु के लिए छोटा गर्म, लंबा ठंडा।
Deduplication और समेकित संदेश (बैच)।
सस्ते भंडारण कक्षाओं में शायद ही कभी लॉग का उपयोग किया जाता है।
मान डैशबोर्ड: वॉल्यूम/डेटा स्ट्रीम/लेबल/इंडेक्स/किरायेदार।
11) अवलोकन 3-इन -1
प्रत्येक लॉग के लिए ट्रेस-आईडी/स्पैन-आईडी (एपीआई गेटवे और सेवाओं पर मिडिलवेयर)।
OpenTelemetry: एकल संदर्भ; टेम्पो/जैगर के निर्यातकों, प्रोमेथियस/मिमिर को मैट्रिक्स, लोकी/ईएलके को लॉग।
त्वरित परिदृश्य: "मीट्रिक द्वारा सतर्क संबंधित लॉग में कूदें - ट्रैक में कूदें।"
12) बहु-किरायेदारी और अलगाव
Namespace-आधारित अलगाव (K8s लेबल), अलग सूचकांक पैटर्न/लेबल 'किरायेदार'।
किरायेदार द्वारा अलर्ट/डैशबोर्ड/रेटेंस्चना का पृथक्करण।
खपत बिलिंग: निगलना, भंडारण, अनुरोध की मात्रा।
13) कन्वेयर के लिए निगरानी और एसएलओ
SLO निगेस्ट: "99। 9% लॉग वितरित SLO खोजें: "p95 प्रश्न तकनीकी मैट्रिक्स: कतार की गहराई, गिराए गए लॉग, पुनर्संरचना दर, पार्सर त्रुटि दर, इंजेस्टर/ईएस नोड विफलता। 14) विशिष्ट तैनाती योजनाएं प्रबंधित: Elasticsearch Service/Opensearch, Grafana Cloud Loki। स्व-होस्ट : ES/Loki के लिए Stat Set, AZ के लिए विरोधी आत्मीयता, PersistentVolums, वस्तु भंडारण। एज एजेंट (क्षेत्रों में अनुप्रयोग): केंद्रीय निगरानी के लिए स्थानीय बफर + टीएलएस चैनल। 15) कॉन्फ़िगरेशन उदाहरण 15. 1 प्रोमेल (K8s, CRI JSON) 15. 2 लॉगस्टैश (इनगेस्ट और मास्किंग) 16) अलर्टिंग और डैशबोर्ड (टेम्पलेट) Ошибки एपीआई: 'दर ({app = "api ", स्तर =" त्रुटि"} [5 मीटर]> सीमा '→ PagerDuty/Telegram। Nginx/Envoy में 5xx स्पलैश; एजेंटों में निगलना; विलंबता खोज की वृद्धि। 17) गुणवत्ता जांच (लॉग-क्यूए) लॉगिंग अनुबंध: JSON प्रारूप, आवश्यक फ़ील्ड ('ts', 'level', 'service', 'env', 'trace _ id', 'msg'). CI में लिंटर लॉग: समझौते के बिना उच्च कार्डिनैलिटी के साथ नए क्षेत्रों पर प्रतिबंध लगाना। कैनरी सेवाएं: रेग्रेशन के शुरुआती पता लगाने के लिए संदर्भ लॉग का उत्पादन। 18) लगातार त्रुटियां और विरोधी पैटर्न उच्च कार्डिनैलिटी ('उपयोगकर्ता _ आईडी', 'अनुरोध _ आईडी') के साथ लोकी लेबल - मेमोरी का एक विस्फोट। मैपिंग के बिना ईएस में गतिशील क्षेत्र - "सूचकांक विस्फोट"। बिक्री में DEBUG "हमेशा के लिए "झंडे द्वारा और टीटीएल के साथ चालू करें। पीआईआई संशोधन की अनुपस्थिति। हर चीज के लिए एक सामान्य "अखंड" पाइपलाइन - डोमेन द्वारा बेहतर खंड। 19) कार्यान्वयन योजना (पुनरावृत्ति) 1. एमवीपी: एजेंट + एक पाइपलाइन (अनुप्रयोग), बुनियादी डैशबोर्ड, पीआईआई संस्करण। 2. विस्तार: नेटवर्क/infra-logs, SLO अलर्ट, पटरियों के साथ सहसंबंध। 3. FinOps: प्रतिधारण मैट्रिक्स, लागत रिपोर्ट, लेबल/सूचकांक अनुकूलन। 4. मल्टी-किरायेदार: रिक्त स्थान, आरबीएसी, खपत बिलिंग। 5. विश्वसनीयता: एचए, आपदा-अभ्यास, कानूनी पकड़। 20) उत्पादन में लॉन्च की चेकलिस्ट 21) मिनी-एफएक्यू क्या चुनें - ईएलके या लोकी?yaml scrape_configs:
- job_name: kubernetes-pods kubernetes_sd_configs:
- role: pod pipeline_stages:
- cri: {}
- json:
expressions:
level: level msg: message trace: trace_id
- labels:
level:
app:
namespace:
- match:
selector: '{namespace="prod"}'
stages:
- regex:
expression: '(?P<pan>\b[0-9]{12,19}\b)'
- replace:
expression: '(?P<pan>\b[0-9]{12,19}\b)'
replace: '[REDACTED_PAN]'
relabel_configs:
- action: replace source_labels: [__meta_kubernetes_pod_label_app]
target_label: app
- action: replace source_labels: [__meta_kubernetes_namespace]
target_label: namespace
- action: replace source_labels: [__meta_kubernetes_pod_node_name]
target_label: noderuby input {
beats { port => 5044 }
}
filter {
json { source => "message" skip_on_invalid_json => true }
mutate { add_field => { "env" => "%{[kubernetes][labels][env]}" } }
PII mutate {
gsub => [
"message", "\b[0-9]{12,19}\b", "[REDACTED_PAN]",
"message", "(?i)(authorization: Bearer)([A-Za-z0-9\.\-_]+)", "\1[REDACTED_TOKEN]"
]
}
}
output {
elasticsearch {
hosts => ["https://es-hot-1:9200","https://es-hot-2:9200"]
index => "logs-%{[fields][tenant]}-%{[app]}-%{+YYYY. MM. dd}"
ilm_enabled => true ssl => true cacert => "/etc/ssl/certs/ca. crt"
user => "${ES_USER}"
password => "${ES_PASS}"
}
}