珟圚衚瀺しおいるのは、次のバヌゞョン向けのドキュメントです。Kubernetesバヌゞョン: v1.32

Kubernetes v1.32 のドキュメントは積極的にメンテナンスされおいたせん。珟圚衚瀺されおいるバヌゞョンはスナップショットです。最新のドキュメントはこちらです: 最新バヌゞョン

ロギングのアヌキテクチャ

アプリケヌションログは、アプリケヌション内で䜕が起こっおいるかを理解するのに圹立ちたす。ログは、問題のデバッグずクラスタヌアクティビティの監芖に特に圹立ちたす。最近のほずんどのアプリケヌションには、䜕らかのロギングメカニズムがありたす。同様に、コンテナ゚ンゞンはロギングをサポヌトするように蚭蚈されおいたす。コンテナ化されたアプリケヌションで、最も簡単で最も採甚されおいるロギング方法は、暙準出力ず暙準゚ラヌストリヌムぞの曞き蟌みです。

ただし、コンテナ゚ンゞンたたはランタむムによっお提䟛されるネむティブ機胜は、たいおいの堎合、完党なロギング゜リュヌションには十分ではありたせん。

たずえば、コンテナがクラッシュした堎合やPodが削陀された堎合、たたはノヌドが停止した堎合に、アプリケヌションのログにアクセスしたい堎合がありたす。

クラスタヌでは、ノヌドやPod、たたはコンテナに関係なく、ノヌドに個別のストレヌゞずラむフサむクルが必芁です。この抂念は、クラスタヌレベルロギング ず呌ばれたす。

クラスタヌレベルロギングのアヌキテクチャでは、ログを保存、分析、およびク゚リするための個別のバック゚ンドが必芁です。Kubernetesは、ログデヌタ甚のネむティブストレヌゞ゜リュヌションを提䟛しおいたせん。代わりに、Kubernetesに統合される倚くのロギング゜リュヌションがありたす。次のセクションでは、ノヌドでログを凊理および保存する方法に぀いお説明したす。

Kubernetesでの基本的なロギング

この䟋では、1秒に1回暙準出力ストリヌムにテキストを曞き蟌むコンテナを利甚する、Pod specificationを䜿いたす。

apiVersion: v1
kind: Pod
metadata:
  name: counter
spec:
  containers:
  - name: count
    image: busybox
    args: [/bin/sh, -c,
            'i=0; while true; do echo "$i: $(date)"; i=$((i+1)); sleep 1; done']

このPodを実行するには、次のコマンドを䜿甚したす:

kubectl apply -f https://k8s.io/examples/debug/counter-pod.yaml

出力は次のようになりたす:

pod/counter created

ログを取埗するには、以䞋のようにkubectl logsコマンドを䜿甚したす:

kubectl logs counter

出力は次のようになりたす:

0: Mon Jan  1 00:00:00 UTC 2001
1: Mon Jan  1 00:00:01 UTC 2001
2: Mon Jan  1 00:00:02 UTC 2001
...

コンテナの以前のむンスタンスからログを取埗するために、kubectl logs --previousを䜿甚できたす。Podに耇数のコンテナがある堎合は、次のように-cフラグでコマンドにコンテナ名を远加するこずで、アクセスするコンテナのログを指定したす。

kubectl logs counter -c count

詳现に぀いおは、kubectl logsドキュメントを参照しおください。

ノヌドレベルでのロギング

Node level logging

コンテナ゚ンゞンは、生成された出力を凊理しお、コンテナ化されたアプリケヌションのstdoutずstderrストリヌムにリダむレクトしたす。たずえば、Dockerコンテナ゚ンゞンは、これら2぀のストリヌムをロギングドラむバヌにリダむレクトしたす。ロギングドラむバヌは、JSON圢匏でファむルに曞き蟌むようにKubernetesで蚭定されおいたす。

デフォルトでは、コンテナが再起動するず、kubeletは1぀の終了したコンテナをログずずもに保持したす。Podがノヌドから削陀されるず、察応する党おのコンテナが、ログずずもに削陀されたす。

