使用ELK收集k8s平台日志
1.收集哪些日志?
- K8S系统的组件日志
- K8S Cluster里面部署的应用程序日志
- 标准输出
- 日志文件 (输出到指定文件里)
- 日志轮转(本地保留30天)
- 日志格式 (json,kv)
如果是kubeadm方式部署的k8s 日志是收集的 /var/log/message
如果是二进制部署的k8s 日志是配置文件中定义的日志路径
应用容器日志
/var/lib/docker/contianers/*/*-json.log
docker配置文件中定义了 默认日志格式为json
pod的日志路径
/var/lib/kubelet/pods/*/volumes/
2.ELK收集日志架构
其中logstash 是非必选的组件,如果日志场景比较复杂的时候可以加上logstash做出更好的预处理然后存入ES。
3.容器中的日志怎么收集
方案一:
Node上部署一个日志收集程序
- DaemonSet方式部署日志收集程序
- 对本节点/var/log/kubelet/pods和 /var/lib/docker/containers/两个目录下的日志进 行采集
- Pod中容器日志目录挂载到宿主机统一目录上
方案二:
Pod中附加专用日志收集的容器
- 每个运行应用程序的Pod中增加一个日志 收集容器,使用emtyDir共享日志目录让 日志收集程序读取到。
方案三:
应用程序直接推送日志
- 超出Kubernetes范围
方案比较:
方式 |
优点 |
缺点 |
方案一:Node上部署一个日志收集程序 |
每个Node仅需部署一个日志收集程序, 资源消耗少,对应用无侵入 |
应用程序日志如果写到标准输出和标准错误输出, 那就不支持多行日志。 |
方案二:Pod中附加专用日志收集的容器 |
低耦合 |
每个Pod启动一个日志收集代理,增加资源消耗, 并增加运维维护成本 |
方案三:应用程序直接推送日志 | 无需额外收集工具 |
浸入应用,增加应用复杂度 |
4.k8s部署efk
mkdir efk && cd efk
elasticsearch.yaml
apiVersion