Kubernetes Podのログ収集機能を調べてみた
はじめに
Kubernetesのアプリケーションログを収集するために仕組みを理解しようと思い、調査してみました。
検証環境はOracle Cloud InfrastructureのOKEを使用して調査を行っています。
検証環境
- OKE クラスタバージョン: 1.31.1
- Node: OCI VMインスタンス(OS Oracle Linux 8)
$ kubectl version
Client Version: v1.32.1
Kustomize Version: v5.5.0
Server Version: v1.31.1
$ oci -v
3.51.1
この記事でやること・やらないこと
やること
- Node, Podのログ収集機能のザックリ概要説明
- Podのログがどのように保存されているのか
- PodのログがどのようにNodeに集約されるのか
やらないこと
- Node, Pod以外のk8sリソースでのログ収集機能の説明
- メトリクス機能の説明
Kubernetesのログ収集機能
kubernetesのログアーキテクチャについてザックリと理解しておきます。
まず、Podのログはコンテナ化されたアプリケーションの標準出力と標準エラー出力を取得しています。
そのPodのログはKubeleteを介してNodeのログファイル/var/log/pods/に記述されます。
### .ssh/config に適切な設定をしたのちにNodeをホストしているインスタンスへssh接続を実行
$ ssh oci_oke_node
### Nodeのログファイルを確認
$ sudo ls -l /var/log/pods/
total 0
drwxr-xr-x. 3 root root 21 Jan 23 07:27 kube-system_coredns-8695fb47cb-fl2kp_93f8735d-a924-467c-b851-a8de9a53c05f
drwxr-xr-x. 3 root root 29 Jan 24 08:31 kube-system_csi-oci-node-zckxp_862dd899-853f-4a96-a0de-9a1d84997db1
drwxr-xr-x. 3 root root 24 Jan 23 07:27 kube-system_kube-dns-autoscaler-745d6f8477-pjsp5_40e305be-68a2-42ec-a2ff-b8ea2c936627
drwxr-xr-x. 4 root root 47 Jan 23 07:26 kube-system_kube-proxy-5pvcb_a1048773-a0fa-41d2-ad02-fce9e484b6ba
drwxr-xr-x. 3 root root 29 Jan 23 07:26 kube-system_proxymux-client-dkdt9_82d1c808-f35d-45bb-a49e-6bba829ff0ae
drwxr-xr-x. 4 root root 49 Jan 23 07:26 kube-system_vcn-native-ip-cni-wrkk5_534ecf6b-5d5f-4c69-af4c-a74e59be6a62
ログファイルの中身を確認
stdout,stderrを定期的に出力するPodを作成し、Nodeのログファイルを確認してみます。
以下マニフェストを作成して、Podを作成します。
apiVersion: v1
kind: Namespace
metadata:
name: log-output
---
apiVersion: v1
kind: Pod
metadata:
name: log-output-pod
namespace: log-output
spec:
containers:
- name: busybox
image: busybox
command: ["/bin/sh", "-c"]
args:
- |
i=1
while true; do
date=$(date '+%Y-%m-%d %H:%M:%S')
echo "$i test stdout $date"
echo "$i test stderr $date" >&2
i=$((i+1))
sleep 10
done
$ kubectl apply -f log-output-pod.yml
namespace/log-output created
pod/log-output-pod created
### ログが正常に吐かていることを確認します。
$ kubectl logs -n log-output log-output-pod
1 test stdout 2025-01-25 23:58:54
1 test stderr 2025-01-25 23:58:54
2 test stdout 2025-01-25 23:59:04
2 test stderr 2025-01-25 23:59:04
Podを作成したら、Nodeのログファイルを確認してみます。
$ sudo ls -l /var/log/pods/
total 0
drwxr-xr-x. 3 root root 21 Jan 23 07:27 kube-system_coredns-8695fb47cb-fl2kp_93f8735d-a924-467c-b851-a8de9a53c05f
drwxr-xr-x. 3 root root 29 Jan 24 08:31 kube-system_csi-oci-node-zckxp_862dd899-853f-4a96-a0de-9a1d84997db1
drwxr-xr-x. 3 root root 24 Jan 23 07:27 kube-system_kube-dns-autoscaler-745d6f8477-pjsp5_40e305be-68a2-42ec-a2ff-b8ea2c936627
drwxr-xr-x. 4 root root 47 Jan 23 07:26 kube-system_kube-proxy-5pvcb_a1048773-a0fa-41d2-ad02-fce9e484b6ba
drwxr-xr-x. 3 root root 29 Jan 23 07:26 kube-system_proxymux-client-dkdt9_82d1c808-f35d-45bb-a49e-6bba829ff0ae
drwxr-xr-x. 4 root root 49 Jan 23 07:26 kube-system_vcn-native-ip-cni-wrkk5_534ecf6b-5d5f-4c69-af4c-a74e59be6a62
drwxr-xr-x. 3 root root 21 Jan 25 23:58 log-output_log-output-pod_f44bfe41-4f0c-42be-997d-5a55f4c31072
上記の通り log-output_log-output-pod_f44bfe41-4f0c-42be-997d-5a55f4c31072 というディレクトリが作成されていることが確認できます。
ではディレクトリの中のログファイルを確認してみます。
$ sudo ls /var/log/pods/log-output_log-output-pod_f44bfe41-4f0c-42be-997d-5a55f4c31072/busybox/
0.log
$ sudo cat /var/log/pods/log-output_log-output-pod_f44bfe41-4f0c-42be-997d-5a55f4c31072/busybox/0.log
2025-01-25T23:58:54.314766787+00:00 stdout F 1 test stdout 2025-01-25 23:58:54
2025-01-25T23:58:54.314861988+00:00 stderr F 1 test stderr 2025-01-25 23:58:54
2025-01-25T23:59:04.317663912+00:00 stdout F 2 test stdout 2025-01-25 23:59:04
2025-01-25T23:59:04.317702753+00:00 stderr F 2 test stderr 2025-01-25 23:59:04
2025-01-25T23:59:14.318768188+00:00 stdout F 3 test stdout 2025-01-25 23:59:14
2025-01-25T23:59:14.318825348+00:00 stderr F 3 test stderr 2025-01-25 23:59:14
2025-01-25T23:59:24.321939274+00:00 stdout F 4 test stdout 2025-01-25 23:59:24
2025-01-25T23:59:24.321975035+00:00 stderr F 4 test stderr 2025-01-25 23:59:24
上記の通り、Podのログがログファイルに記述されていることが確認できます。
ログの各行は以下のフォーマットで記録されています:
<timestamp> <stream> <F> <content>
- timestamp: ログが記録された時刻
- stream: 出力元(stdout または stderr)
- F: Full Line を示すフラグ
- content: 実際のログ内容
ちなみに、このディレクトリ名の命名規則は以下の通りです。
<namespace>_<pod-name>_<pod-id>/<container-name>/<number>.log
余談ですが、/var/log/pods/ 以下のディレクトリのシンボリックリンクとして /var/log/containers/ ディレクトリが存在します。
$ sudo ls -l /var/log/containers/
total 0
lrwxrwxrwx. 1 root root 101 Jan 23 07:27 coredns-8695fb47cb-fl2kp_kube-system_coredns-7934fd5a480cf4697ea302e8c7a5ba9fe95e507867797b7211c168e618b4a6f1.log -> /var/log/pods/kube-system_coredns-8695fb47cb-fl2kp_93f8735d-a924-467c-b851-a8de9a53c05f/coredns/0.log
lrwxrwxrwx. 1 root root 103 Jan 24 08:31 csi-oci-node-zckxp_kube-system_csi-node-driver-b48f61de4feedf61ff7b358701f5253eb7a026fa0b6083950e3575c84ff494f8.log -> /var/log/pods/kube-system_csi-oci-node-zckxp_862dd899-853f-4a96-a0de-9a1d84997db1/csi-node-driver/0.log
lrwxrwxrwx. 1 root root 116 Jan 23 07:27 kube-dns-autoscaler-745d6f8477-pjsp5_kube-system_autoscaler-766313c9c78b95a224d3812ec47378e3332db7543925eba8c60ec0972f9bdf12.log -> /var/log/pods/kube-system_kube-dns-autoscaler-745d6f8477-pjsp5_40e305be-68a2-42ec-a2ff-b8ea2c936627/autoscaler/0.log
lrwxrwxrwx. 1 root root 101 Jan 23 07:26 kube-proxy-5pvcb_kube-system_init-kube-proxy-66a7f03ee15de5b1c9333b219ed7edc90c19e79ab15644d08fd01b54aea6f321.log -> /var/log/pods/kube-system_kube-proxy-5pvcb_a1048773-a0fa-41d2-ad02-fce9e484b6ba/init-kube-proxy/0.log
lrwxrwxrwx. 1 root root 96 Jan 23 07:26 kube-proxy-5pvcb_kube-system_kube-proxy-e50084cf7643abfa3b98870728d1ccf74030b8145ba1dd279d1375691c46ab56.log -> /var/log/pods/kube-system_kube-proxy-5pvcb_a1048773-a0fa-41d2-ad02-fce9e484b6ba/kube-proxy/0.log
lrwxrwxrwx. 1 root root 106 Jan 23 07:26 proxymux-client-dkdt9_kube-system_proxymux-client-1425e353b0ab6331b98625ff0cc8f7cbbeeef7f1ceff6d163dae487806300c77.log -> /var/log/pods/kube-system_proxymux-client-dkdt9_82d1c808-f35d-45bb-a49e-6bba829ff0ae/proxymux-client/0.log
lrwxrwxrwx. 1 root root 108 Jan 23 07:26 vcn-native-ip-cni-wrkk5_kube-system_install-cni-ips-18beca52094fd16f6f67b45e2fbd687ccb24b39d54d7fcfe7978c82e44b39450.log -> /var/log/pods/kube-system_vcn-native-ip-cni-wrkk5_534ecf6b-5d5f-4c69-af4c-a74e59be6a62/install-cni-ips/0.log
lrwxrwxrwx. 1 root root 105 Jan 23 07:26 vcn-native-ip-cni-wrkk5_kube-system_oci-cni-init-4297ab55ef9bd8980b52be692ff393114ae99ebe7f5d964fa662f7fb6abd15d1.log -> /var/log/pods/kube-system_vcn-native-ip-cni-wrkk5_534ecf6b-5d5f-4c69-af4c-a74e59be6a62/oci-cni-init/0.log
おまけ
ちなみに、fluent-bitなどを使用してPodのログを収集する場合は、以下のようにパス指定することで、任意のPodのログのみを収集することができます。(筆者はこのパス設定で少しはまったのでメモ的な意味も込めて記載します。)
/var/log/pods/*/<container-name>/*
### ex. /var/log/pods/*/busybox/*
### もしくは
/var/log/containers/*/<container-name>/*
### ex. /var/log/containers/*/busybox/*
おわりに
非常に簡単でしたが、NodeとPodのログ収集機能について調べてみました。
本当はkubeleteがどのようにPodのログを収集しているのかを調査したかったのですが、筆者はGo言語にあまり詳しくないため、またそのうち調べてみたいと思います。
今度はOCIのログ収集リソースなどを使用してPodのログを外部化する方法を調査してみたいと思います。
Discussion