Ofer o soluție pe care acum am ales-o pentru mine. Nu este răspunsul pe care îl căutam, ci unul care pare să navigheze odată cu curgerea.
Sunt încă curios dacă acest lucru ar putea fi gestionat de o comandă Unix comună.
Oricum, iată ce am făcut:
Calea comună pare să folosească un instrument numit Fluentd, care vă permite să colectați jurnalele din diverse surse și
transportați-le oriunde considerați potrivit - un fel de ETL pentru bușteni.
Am ales să trimit jurnalele la serverul syslog, deoarece aveam deja unul care rulează, dar puteți alege oricare dintre pluginurile de ieșire de aici: Pluginuri de ieșire.
Există, de asemenea, un set mare de pluginuri suplimentare: Toate pluginurile
Pasul 1
Obțineți o configurare Fluentd care are instalat pluginul remote_syslog. Aceasta nu vine cu imaginea docker oficială, dar o puteți configura singur.
DE LA fluent/fluentd:v1.14.0-1.0
rădăcină UTILIZATOR
# https://github.com/fluent-plugins-nursery/fluent-plugin-remote_syslog
RUN fluent-gem install fluent-plugin-remote_syslog
UTILIZATOR fluent
Creați imaginea și trimiteți-l în registry.
Pasul 2
Apoi configurați un manifest de implementare Fluentd cu revendicări de volum numai pentru citire pentru a accesa jurnalele pod. Fișierele reale se află în /var/log/pods/* și /var/log/containers conține de fapt legături simbolice. Avem nevoie de fișiere reale.
Aceste jurnale sunt deținute de root pe mașina gazdă și utilizatorul fluent nu va avea acces să le citească.
Trebuie să setăm niște contexte de securitate. De dragul ca lucrurile să funcționeze, am folosit grupul rădăcină pentru fsGroup.
Simțiți-vă liber să cercetați mai profund și să găsiți/comentați cea mai optimă soluție pentru această securitate.
apiVersion: apps/v1
fel: Desfăşurare
...
specificație:
...
specificație:
securityContext:
fsGroup: 0
volume:
- nume: varlogpods-pv
persistentVolumeClaim:
claimName: pvc-var-log-pods
...
containere:
- nume: fluentd
imagine: imaginea ta/fluentd
Vedeți manifestul meu complet în acest articol: fluentd-desfăşurare
Pasul 3
Înainte de implementare, trebuie, de asemenea, să configurați fluent.conf
și descrieți câteva reguli acolo.
Al meu este setat să se potrivească cu o linie de jurnal ca aceasta:
2022-04-26T20:05:00.847016854+03:00 stderr F time="2022-04-26 17:05:00" level=info msg="procesează 3 înregistrări..."
Pentru mai multe detalii despre pluginul tail: coadă
<source>
@type tail
@id in_tail_container_logs
path "/var/log/pods/default_cron-*/*/*.log"
pos_file "/tmp/cron_.log.pos"
read_from_head true
tag cron
<parse>
@type regexp
expression /^(?<logtime>[^ ]*) .* level=(?<level>[^ ]*) msg="(?<message>[^"]*)"$/
time_key logtime
time_format %FT%T.%N%:z
</parse>
</source>
<match cron>
@type remote_syslog
host 172.16.3.10
port 514
protocol udp
severity info
program "fluentd"
hostname "k3sserver"
<buffer>
</buffer>
<format>
@type single_value
message_key message
</format>
</match>
Un atribut de configurare important aici este read_from_head adevărat
care citește fișierele jurnal de sus.
Este necesar pentru acest scenariu, deoarece jurnalele pod se rotesc, dorim ca Fluentd să citească întregul jurnal pod, nu doar câteva linii de actualizare în final. Pentru job cron scurt, fișierul jurnal apare și tail nu va raporta nicio linie inițială în el.
Pasul 4
Luați în considerare configurația și încercați, încercați din nou.
Nu uitați să reporniți implementarea după ce ați actualizat configurația în configMap.
Câțiva biți din traseul de căutare: