Logs流水線:ELK和Loki
1)為什麼和時間: 拼寫目的
可觀察性和RCA:加速debag,後太平間,SLO/SLA控制。
安全和審計:訪問痕跡,異常,調查。
業務指標:轉換、支付漏洞、PSP錯誤、用戶行為。
合規性:存儲,PII掩蓋,還原策略,法律保留。
博客類型:應用,基礎架構(kubelet, kube-proxy, CNI, ingress),網絡,審計,支付,Web事件,Nginx/Envoy, DB。
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用於廉價的可擴展存儲和快速的格雷普式查詢;在Grafana中使用度量/軌跡。
3)數據流和處理級別
1.收集:打字機文件,journald,syslog,stdout容器,HTTP。
2.豐富:timestamp歸一化,主機/pod/namespace,env(prod/stage),版本,commit SHA,trace/span id。
3.配對:JSON →平地;grok/regex;Nginx/Envoy格式;支付方案(PSP錯誤代碼)。
4.過濾器/修訂版:剪切PII (PAN, CVV,電子郵件,地址),秘密,令牌。
5.漫遊:按電話/服務/日誌級別;hot/warm/cold;在S3/對象存儲中。
6.存儲和還原:數據類的TTL策略。
7.訪問/分析/Alerta。
4) ELK: 關鍵解決方案
4.1 Logstash/Beats
將Beats/Fluent Bit用作輕量級收集器,Logstash用作中央ETL (grok, dissect, mutate, geoip, translate)。
Logstash池:ingest-ETL, security-ETL, payments-ETL-用於隔離負載。
4.2 Elasticsearch
搖搖欲墜:專註於每搖搖欲墜的~ 20-50 GB;避免「沙丁魚爆炸」。
索引策略:'log-<tenant>-<service>-YYYY。MM.DD'或數據流;rollover的大小/時間。
ILM (hot/warm/cold/frozen):
hot:SSD,1-7天;warm: HDD, 7-30天;冷:體積大;冷凍:最低成本,訪問速度較慢。
Mappings:硬類型字段,限制「fielddata」並創建動態字段。
緩存和查詢:按鍵字段的過濾器,整齊的聚合;用於高頻搜索的點對點。
4.3 Kibana
多影子空間。
Saved searches,Lens/TSVB,threshold/度量。
按索引模式劃分的RBAC(「logs-tenant-」)。
5) Loki: 關鍵解決方案
5.1個標簽型號
標簽是Loki的「索引」。使用低基數:'cluster'、'namespace'、'app'、'level'、'env'、'tenant'。
高基數字段(uid,request_id)在行中;通過LogQL 「|=」、「| json」、「| regexp」查詢時檢索。
5.2個組件
Promtail: сбор stdout, files, journald;解析器(JSON, regex, cri)。
Distributor/Ingester/Querier/Query-frontend:按角色縮放;請求緩存。
Object Storage (S3/GCS/MinIO)用於長期存儲字符日誌。
5.3 LogQL技術
快速grep: '{app='payments',level='error'} |= 'declined'
Парсинг JSON: `{app="api"} | json | code="5xx" | unwrap duration | avg()`
與指標的相關性: 'rate ({app='nginx"} |= '200' [5m])'
6)ELK vs Loki比較(簡述)
搜索/聚合:對於復雜的全文和多面查詢,ELK更強大;Loki像油脂一樣,快速便宜。
成本:Loki通常在較大體積上便宜(對象存儲+較小的索引)。
操作難度:ELK 需要索引/ILM,Javu-hips的紀律;Loki是標簽上的學科。
與度量/軌跡的相關性:Loki自然與Grafana/OTel堆棧集成;ELK也知道,但更常見的是通過集成。
7)安全和合規性
邊緣的PII修訂版(shipper):偽裝PAN、電子郵件、電話、地址、令牌。
傳輸中的TLS,代理與總線之間的mTLS。
RBAC:按指數索引/標簽;Nijspace/空間隔離。
Secrets hygiene:無秘密環境變量,個別秘密經理。
法律保持:分段/索引凍結機制;有爭議時期的write-once。
刪除/重建:按數據類別(prod/stateful/付款/審計)分列的TTL策略。
登錄訪問審核預告片。
8)可靠性和吞吐量
緩沖和備份:代理的本地文件/驅動器;帶有指數回放的回放。
Idempotency: 「ingest_id」/「log_id」字段,用於避免重播時的重復。
HA: Loki的ES 大師/ingesters最少3個讀物;antiaffinity по AZ.
Tenant/Service的配額和等級限制;防禦邏輯的「風暴」。
Log Level Scheme:「ERROR」是有限的,「DEBUG」只是暫時通過動態標誌。
9)性能和調音
ELK:
JVM heap 50% RAM(但每頭≤ ~ 30-32 GB), page cache很重要。
智能過山車(每個20-50 GB/shard),「refresh_interval」 ↑用於ingest索引。
在Logstash中避免「沈重」的樹皮;如果可能,在源上進行JSON生成。
Loki:
正確的標簽設置是速度的關鍵。
大襪子→便宜的存儲,但更昂貴的是內存;平衡一下。
Query-frontend+緩存(模因/Redis)用於重復查詢。
10) FinOps for Logs(成本)
字段/標簽基數降低。
Sampling DEBUG和動態「log-swichi」。
輪換:短熱,長冷成對象。
重復數據消除和合並消息(batch)。
將很少使用的日誌存檔到廉價的存儲類。
Dashbord價值:體積/數據流/標簽/索引/tenant。
11)與指標和軌道的相關性(Observability 3-in-1)
每個日誌中的Trace-ID/Span-ID(網關API和服務上的middleware)。
OpenTelemetry:一個上下文;Tempo/Jaeger的出口商,Prometheus/Mimir的指標,logi-Loki/ELK。
快速場景: 「通過度量標準→跳入適當的日誌→跳入賽道。」
12)多重性與隔離
基於Namespace的隔離(K8s標簽),單獨的索引模式/標簽「tenant」。
沿著Tenant劃分Alert/Dashbords/Rhetenchn。
按消費計費:ingest卷,storage,查詢。
13)管道本身的監控和SLO
SLO ingest: «99.9%的日誌交付於<X秒"。
搜索的SLO: 「p95查詢<Y sec」。
技術指標:queue depth、dropped logs、reprocess rate、error rate parser, ingester/ES nod故障。
14)示例部署模式
Managed: Elasticsearch Service/Opensearch, Grafana Cloud Loki.
自主K8s:用於ES/Loki的StatefulSets,AZ上的反親和力,PersistentVolumes,對象存儲。
Edge Agent(區域應用程序):本地緩沖區+TLS通道到中央入口。
15)配置示例
15.1 Promtail (K8s, CRI JSON)
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: node
15.2 Logstash (ingest和蒙版)
ruby 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}"
}
}
16)Alerting和dashbords(模式)
Ошибки API: `rate({app="api",level="error"}[5m]) > threshold` → PagerDuty/Telegram.
Nginx/Envoy中的5xx爆發;代理商的rop ingest;後期搜索增長。
Dashbords:- 按服務/tenant排列的日誌量。
- 頂級錯誤模式(代碼/例外/endpoint)。
- 續集/存儲類成本。
17)質量檢查(log-QA)
拼寫合同:JSON格式,必填字段(「ts」,「level」,「service」,「env」,「trace_id」,「msg」)。
CI中的Linter Loger:未經同意禁止使用高基數的新字段。
金絲雀服務:為早期回歸檢測生成參考日誌。
18)頻繁的錯誤和反模式
高基數的Loki標簽(「user_id」,「request_id」)→內存爆炸。
ES中沒有映射的動態字段→「索引爆炸」。
DEBUG「永遠」出售。通過旗幟和TTL打開。
沒有PII修訂版。
一個通用的「整體」流水線適合一切-最好是跨域細分。
19)實施計劃(叠代)
1.MVP: Agent+1 pipline(應用程序),Basic dashbords, PII修訂版。
2.擴展:網絡/infra-logs,SLO alerts,帶有軌道。
3.FinOps:重構矩陣,價值報告,標簽/指數優化。
4.多特南特:空間,RBAC,按消費計費。
5.可靠性:HA, disaster-drills, Legal Hold。
20)入口的啟動支票清單
- 所有服務中的JSON格式和必填字段。
- 在代理/ingest上偽裝PII。
- 還原政策/ILM或bucket-lifecycle。
- RBAC/空間/tenants。
- SLO ingest/Search和Alertes。
- 金絲雀日誌和測試運行負載。
- 價值碼和服務所有者報告。
- Runbooks:「如果ingest下跌/搜索緩慢/鯊魚是紅色,該怎麼辦。」
21) Mini-FAQ
選擇什麼-ELK或Loki?