(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【IKS/fluentd】コンテナのログをSyslog経由で別サーバに転送する

スポンサーリンク

はじめに

IBM Cloud Kubernetes Service(IKS)では外部サーバーに対してSyslog経由でログ転送することができます。
本記事では実際にそれを設定した後にその動作確認をした結果について記載しました。尚、ログの送付先側ではSyslogを受け付ける設定は済んでいるものと仮定します。

環境情報
$ kubectl get node
NAME            STATUS   ROLES    AGE    VERSION
xx   Ready    <none>   ...   v1.21.X+IKS
# cat /etc/os-release
NAME="Red Hat Enterprise Linux Server"
VERSION="7.9 (Maipo)"

転送設定

Kubernetesクラスターにログの転送設定を入れる前に以下ですでに設定が入っているかどうかを確認できます。

$ ibmcloud ks logging config get --cluster xx

何も設定が入っていない場合は値が表示されません。

今回は特定のnamespaceである"hoge"のコンテナログを"X.X.X.X"というIPアドレスのサーバにSyslog経由で送付するとします。
その場合は以下コマンドで同設定を入れることができて

$ ibmcloud ks logging config create --cluster xx --logsource container --namespace hoge --hostname X.X.X.X --port 514 --type syslog --syslog-protocol tcp --skip-validation

以下の標準出力が返ってくれば成功です。

Creating logging configuration for container logs in xx...
OK
ID                                     Source      Namespace    Host             Port   Org   Space   Server Type   Protocol   CA Cert   Verify Mode   Application Containers   Paths
XX   container   hoge    X.X.X.X   514    -     -       syslog        tcp     -         -             -                        -

同設定が完了するとkube-systemという名前空間にデーモンセットができていて

$ kubectl get ds ibm-kube-fluentd -n kube-system
NAME               DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
ibm-kube-fluentd   3         3         3       3            3           <none>          ...

以下のConfigMapが

$ kubectl get cm ibm-kube-fluentd-config -n kube-system
NAME                      DATA   AGE
ibm-kube-fluentd-config   1      14m

Podの以下に設定ファイルとして格納されています。

- mountPath: /fluentd/etc/config.d/logmet/
   name: fluentd-config

動作確認

今回指定した名前空間のPodにNginxを用意してcurlコマンドを送付すると、同Podには

172.X.X.X - - [...+0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.55.1" "10.X.X.X"

というログのみですが指定したIPアドレスのサーバ側の/var/log/messagesには以下のような情報が不可された状態で出力されます。

... kube-xx-default-000001f2 fluentd: {"time":"xx","stream":"stdout","docker":{"container_id":"xx"},"kubernetes":{"container_name":"nginx","namespace_name":"hoge","pod_name":"...","container_image":"nginx:1.19.3","container_image_id":"nginx@sha256:...","pod_id":"xx","pod_ip":"172.X...","host":"10...","labels":{"app":"nginx","pod-template-hash":"..."},"master_url":"https://172.X:443/api","namespace_id":"...","namespace_labels":{"kubernetes_io/metadata_name":"hoge"}},"message":"...- - [xx +0000] \"GET / HTTP/1.1\" 200 612 \"-\" \"curl/7.55.1\" \"xx\"","line":"xx - - [...0000] \"GET / HTTP/1.1\" 200 612 \"-\" \"curl/7.55.1\" \"...\"","...":{"region":"jp-tok","account_id":"...","resource_group_id":"...","cluster_id":"...","cluster_name":"xx","cluster_type":"cr","log_source":"container"},"crn":"crn:v1:bluemix:public:containers-kubernetes:jp-tok:a/...:log","type":"..._logs","log_timestamp":".."

終わりに

fluentd周りの設定を動的に生成してくれるため、fluent.confの書き方のお作法を学ぶのにも使えます。
今回はコンテナログだけを取得しましたが、「--logsource container,worker,kubernetes」とすることで他のログも取得可能です。

以上です。