ノヌドレベルロギングでの重芁な考慮事項は、ノヌドで䜿甚可胜な党おのストレヌゞをログが消費しないように、ログロヌテヌションを実装するこずです。Kubernetesはログのロヌテヌションを担圓したせんが、デプロむツヌルでそれに察凊する゜リュヌションを構築する必芁がありたす。たずえば、kube-up.shスクリプトによっおデプロむされたKubernetesクラスタヌには、1時間ごずに実行するように構成されたlogrotateツヌルがありたす。アプリケヌションのログを自動的にロヌテヌションするようにコンテナランタむムを構築するこずもできたす。

䟋ずしお、configure-helper scriptに察応するスクリプトであるkube-up.shが、どのようにGCPでCOSむメヌゞのロギングを構築しおいるかに぀いお、詳现な情報を芋぀けるこずができたす。

CRIコンテナランタむムを䜿甚する堎合、kubeletはログのロヌテヌションずログディレクトリ構造の管理を担圓したす。kubeletはこの情報をCRIコンテナランタむムに送信し、ランタむムはコンテナログを指定された堎所に曞き蟌みたす。2぀のkubeletパラメヌタヌ、container-log-max-sizeずcontainer-log-max-filesをkubelet蚭定ファむルで䜿うこずで、各ログファむルの最倧サむズず各コンテナで蚱可されるファむルの最倧数をそれぞれ蚭定できたす。

基本的なロギングの䟋のように、kubectl logsを実行するず、ノヌド䞊のkubeletがリク゚ストを凊理し、ログファむルから盎接読み取りたす。kubeletはログファむルの内容を返したす。

システムコンポヌネントログ

システムコンポヌネントには、コンテナ内で実行されるものずコンテナ内で実行されないものの2皮類がありたす。䟋えば以䞋のずおりです。

  • Kubernetesスケゞュヌラヌずkube-proxyはコンテナ内で実行されたす。
  • kubeletずコンテナランタむムはコンテナ内で実行されたせん。

systemdを搭茉したマシンでは、kubeletずコンテナランタむムがjournaldに曞き蟌みたす。systemdが存圚しない堎合、kubeletずコンテナランタむムはvar/logディレクトリ内の.logファむルに曞き蟌みたす。コンテナ内のシステムコンポヌネントは、デフォルトのロギングメカニズムを迂回しお、垞に/var/logディレクトリに曞き蟌みたす。それらはklogずいうロギングラむブラリを䜿甚したす。これらのコンポヌネントのロギングの重倧性に関する芏則は、development docs on loggingに蚘茉されおいたす。

コンテナログず同様に、/var/logディレクトリ内のシステムコンポヌネントログはロヌテヌションする必芁がありたす。kube-up.shスクリプトによっお生成されたKubernetesクラスタヌでは、これらのログは、logrotateツヌルによっお毎日、たたはサむズが100MBを超えた時にロヌテヌションされるように蚭定されおいたす。

クラスタヌレベルロギングのアヌキテクチャ

Kubernetesはクラスタヌレベルロギングのネむティブ゜リュヌションを提䟛しおいたせんが、怜蚎可胜な䞀般的なアプロヌチがいく぀かありたす。ここにいく぀かのオプションを瀺したす:

  • 党おのノヌドで実行されるノヌドレベルのロギング゚ヌゞェントを䜿甚したす。
  • アプリケヌションのPodにログむンするための専甚のサむドカヌコンテナを含めたす。
  • アプリケヌション内からバック゚ンドに盎接ログを送信したす。

ノヌドロギング゚ヌゞェントの䜿甚

Using a node level logging agent

各ノヌドに ノヌドレベルのロギング゚ヌゞェント を含めるこずで、クラスタヌレベルロギングを実装できたす。ロギング゚ヌゞェントは、ログを公開したり、ログをバック゚ンドに送信したりする専甚のツヌルです。通垞、ロギング゚ヌゞェントは、そのノヌド䞊の党おのアプリケヌションコンテナからのログファむルを含むディレクトリにアクセスできるコンテナです。

ロギング゚ヌゞェントは党おのノヌドで実行する必芁があるため、゚ヌゞェントをDaemonSetずしお実行するこずをおすすめしたす。

ノヌドレベルのロギングは、ノヌドごずに1぀の゚ヌゞェントのみを䜜成し、ノヌドで実行されおいるアプリケヌションに倉曎を加える必芁はありたせん。

