官方文档:

https://kubernetes.io/zh/docs/concepts/cluster-administration/logging/

收集日志方案:

一、节点级别日志代理收集

二、sidecar方式收集日志

        1、sidecar程序将日志传送到自己的标准输出

        2、sidecar中的日志代理程序来收集日志

三、从主应用程序中直接输出日志,通过端口暴露或主动推送日志。


示例:

例一:emptyDir挂载的日志目录:如果空间占满会导致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: 
      sizeLimit: 20M # 如果日志占满整个磁盘的话会导致pod奔溃而重启。

例二:使用hostPath方式挂载来收集日志,如果多个Pod跑在同一个节点会造成日志的重复收集。

注意:使用  tail -n+1 -f xxx.log  会读取日志的全部内容并继续读出,如果不想读取之前的日志内容使用 tail -n 0 -f xxx.log 从当前位置来读取日志内容。

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 0 -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
    hostPath: 
      path: /var/log