走ると
$ kubectl logs <container>
ポッドのログを取得します。
しかし、それらのログのfilesはどこにありますか?
いくつかの情報源は/var/log/containers/
他の人は/var/lib/docker/containers/
しかし、実際のアプリケーションまたはポッドのログが見つかりませんでした。
ディスク上のファイル名は
docker inspect $pod_name_or_sha | jq -r '.[0].LogPath'
dockerデーモンの構成がデフォルトの{"log-driver": "json-file"}
であると仮定すると、kubectl logs
が正しく動作する場合はほぼ確実に真になります。
これも言うまでもありませんが、ポッドがdocker inspect
にスケジュールされたNodeにいるか、ディスク上のログファイルの存在をスニッフィングしている必要があります。 kubectl describe pod $pod_name
はNodeの名前をレンダリングします。プログラムで取得したい場合は、kubectl get -o json pod $pod_name
にあると思われるかもしれません。
それらのディレクトリに何かありますか?
私のクラスターでは、各ポッドからのstdout/stderrログは/var/log/containers
にありますが、いくつかのリンク/リダイレクトがあります。
/var/log/containers/<pod-name>_<namespace>_<container-name-container-id>.log -> /var/log/pods/<some-uuid>/<container-name>_0.log
そして、そのログは実際には/var/lib/docker
にリンクされています。
<container-name>_0.log -> /var/lib/docker/containers/<container-id>/<container-id>-json.log
短い答え:
Dockerを使用している場合、各コンテナーのstdout
は/var/lib/docker/containers
に格納されます。ただし、Kubernetesは、ポッドに基づいてログを検索するのに役立つディレクトリ構造も作成するため、/var/log/pods/<namespace>_<pod_name>_<pod_id>/<container_name>/
のノードで実行されている各ポッドのコンテナログを検索できます。
長い回答:
Dockerは、各コンテナーからstdout
ログをトラップし、ホストの/var/lib/docker/containers
に保存します。 KubernetesがコンテナランタイムとしてDockerを使用する場合、DockerはコンテナログもKubernetesノードのその場所に保存します。ただし、コンテナをKubernetesで直接実行しない(ポッドを実行する)ため、Kubernetesは/var/log/pods/
ディレクトリと/var/log/containers
ディレクトリも作成して、ポッドに基づいてログファイルをより適切に整理できるようにします。
/var/log/pods/
内の各ディレクトリには、単一のポッドのログが格納され、それぞれに構造<namespace>_<pod_name>_<pod_id>
を使用して名前が付けられます。
ポッドのIDは、
kubectl get pod -n core gloo-76dffbd956-rmvdz -o jsonpath='{.metadata.uid}'
を実行して取得できます。yq
の使用に慣れている場合は、kubectl get pod <pod_name> -o yaml | yq r - metadata.uid
の実行がより簡単であることがわかります。
各/var/log/pods/<namespace>_<pod_name>_<pod_id>/
ディレクトリ内にはさらに多くのディレクトリがあり、それぞれがポッド内のコンテナを表します。これらのディレクトリの名前は、コンテナの名前と同じです。最後に、/var/log/pods/<namespace>_<pod_name>_<pod_id>/<container_name>/
ディレクトリ内を見ると、Dockerによって/var/lib/docker/containers
内に保存されているログファイルへのシンボリックリンクが見つかります。
同様に、/var/log/containers/
ディレクトリ内には、/var/log/pods/<namespace>_<pod_name>_<pod_id>/<container_name>/
ディレクトリへのシンボリックリンクがあります。これらのシンボリックリンクは、構造<pod_name>_<namespace>_<container_id>
を使用して名前が付けられます。
ログは、各ノードのkubeletによって管理されます。 kubectl logs <pod>
を実行すると、ポッドが実行されているノードのkubeletにリクエストが渡され、関連するログファイルが読み取られます。
あなたはアーキテクチャを見ることができます ここ