elk收集kubernetes应用日志
867字约3分钟
2024-09-29
需求背景
业务发展越来越庞大,服务器越来越多
各种访问日志、应用日志、错误日志量越来越多
开发人员排查问题,需要到服务器上查日志,效率低、权限不好控制
运维需实时关注业务访问情况
容器特性给日志采集带来的难度
容器特性给日志采集带来的难度:
K8s弹性伸缩性:导致不能预先确定采集的目标
容器隔离性:容器的文件系统与宿主机是隔离,导致 日志采集器读取日志文件受阻
日志按体现方式分类
应用程序日志记录体现方式分为两类:
标准输出:输出到控制台,使用kubectl logs可以看到
日志文件:写到容器的文件系统的文件
示例:标准输出
kubectl run nginx --image=nginx
kubectl get pod -o wide
curl -I 10.244.36.65
kubectl exec -it nginx -- bash
日志文件在宿主机上的路径
kubectl get pod -o wide #查看pod所在节点
#采集所有容器的日志
/var/lib/docker/containers/*/*-json.log
示例:日志文件
kubectl run tomcat --image=tomcat
kubectl get pod -o wide
curl 10.244.36.66:8080
kubectl exec -it tomcat -- bash
方式一:使用emptyDir数据卷挂载容器日志路径到宿主机上,DaemonSet方式部署,在每个节点部署日志采集器采集日志。
vim tomcat.yaml
apiVersion: v1
kind: Pod
metadata:
name: tomcat-web
spec:
containers:
- image: tomcat
name: web
volumeMounts:
- name: logs
mountPath: /usr/local/tomcat/logs
volumes:
- name: logs
emptyDir: {}
方式二:使用emptyDir数据卷共享应用容器的日志让日志采集器容器能够采集到
vim tomcat.yaml
apiVersion: v1
kind: Pod
metadata:
name: tomcat-web
spec:
containers:
- image: tomcat
name: web
volumeMounts:
- name: logs
mountPath: /usr/local/tomcat/logs
- image: busybox
name: test
command: [/bin/sh,-c,'tail -f /tmp/localhost_access_log.2021-02-26.txt']
volumeMounts:
- name: logs
mountPath: /tmp
volumes:
- name: logs
emptyDir: {}
Kubernetes应用日志收集
ELK Stack日志系统
ELK 是三个开源软件的缩写,提供一套完整的企业级日 志平台解决方案。
分别是:
Elasticsearch:搜索、分析和存储数据
Logstash :采集日志、格式化、过滤,最后将数据 推送到Elasticsearch存储
Kibana:数据可视化
Beats :集合了多种单一用途数据采集器,用于实 现从边缘机器向 Logstash 和 Elasticsearch 发送数 据。里面应用最多的是Filebeat,是一个轻量级日 志采集器
部署nfs-pv自动供给
#安装nfs安装包(每个k8s节点都要安装)
yum install nfs-utils
#创建nfs共享目录
mkdir -p /nfs/kubernetes
#修改nfs配置文件
vim /etc/exports
/nfs/kubernetes *(rw,no_root_squash)
#启动nfs并加入开机自启
systemctl start nfs
systemctl enable nfs
#部署NFS实现自动创建PV插件:
git clone https://github.com/kubernetes-incubator/external-storage
cd nfs-client/deploy
kubectl apply -f rbac.yaml # 授权访问apiserver
kubectl apply -f deployment.yaml # 部署插件,需修改里面NFS服务器地址与共享目录
kubectl apply -f class.yaml # 创建存储类
kubectl get sc # 查看存储类
搭建日志系统:
elasticsearch.yaml # ES数据库
kibana.yaml # 可视化展示
日志收集:
filebeat-kubernetes.yaml # 采集所有容器标准输出
app-log-stdout.yaml # 标准输出测试应用
app-log-logfile.yaml # 日志文件测试应用
可视化展示日志:
查看索引(日志记录集合):Management -> Stack Management -> 索引管理
将索引关联到Kibana:索引模式 -> 创建 -> 匹配模式 -> 选择时间戳
在Discover选择索引模式查看日志