Logovací stack pro Openshift 4.6

Obecný popis logování na OCP 4.6

Content
*file: OCP46-logging-general.md *

Cílem dokumentu je popsat stav “as is” logování na platformě Openshift 4.6, vydefinovat části které bude potřeba dořešit případně se jim více věnovat nebo s nimi počítat. Logování je definováno Openshift Cluster Logging Operátorem a je poměrně utažené co se týká možností rekonfigurace a úprav. Ke konkrétním bodům se dostaneme v dalších částech textu.

Architektura logování

Komponenty

Základní komponenty logováni jsou Elasticsearch, Fluentd and Kibana.

  • logStore: Úložiště logů, současná implementace je Elasticsearch.
  • collection: Sběr logů, jejich parsing a transformace a transport. Současná implementace Fluentd.
  • visualization: Současná implementace Kibana.
  • curation: Mazání indexů v logStore na základě retence. Současná implementace Curator. Ve verzi 4.6 je Curator nahrazen joby které řeší rollover indexů tak retenci. Původní Curator zůstává pouze pro zpětnou kompatibilitu.
  • event routing: Směřuje události generované API do logu podů v kterých události vznikly. Současná implementace je EventRouter
nákres logovacího stacku

nákres logovacího stacku

DEFINICE OPERÁTORŮ

Logovací stack se nasadí subskribováním se k cluster-logging operátoru a elasticsearch-operator a následně definicí CRD pro logování. Operátor pak vytvoří potřebné objekty dle definice CRD (cluster-logging) a jejich topologii.

Vytvořené objekty pak vypadají nějak takhle, pro představu uvádím část.

daemonset.apps/fluentd

deployment.apps/cluster-logging-operator
deployment.apps/elasticsearch-cdm-mexyxph8-1
deployment.apps/kibana

cronjob.batch/curator
cronjob.batch/elasticsearch-delete-app
cronjob.batch/elasticsearch-delete-audit
cronjob.batch/elasticsearch-delete-infra
cronjob.batch/elasticsearch-rollover-app
cronjob.batch/elasticsearch-rollover-audit
cronjob.batch/elasticsearch-rollover-infra

configmap/cluster-logging-operator-lock
configmap/curator
configmap/elasticsearch
configmap/fluentd
configmap/fluentd-trusted-ca-bundle
configmap/indexmanagement-scripts
configmap/kibana-trusted-ca-bundle

V našem případě se o nasazení postará gitOPS řešení ArgoCD a dojde k vytvoření samostatného dedikovaného nódu na kterém poběží Elasticsearch a Kibana.

Pro jakékoliv změny je v deploy objektech je potřeba převést operátor do stavu unmanaged.

If you must perform configurations not described in the OpenShift Container Platform documentation, you must set your Cluster Logging Operator or Elasticsearch Operator to Unmanaged. An unmanaged cluster logging environment is not supported and does not receive updates until you return cluster logging to Managed.

Zároveň RH uvádí velké množství úprav které jou explicitně nepodporované
V podstatě jsou nepodporované jakékoliv zásahy do jednotlivých objektů kromě úprav definovaných přez CRD clusterlogging.

Defaultní Konfigurace

