はじめに
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」とすることで他のログも取得可能です。
以上です。