Kubernetes那点事儿——日志管理

K8s日志管理

  • 前言
  • 一、日志
  • 二、K8s应用日志
  • 标准输出
    • 应用日志收集
      • 1、emptyDir挂载收集
      • 2、边车容器收集


前言

程序运行中输出的日志默认暂存在Pod中,当Pod销毁重建时,日志也会丢失。所以需要一些持久化的方法保存程序日志。

一、日志

  1. K8s系统日志

    • kubelet组件,systemd方式部署,journalctl -u kubelet 查看
    • 其他组件,pod方式部署,kubectl logs 查看
    • 系统日志,/var/log/message

    二进制方式部署,所有组件均为systemd方式部署。

  2. K8s应用日志

    • 标准输出
    • 日志文件

二、K8s应用日志

标准输出

kubectl logs <Pod名称>
kubectl logs -f <Pod名称>
kubectl logs -f <Pod名称> -c <容器名>

Kubernetes那点事儿——日志管理_第1张图片

标准输出在宿主机的路径:(此功能为docker自身功能,docker会将容器中标准输入持久化到宿主机本地文件)
/var/log/docker/containers//-json.log
/var/log/containers/.log

Kubernetes那点事儿——日志管理_第2张图片

应用日志收集

1、emptyDir挂载收集

这里涉及到pod的挂载方式(存储)emptyDir,大家可以先熟悉一下,后续我们在存储部分会专门研究挂在卷。

emptydir实际是将容器中应用日志使用emptyDir数据卷将日志文件持久化到宿主机上,目录:/var/lib/kubelet/pods//volumes/kubernetes.io~empty-dir/

创建一个deploymen 并 挂载 emptydir

[root@k8s-master ~]# cat emptyDir.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: log-collect
spec:
  replicas: 1
  selector:
    matchLabels:
      app: demo
  template:
    metadata:
      labels:
        app: demo
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
        volumeMounts:
        - name: logs
          mountPath: /var/log/nginx # 挂载nginx日志目录
      volumes:
      - name: logs
        emptyDir: {}

分别从宿主机日志及pod里观察日志,看日志是否一致

Kubernetes那点事儿——日志管理_第3张图片
Kubernetes那点事儿——日志管理_第4张图片
结果是一致的,说明使用emptyDir挂载是挂载到了宿主机的/var/lib/kubelet/pods//volumes/kubernetes.io~empty-dir/logs/access.log

此方式只是将pod的应用日志文件持久化到宿主机的相应目录下,没有标准输出,所以kubectl logs无法获取到日志

Kubernetes那点事儿——日志管理_第5张图片

2、边车容器收集

边车容器也就是常说的sidecar,可以理解是为是在emptyDir挂载方式上的改进,pod里再创建一个docker用于收集日志,如filebeat,fluentd等。当然,也可以作为标准输出

sidecar示例

[root@k8s-master yaml]# cat sidecar.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: log-collect
spec:
  replicas: 1
  selector:
    matchLabels:
      app: demo
  template:
    metadata:
      labels:
        app: demo
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
        volumeMounts:
        - name: logs
          mountPath: /var/log/nginx
      - name: log-coll
        image: busybox
        args: [/bin/sh,-c,'tail -f /opt/access.log']
        volumeMounts:
        - name: logs
          mountPath: /opt
      volumes:
      - name: logs
        emptyDir: {}

我们访问这个nginx,然后kubectl logs查看日志

Kubernetes那点事儿——日志管理_第6张图片
当然我们可以将其他日志收集组件作为sidecar,如flunetd、filebeat等

你可能感兴趣的:(kubernetes,docker,容器)