FluentD

  • Logy kontejnerů (/var/log/containers/**)
    Přijímány jsou logy ve 2 formátech a ty jsou pak dále modifikovány a obohaceny metadaty

    REGEXP format:

        # priklad kubelet pod logu:
        #2020-06-23T13:08:52.206419987+00:00 stderr F I0623 13:08:52.206374 1184379 proxier.go:368] userspace proxy : processing 0 service events
        #parsed jako
        #{"time":"2020-06-23T13:08:52.206419987+00:00","stream":"stderr","logtag":"F","message":"I0623 13:08:52.206374 1184379 proxier.go:368] userspace proxy : processing 0 service events"}
        format regexp
        expression /^(?<time>.+) (?<stream>stdout|stderr)( (?<logtag>.))? (?<log>.*)$/
    

    JSON format:

        format json
    
  • Json parsing těla zprávy
    Není definovám a doporučen. Pokud bude tedy například field log obsahovat zprávu ve formátu JSON, nebude dále parsován. Dle mého názoru vychází z omezení pro ES dynamic mapping, kdy pro jeden index se doporučuje maximálně 1000 unikátních fieldů.

  • Multiline log
    Vazba na základě Partial (P) klíče tedy rozdělení logu na úrovni runtime

    2016-10-06T00:17:09.669794202Z stdout P First line of log entry 2
    2016-10-06T00:17:09.669794202Z stdout P Second line of the log entry 2
    2016-10-06T00:17:10.113242941Z stderr F Last line of the log entry 2
    
  • Dělení výstupních ES indexů
    Výstup je směrován do 3 ES indexů infra, app, audit. Infra index obsahuje dokumenty z podů openshift-, kubernetes- a default. Audit index k8s-audit.log**, openshift-audit.log** a auditd na nodu. Infra index obsahuje zbytek.

  • Směrování parsovaných logů do systému třetích stran
    Nutnost použití CR ClusterLogForwarder. FluentD na OCP 4.6 obsahuje plugin pro Kafku.

Elasticsearch

Elastic search má nadefinované templaty a mapping pro tři indexy infra, app, audit.
Rollover a mazání indexů je prováděno voláním API z cronjob vytvořených při deploy CRD clusterlogging a řízeno definovanými parametry.

The index is older than the rollover.maxAge value in the Elasticsearch CR.
The index size is greater than 40 GB × the number of primary shards.
The index doc count is greater than 40960 KB × the number of primary shards.
Elasticsearch deletes the rolled-over indices are deleted based on the retention policy you configure.
If you do not create a retention policy for any of the log sources, logs are deleted after seven days by default.

Kibana

TODO: Nemám dořešen RBAC a mapping rolí pro ES.

Příklady parsovaných logů

JSON log

raw log

{
  "level": "info",
  "ts": 1605441700.8959095,
  "logger": "klog",
  "msg": "Server rejected event ObjectMeta:v1.ObjectMeta{Name:\"ahoj-svete.16477d1d3ee12d4d\",, Reason:\"ProjectEnvironmentsUpdated\",
        FirstTimestamp:v1.Time{Time:time.Time{wall:0xbfe430eb2c4e754d, ext:61997781084, 'events \"ahoj-svete.16477d1d3ee12d4d\"
        is forbidden: User \"system:serviceaccount:sudlice-project-operator:sudlice-project-operator-manager\" 
        cannot patch resource \"events\" in API group \"\" in the namespace \"default\"' (will not retry!)"
}

log na uložen na nodu /var/log/containers/**

2020-11-23T22:42:52.352608403+00:00 stdout F {"level":"info","ts":1605441700.8959095,"logger":"klog","msg":"Server rejected event ObjectMeta:v1.ObjectMeta{Name:\"ahoj-svete.16477d1d3ee12d4d\",, Reason:\"ProjectEnvironmentsUpdated\", FirstTimestamp:v1.Time{Time:time.Time{wall:0xbfe430eb2c4e754d, ext:61997781084, 'events \"ahoj-svete.16477d1d3ee12d4d\" is forbidden: User \"system:serviceaccount:sudlice-project-operator:sudlice-project-operator-manager\" cannot patch resource \"events\" in API group \"\" in the namespace \"default\"' (will not retry!)"}

log po pruchodu fluentD a uložen v ES

json log v ES

json log v ES

PLAIN log

raw log

proxier.go:368] userspace proxy : processing 0 service events a nic k tomu uz nepridam jen demonstrace REGEX match pro INPPUT

log na uložen na nodu /var/log/containers/**

2020-11-23T22:42:52.352761911+00:00 stdout F proxier.go:368] userspace proxy : processing 0 service events a nic k tomu uz nepridam jen demonstrace REGEX match pro INPPUT

log po pruchodu fluentD a uložen v ES

plain log v ES

plain log v ES