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选择索引模式查看日志 



