--- title: Kubernetesのログをfluent-bitでrsyslogに転送するメモ tags: ["Kubernetes", "TKG", "Tanzu", "Fluent Bit", "syslog", "rsyslog"] categories: ["Dev", "CaaS", "Kubernetes", "TKG", "Extensions", "FluentBit"] date: 2024-10-08T01:13:09Z updated: 2024-10-08T04:05:55Z --- K8sのログをfluent-bitでrsyslogに転送する際に、structured dataを含めて適切に設定されてるサンプルが見つからなかったのでメモです。 ### rsyslogの設定 rsyslogはOSにプリインストール済みのことが多いです。次のコマンドでrsyslogの状態を確認できます。 ``` $ sudo service rsyslog status Redirecting to /bin/systemctl status rsyslog.service ● rsyslog.service - System Logging Service Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; enabled; vendor preset: enabled) Active: active (running) since Tue 2024-10-08 09:38:33 JST; 6min ago Docs: man:rsyslogd(8) https://www.rsyslog.com/doc/ Main PID: 526 (rsyslogd) Tasks: 3 (limit: 128204) Memory: 1.9M CGroup: /system.slice/rsyslog.service └─526 /usr/sbin/rsyslogd -n Oct 08 09:38:33 syslog systemd[1]: Starting System Logging Service... Oct 08 09:38:33 syslog rsyslogd[526]: [origin software="rsyslogd" swVersion="8.2102.0-15.el8" x-pid="526" x-info="https://www.rsyslog.com"] start Oct 08 09:38:33 syslog rsyslogd[526]: imjournal: No statefile exists, /var/lib/rsyslog/imjournal.state will be created (ignore if this is first run): No such file or direc tory [v8.2102.0-15.el8 try https://www.rsyslog.com/e/2040 ] Oct 08 09:38:33 syslog systemd[1]: Started System Logging Service. Oct 08 09:38:33 syslog rsyslogd[526]: imjournal: journal files changed, reloading... [v8.2102.0-15.el8 try https://www.rsyslog.com/e/0 ] ``` インストールされていない場合は、以下のコマンドでインストールできます。 ``` sudo yum install rsyslog ``` rsyslogは以下のバージョンを試しました。 ``` $ rsyslogd -v rsyslogd 8.2102.0-15.el8 (aka 2021.02) compiled with: PLATFORM: aarch64-redhat-linux-gnu PLATFORM (lsb_release -d): FEATURE_REGEXP: Yes GSSAPI Kerberos 5 support: Yes FEATURE_DEBUG (debug build, slow code): No 32bit Atomic operations supported: Yes 64bit Atomic operations supported: Yes memory allocator: system default Runtime Instrumentation (slow code): No uuid support: Yes systemd support: Yes Config file: /etc/rsyslog.conf PID file: /var/run/rsyslogd.pid Number of Bits in RainerScript integers: 64 See https://www.rsyslog.com for more information. ``` `/etc/rsyslog.conf`を開いて、次のコメントを外します。 ``` module(load="imtcp") # needs to be done just once input(type="imtcp" port="514") ``` また、rfc5424の[STRUCTURED-DATA](https://datatracker.ietf.org/doc/html/rfc5424#section-6.3)を出力するために、次の設定を削除し、 ``` # Use default timestamp format module(load="builtin:omfile" Template="RSYSLOG_TraditionalFileFormat") ``` 代わりに、次の設定を追記ます。 ``` module(load="builtin:omfile" Template="RSYSLOG_SyslogProtocol23Format") ``` rsyslogを再起動します。 ``` sudo service rsyslog restart ``` 次のコマンドでログを追尾します。 ``` sudo tail -f /var/log/messages ``` 動作確認します。 別の端末からtelnetでrsyslogサーバーにアクセスして、rfc5424形式のログを送ります。 ``` $ telnet 514 Trying *.*.*.*... Connected to *.*.*.*. Escape character is '^]'. <14>1 2021-07-12T14:37:35.569848Z myhost myapp 1234 ID98 [uls@0 logtype="access" clustername="mycluster" namespace="mynamespace"] Sample app log message. ``` tailしていたrsyslog側にも同様に次のログが出力されていればOKです。 ``` <14>1 2021-07-12T14:37:35.569848Z myhost myapp 1234 ID98 [uls@0 logtype="access" clustername="mycluster" namespace="mynamespace"] Sample app log message. ``` `module(load="builtin:omfile" Template="RSYSLOG_TraditionalFileFormat")`の設定が残ったままだと、次のような出力になります。 ``` Jul 12 14:37:35 myhost myapp[1234] Sample app log message. ``` ### fluent-bitの設定 本質的でないですが、fluent-bitはTanzu (Carvel) Packageでインストールします。本記事でポイントとなるのはfluent-bit自体の設定であり、どの方法でインストールしても大差ありません。 Helmなどでインストールする場合でも同様な設定で転送できると思われます。 > [!NOTE] > Tanzu Packageをセットアップする方法はこちらの記事を参考にしてください。本記事では以下のrepositoryが設定済みの前提です。 > > ``` > tanzu package repository add tanzu-standard \ > --url projects.registry.vmware.com/tkg/packages/standard/repo:v2024.8.21 \ > --namespace tanzu-install --create-namespace > ``` 以下の設定ファイルを作成します。``の箇所を書き換えてください。 ```yaml cat <<'EOF' > fluent-bit-values.yaml --- namespace: tanzu-system-logging fluent_bit: config: service: | [SERVICE] Daemon Off Flush 1 Log_Level info Parsers_File parsers.conf Health_Check On HTTP_Server On HTTP_Port 2020 HTTP_Listen 0.0.0.0 inputs: | [INPUT] Name tail Path /var/log/containers/*.log DB /var/log/flb_kube.db parser cri Tag kube.* Mem_Buf_Limit 5MB Skip_Long_Lines On parsers: | [PARSER] # http://rubular.com/r/tjUt3Awgg4 Name cri Format regex Regex ^(?