K8s日志管理
- 前言
- 一、日志
- 二、K8s应用日志
- 标准输出
- 应用日志收集
- 1、emptyDir挂载收集
- 2、边车容器收集
前言
程序运行中输出的日志默认暂存在Pod中,当Pod销毁重建时,日志也会丢失。所以需要一些持久化的方法保存程序日志。
一、日志
-
K8s系统日志
- kubelet组件,systemd方式部署,
journalctl -u kubelet
查看 - 其他组件,pod方式部署,
kubectl logs
查看 - 系统日志,/var/log/message
二进制方式部署,所有组件均为systemd方式部署。
- kubelet组件,systemd方式部署,
-
K8s应用日志
- 标准输出
- 日志文件
二、K8s应用日志
标准输出
kubectl logs <Pod名称>
kubectl logs -f <Pod名称>
kubectl logs -f <Pod名称> -c <容器名>
标准输出在宿主机的路径:(此功能为docker自身功能,docker会将容器中标准输入持久化到宿主机本地文件)
/var/log/docker/containers/<container-id>/<container-id>-json.log
/var/log/containers/<container-id>.log
应用日志收集
1、emptyDir挂载收集
这里涉及到pod的挂载方式(存储)emptyDir,大家可以先熟悉一下,后续我们在存储部分会专门研究挂在卷。
emptydir实际是将容器中应用日志使用emptyDir数据卷将日志文件持久化到宿主机上,目录:/var/lib/kubelet/pods/<pod-id>/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里观察日志,看日志是否一致
结果是一致的,说明使用emptyDir挂载是挂载到了宿主机的/var/lib/kubelet/pods/<pod-id>/volumes/kubernetes.io~empty-dir/logs/access.log
此方式只是将pod的应用日志文件持久化到宿主机的相应目录下,没有标准输出,所以kubectl logs无法获取到日志
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查看日志
当然我们可以将其他日志收集组件作为sidecar,如flunetd、filebeat等