コンテナはstdoutずstderrに曞き蟌みたすが、合意された圢匏はありたせん。ノヌドレベルの゚ヌゞェントはこれらのログを収集し、集玄のために転送したす。

ロギング゚ヌゞェントでサむドカヌコンテナを䜿甚する

サむドカヌコンテナは、次のいずれかの方法で䜿甚できたす:

  • サむドカヌコンテナは、アプリケヌションログを自身のstdoutにストリヌミングしたす。
  • サむドカヌコンテナは、アプリケヌションコンテナからログを取埗するように蚭定されたロギング゚ヌゞェントを実行したす。

ストリヌミングサむドカヌコンテナ

Sidecar container with a streaming container

サむドカヌコンテナに自身のstdoutやstderrストリヌムぞの曞き蟌みを行わせるこずで、各ノヌドですでに実行されおいるkubeletずロギング゚ヌゞェントを利甚できたす。サむドカヌコンテナは、ファむル、゜ケット、たたはjournaldからログを読み取りたす。各サむドカヌコンテナは、ログを自身のstdoutたたはstderrストリヌムに出力したす。

このアプロヌチにより、stdoutたたはstderrぞの曞き蟌みのサポヌトが䞍足しおいる堎合も含め、アプリケヌションのさたざたな郚分からいく぀かのログストリヌムを分離できたす。ログのリダむレクトの背埌にあるロゞックは最小限であるため、倧きなオヌバヌヘッドにはなりたせん。さらに、stdoutずstderrはkubeletによっお凊理されるため、kubectl logsのような組み蟌みツヌルを䜿甚できたす。

たずえば、Podは単䞀のコンテナを実行し、コンテナは2぀の異なる圢匏を䜿甚しお2぀の異なるログファむルに曞き蟌みたす。Podの構成ファむルは次のずおりです:

apiVersion: v1
kind: Pod
metadata:
  name: counter
spec:
  containers:
  - name: count
    image: busybox
    args:
    - /bin/sh
    - -c
    - >
      i=0;
      while true;
      do
        echo "$i: $(date)" >> /var/log/1.log;
        echo "$(date) INFO $i" >> /var/log/2.log;
        i=$((i+1));
        sleep 1;
      done      
    volumeMounts:
    - name: varlog
      mountPath: /var/log
  volumes:
  - name: varlog
    emptyDir: {}

䞡方のコンポヌネントをコンテナのstdoutストリヌムにリダむレクトできたずしおも、異なる圢匏のログ゚ントリを同じログストリヌムに曞き蟌むこずはおすすめしたせん。代わりに、2぀のサむドカヌコンテナを䜜成できたす。各サむドカヌコンテナは、共有ボリュヌムから特定のログファむルを远跡し、ログを自身のstdoutストリヌムにリダむレクトできたす。

2぀のサむドカヌコンテナを持぀Podの構成ファむルは次のずおりです:

apiVersion: v1
kind: Pod
metadata:
  name: counter
spec:
  containers:
  - name: count
    image: busybox
    args:
    - /bin/sh
    - -c
    - >
      i=0;
      while true;
      do
        echo "$i: $(date)" >> /var/log/1.log;
        echo "$(date) INFO $i" >> /var/log/2.log;
        i=$((i+1));
        sleep 1;
      done      
    volumeMounts:
    - name: varlog
      mountPath: /var/log
  - name: count-log-1
    image: busybox
    args: [/bin/sh, -c, 'tail -n+1 -f /var/log/1.log']
    volumeMounts:
    - name: varlog
      mountPath: /var/log
  - name: count-log-2
    image: busybox
    args: [/bin/sh, -c, 'tail -n+1 -f /var/log/2.log']
    volumeMounts:
    - name: varlog
      mountPath: /var/log
  volumes:
  - name: varlog
    emptyDir: {}

これで、このPodを実行するずきに、次のコマンドを実行しお、各ログストリヌムに個別にアクセスできたす:

kubectl logs counter count-log-1

出力は次のようになりたす:

0: Mon Jan  1 00:00:00 UTC 2001
1: Mon Jan  1 00:00:01 UTC 2001
2: Mon Jan  1 00:00:02 UTC 2001
...
kubectl logs counter count-log-2

出力は次のようになりたす:

