Լոգարանների փոխակրիչները ՝ ELK և Loki
1) Ինչո՞ ւ և երբ ՝ տրամաբանության նպատակները
Դիտարկումը և RCA-ն 'դեբագի արագացումը, փոստի մորտը, SLO/SLA վերահսկողությունը։
Անվտանգությունն ու աուդիտը 'մուտքի, անոմալիայի, հետազոտության հետքեր։
Բիզնես մետրիկները 'փոխարկումներ, հիբրիդային ֆլոու, PBS սխալներ, օգտագործողների վարքագիծը։
Կոմպլենսը 'պահեստավորում, դիմակավորում PII, ռեթենշնի քաղաքականություն, Legal Hold։
Լոգարանների տեսակները 'պլաստիկ, ենթակառուցվածքային (kubelet, kube-proxy, CNI, ingress), ցանցային, երկրորդային, վեբ իրադարձություններ, Nginx/Envoy, BD։
2) Բարձր մակարդակի ճարտարապետություններ
A տարբերակը 'ELK
Producers → Logshipper (Filebeat/Fluent Bit/Vector) → Logstash/Beats input → Elasticsearch → Kibana/Алертинг
B տարբերակը ՝ Loki
Producers → Promtail/Fluent Bit → Loki distributor/ingester/querier → Grafana/Алертинг
Հիբրիդ
ELK-ը փնտրելու ամբողջական տեքստ/ֆասետներ, Loki-ը էժան մասշտաբային պահեստավորման և արագ grand-նման հարցումների համար։ կորոլիկ/հետքերով Grafana-ում։
3) Տվյալների հոսքը և վերամշակման մակարդակը
1. Հավաքումը 'կրկնվող ֆայլեր, journald, www.slog, stdout բեռնարկղեր, HTTP։
2. Հարստացում ՝ timestamp նորմալացում, host/pod/namespace, env (105/stage), rele.ru, commit SHA, trace/windid։
3. Պարսինգը 'JSON no flat fields; grok/regex; Nginx/Envoy 2019; հիբրիդային սխեմաները (PSA սխալների բարձրացում)։
4. Ֆիլտրը/խմբագրությունը 'կտրել PII (PAN, CVV, e-mail, 108), գաղտնիքները, հոսանքները։
5. Ռոուտինգը 'ten.ru/71/log մակարդակում; hot/warm/cold; S3/օբյեկտի պահեստ։
6. Պահպանումը և վերականգնումը 'TTL քաղաքականությունը տվյալների դասարաններում։
7. Մուտք/Alerta/Alerta.
4) ELK 'հիմնական լուծումները
4. 1 Logstash/Beats
Օգտագործեք Beats/Fluent Bit-ը թեթև հավաքածուի համար, Logstash-ը որպես կենտրոնական ETL (spork, sport, mutate, geoip, translate)։
Puls Logstash: ingest-ETL, 71-ETL, payments-ETL - բեռների մեկուսացման համար։
4. 2 Elasticsearch
Շարդինգը 'կենտրոնացեք 20-50 ԳԲ-ի վրա գնդակի վրա։ խուսափեք «գնդակի պայթյունից»։
Ինդեքսների ռազմավարությունը '
- hot: SSD, 1-7 օր; warm: HDD, 7-30 օր; cold: ծավալային; frozen 'նվազագույն արժեքը ավելի դանդաղ հասանելիությամբ։
- Mappings 'կոշտ տիպի դաշտեր, սահմանափակեք «fielddata» և ստեղծեք դինամիկ դաշտեր։
- Քեշը և հարցումները 'keyword-220 մ ֆիլտրեր, ագրեգատները' կոկիկ։ pin-to-hot բարձր հաճախականության որոնման համար։
4. 3 Kibana
Տարածքներ (Spaces) մուլտֆիլմի տենանտիզմի համար։
Saved searches, Lens/TSVB, threshold/metric-ալերտներ։
RBAC ինդեքսը («logs-tenanta»)։
5) Loki 'հիմնական լուծումները
5. 1 Պիտակների մոդել
Լեյբլները Loki-ի «ինդեքսն» են։ Օգտագործեք ցածր կարդինալություն '«cluster», «namespace», «app», «level», «env», «tenae»։
Բարձր կարդինալությամբ դաշտերը (uid, request _ id) - տողում։ խնդրեք LoGQL '105 = "," www.json "," www.regexp "։
5. 2 Բաղադրիչներ
Promtail: сбор stdout, files, journald; Պարսերներ (JSON, regex, cri)։
Distributor/Ingester/Querier/Query-frontend: մեծացում դերերով; հարցումների հավաքագրումը։
Object storage (S3/GCS/MinIO) երկարատև պահեստավորման համար։
5. 3 LogQL ընդունելություններ
Արագ grep: <
Парсинг JSON: `{app="api"} | json | code="5xx" | unwrap duration | avg()`
Փոխարկումը մետրերի հետ '«rate ( 6) ELK vs Loki (կարճ) Որոնումը/ագրեգացիան 'ELK-ն ավելի ուժեղ է բարդ ամբողջական և ճակատային հարցումների համար։ Loki-ը grep-like է, արագ և էժան։ Արժեքը ՝ Loki-ը հաճախ ավելի էժան է մեծ ծավալի վրա (օբյեկտի պահեստ + փոքր ինդեքսը)։ Գործողության բարդությունը 'ELK-ը պահանջում է ինդեքսներ/ILM, Ջավու-հիպամ։ Loki-ը պիտակների կարգապահություններ են։ Փոխակերպումը մետրիկների/հետքերի հետ. Loki-ը բնականաբար ինտեգրվում է Grafana/OTel ապակու հետ։ ELK-ը նույնպես գիտի, բայց ավելի հաճախ 'միգրանտների միջոցով։ 7) Անվտանգություն և ընկերակցություն PII խմբագրությունը եզրին (shipper) 'դիմակավորված PAN, e-mail, հեռախոսը, կոդավորումը, հոսանքները։ TMS-transit, mTRC գործակալների և անվադողերի միջև։ RBAC: per-tenae ինդեքսներ/պիտակներ; նեյրոսպեյսների/տարածությունների մեկուսացում։ Secrets hygiene: Windows առանց գաղտնիքների, առանձին գաղտնի ղեկավարներ։ Legal Hold 'հատվածների/ինդեքսների սառեցման մեխանիզմ; write-once հակասական ժամանակահատվածների համար։ Հեռացում/retenshn: TTL քաղաքականությունները տվյալների դասարաններում (108/stateful/վճարումներ/աուդիտ)։ Audit-treils մուտք։ 8) Մոսկվան և կարողությունը Բուֆերիզացիա և backpressure 'տեղական ֆայլեր/սկավառակներ գործակալների մոտ; trai էքսպոնենցիալ backoff. Idempotency: «ingest _ id »/« log _ id» դաշտերը կրկնապատկելու համար։ HA 'առնվազն 3 նոդա ES-վարպետների/Loki-ի ինգեստերների համար։ antiaffinity по AZ. Քվոտաները և rate-limits tenae/2019; պաշտպանություն «փոթորիկներից» լոգարիթմից։ Լոգարանների մակարդակի սխեման '«ERROR» սահմանափակ է, «DEBUG» միայն ժամանակավորապես դինամիկ դրոշների միջոցով։ 9) Արտադրողականությունը և թյունինգը 10) Ֆինոպս լոգարանների համար (արժեքը) Դաշտերի/պիտակների կարդինալության նվազումը։ Sampling DEBUG-ը և դինամիկ «log-swichi» -ը։ Ռոտացիան 'կարճ hot, երկար կոլդ օբյեկտի մեջ։ Դեդուպլիկացիան և համախմբված հաղորդագրությունները (batch)։ Հազվադեպ օգտագործվող լոգարանների արխիվացումը պահեստային դասարաններում։ Արժեքի Դաշբորդ 'ծավալ/ամսաթվերը/պիտակները/ինդեքսները/տենանտները։ 11) Հարաբերակցություն մետրիկների և հետքերի հետ (Observability 3-v-1) Trace-ID/International-ID յուրաքանչյուր լոգում (middleware API դռների և ծառայությունների վրա)։ OpenTelemetry: Մեկ ենթատեքստ; Tempo/Jaeger, Prometheus/Mimir-ում, Loki/ELK-ում։ Արագ սցենարներ. < 12) Multi-tenanty-ը և մեկուսացումը Namespace-based մեկուսացում (K8s labels), առանձին պաթերտներ/պիտակներ 'tenae'։ Alerts/dashbords/retenshen բաժանումը տենանտով։ Billing 'ingest, storage, հարցումներ։ 13) Մոսկվա և SLO փոխակրիչի համար SLO ingest: «99. 9 տոկոսը առաքվել է SLO որոնումներ ՝ «p95 հարցումներ Տեխնոլոգիական մետրերը ՝ queue depth, dropped logs, reprocess rate, error rate parser, ingester/ES nood։ 14) Տիպային սխեմաներ Managed: Elasticsearch Service/Opensearch, Grafana Cloud Loki. Winf-hosted K8s: StatefullSets-ը ES/Loki-ի համար, AZ-affinity-ը, PersistentVolumes-ը, օբյեկտի պահեստ։ Edge-2019 (ծրագրեր տարածաշրջաններում) 'տեղական բուֆեր + TSA ալիքը կենտրոնական ingest-ի վրա։ 15) Միգրացիայի օրինակներ 15. 1 Promtail (K8s, CRI JSON) 15. 2 Logstash (ingest և դիմակավորում) 16) Alerting և dashbords (ձևանմուշներ) Ошибки API: `rate({app="api",level="error"}[5m]) > threshold` → PagerDuty/Telegram. 5xx-ի աճը Nginx/Envoy-ում։ dw.ingest գործակալների մոտ; latency որոնման աճը։ Դաշբորդները Ծառայությունների/տենանտների լոգարանների ծավալը։ Լավագույն սխալները (կոդ/բացառություն/endpoint)։ Ռենտենի/դասարանների արժեքը։ 17) Որակի ստուգում (լոգ-QA) Լոգանքի պայմանագրերը 'JSON ձևաչափը, պարտադիր դաշտերը («ts», «level», «dive», «env», «trace _ id», «www.g»)։ Linter logs CI-ում 'նոր դաշտերի արգելումը բարձր կարդինալությամբ առանց համաձայնության։ Կանարյան ծառայությունները 'ստանդարտ լոգարանների արտադրություն ռեգրեսիայի վաղ հայտնաբերման համար։ 18) Հաճախակի սխալներ և հակատիպեր Loki-ի պիտակները բարձր կարդինալությամբ («user _ id», «request _ id») ցույց են տալիս հիշողության պայթյունը։ ES-ում դինամիկ դաշտերը առանց մեպինգների բացատրվում են «ինդեքսների պայթյուն»։ DEBUG-ը «ընդմիշտ» վաճառքում։ Միացրեք դրոշներին և TTL-ի հետ։ PII-2019-ի բացակայությունը։ Մեկ ընդհանուր «մոնոլիտ» փոխակրիչը ամենալավ հատվածն է։ 19) Իրականացման պլանը (իտերացիաներ) 1. MVP: 108 + մեկ pline (ծրագրեր), հիմնական dashbords, PII խմբագրություն։ 2. Ընդլայնումը 'ցանցային/infra-loga, SLO-ի ալտերտերը, ուղիների կորլացիան։ 3. Ֆինոպս 'ռենտեն մատրիցա, արժեքի հաշվետվություն, պիտակների/ինդեքսների օպտիմիզացում։ 4. Multi-tenant: տարածք, RBAC, սպառման բիլինգ։ 5. Մոսկվա: HA, wwww.aster-medills, Legal Hold. 20) Չեկի Թիթեռի թուղթը։ 21) Mini-FAQ Ի՞ նչ ընտրել 'ELK կամ Loki։
Loki:
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}"
}
}