需求背景

  • 业务发展越来越庞大,服务器越来越多

  • 各种访问日志、应用日志、错误日志量越来越多

  • 开发人员排查问题,需要到服务器上查日志,效率低、权限不好控制

  • 运维需实时关注业务访问情况

容器特性给日志采集带来的难度

容器特性给日志采集带来的难度:

  • 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 # 查看存储类

elk.zip

搭建日志系统:

  • elasticsearch.yaml # ES数据库

  • kibana.yaml # 可视化展示

日志收集:

  • filebeat-kubernetes.yaml # 采集所有容器标准输出

  • app-log-stdout.yaml # 标准输出测试应用

  • app-log-logfile.yaml # 日志文件测试应用

可视化展示日志:

  1. 查看索引(日志记录集合):Management -> Stack Management -> 索引管理

  2. 将索引关联到Kibana:索引模式 -> 创建 -> 匹配模式 -> 选择时间戳

  3. 在Discover选择索引模式查看日志