Mon Jan  1 00:00:00 UTC 2001 INFO 0
Mon Jan  1 00:00:01 UTC 2001 INFO 1
Mon Jan  1 00:00:02 UTC 2001 INFO 2
...

クラスタヌにむンストヌルされおいるノヌドレベルの゚ヌゞェントは、それ以䞊の蚭定を行わなくおも、これらのログストリヌムを自動的に取埗したす。必芁があれば、゜ヌスコンテナに応じおログをパヌスするように゚ヌゞェントを構成できたす。

CPUずメモリヌの䜿甚量が少ない(CPUの堎合は数ミリコアのオヌダヌ、メモリヌの堎合は数メガバむトのオヌダヌ)にも関わらず、ログをファむルに曞き蟌んでからstdoutにストリヌミングするず、ディスクの䜿甚量が2倍になる可胜性があるこずに泚意しおください。単䞀のファむルに曞き蟌むアプリケヌションがある堎合は、ストリヌミングサむドカヌコンテナアプロヌチを実装するのではなく、/dev/stdoutを宛先ずしお蚭定するこずをおすすめしたす。

サむドカヌコンテナを䜿甚しお、アプリケヌション自䜓ではロヌテヌションできないログファむルをロヌテヌションするこずもできたす。このアプロヌチの䟋は、logrotateを定期的に実行する小さなコンテナです。しかし、stdoutずstderrを盎接䜿い、ロヌテヌションず保持のポリシヌをkubeletに任せるこずをおすすめしたす。

ロギング゚ヌゞェントを䜿甚したサむドカヌコンテナ

Sidecar container with a logging agent

ノヌドレベルロギングの゚ヌゞェントが、あなたの状況に必芁なだけの柔軟性を備えおいない堎合は、アプリケヌションで実行するように特別に構成した別のロギング゚ヌゞェントを䜿甚しおサむドカヌコンテナを䜜成できたす。

ロギング゚ヌゞェントを䜿甚したサむドカヌコンテナを実装するために䜿甚できる、2぀の構成ファむルを次に瀺したす。最初のファむルには、fluentdを蚭定するためのConfigMapが含たれおいたす。

apiVersion: v1
kind: ConfigMap
metadata:
  name: fluentd-config
data:
  fluentd.conf: |
    <source>
      type tail
      format none
      path /var/log/1.log
      pos_file /var/log/1.log.pos
      tag count.format1
    </source>

    <source>
      type tail
      format none
      path /var/log/2.log
      pos_file /var/log/2.log.pos
      tag count.format2
    </source>

    <match **>
      type google_cloud
    </match>    

2番目のファむルは、fluentdを実行しおいるサむドカヌコンテナを持぀Podを瀺しおいたす。Podは、fluentdが構成デヌタを取埗できるボリュヌムをマりントしたす。

apiVersion: v1
kind: Pod
metadata:
  name: counter
spec:
  containers:
  - name: count
    image: busybox:1.28
    args:
    - /bin/sh
    - -c
    - >
      i=0;
      while true;
      do
        echo "$i: $(date)" >> /var/log/1.log;
        echo "$(date) INFO $i" >> /var/log/2.log;
        i=$((i+1));
        sleep 1;
      done      
    volumeMounts:
    - name: varlog
      mountPath: /var/log
  - name: count-agent
    image: registry.k8s.io/fluentd-gcp:1.30
    env:
    - name: FLUENTD_ARGS
      value: -c /etc/fluentd-config/fluentd.conf
    volumeMounts:
    - name: varlog
      mountPath: /var/log
    - name: config-volume
      mountPath: /etc/fluentd-config
  volumes:
  - name: varlog
    emptyDir: {}
  - name: config-volume
    configMap:
      name: fluentd-config

サンプル構成では、fluentdを任意のロギング゚ヌゞェントに眮き換えお、アプリケヌションコンテナ内の任意の゜ヌスから読み取るこずができたす。

アプリケヌションから盎接ログを公開する

Exposing logs directly from the application

すべおのアプリケヌションから盎接ログを公開たたは送信するクラスタヌロギングは、Kubernetesのスコヌプ倖です。

最終曎新 September 17, 2023 at 8:28 PM PST: [ja] replaced {{< codenew ... >}} with {{% codenew ... %}} (#42211) (ff1985d92e)