Kubernetes日志输出方式与采集方案
Kubernetes日志打印方式
1、标准输出
docker标准输出日志stdout和stderr,使用docker logs或者kubectl logs查看最新的日志(tail)。如果想看到更多的日志,在宿主机目录/var/lib/docker/containers可以找到对应的全部日志。标准输出是k8s社区推荐的日志输出方式。
2、日志文件
下面将从路径、挂载两方面介绍。
默认路径
如何使用log4j打印的志:如果打印的业务日志不采用任何挂载方式,那么业务日志默认打在容器里边的目录中。根据不同的存储驱动,参考链接:https://docs.docker.com/storage/storagedriver/select-storage-driver,在宿主机上将有不同的挂载目录。以华为CCE为例,使用的文件驱动是"devicemapper",挂载根目录为/var/lib/docker/devicemapper/。通过docker inspect命令可以找到docker挂载的子目录,参考"DeviceName":"docker-253:1-1835012-107d7ccf0ab28e58be3553c01225a4d32182a9eec26c89c920ad2db2f9d4c7c7",挂载的目录参考:/var/lib/docker/devicemapper/mnt/107d7ccf0ab28e58be3553c01225a4d32182a9eec26c89c920ad2db2f9d4c7c7/rootfs。通过此目录加上容器内日志目录,就可以很快找到对应的业务日志了。
日志挂载
日志挂载分两种:
1)指定主机目录挂载
指定主机目录挂载的日志文件,针对特定的一些场景,如日志文件比较大,日志文件很重要,需要额外备份等。日志需要额外挂载文件目录。配置信息参考:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | "volumeMounts" : [{ "mountPath" : "/var/paas/sys/log/amsmetric" , "name" : "ams-log" , "policy" : { "logs" : { "rotate" : "" } } }] "volumes" : [{ "hostPath" : { "path" : "/var/paas/sys/log/amsmetric" }, "name" : "ams-log" }] |
对于已经挂载到主机指定目录的日志,直接通过主机目录就访问了。
2)emptyDir挂载
1 2 3 4 5 6 7 8 9 10 | "volumeMounts" : [{ "mountPath" : "/var/paas/sys/log/amsmetric" , "name" : "ams-log" }] "volumes" : [{ "name" : "ams-log" , "emptyDir" : {} }] |
配置完成后,运行日志将会显示到主机上,主机上路径参考:
/opt/varlib/kubelet/pods/0e0a38b0-12f7-11e9-9f33-286ed488da5c/volumes/kubernetes.io~empty-dir/ams-log
日志输出方式对比
采集部署方式
1、sideCar
使用sideCar方式,将采集进程运行在用户的pod中,参考fluentd。
2、虚机方式
使用普通虚拟机方式部署到主机上,直接采集mount到主机上的目录。
3、容器方式
即容器部署,作为特权容器挂载在host的根目录。
总结
不同的日志打印和挂载方式都有自己的优势,没有一个标准说必须使用哪一种,主要看这样的方式是否契合自己的业务。对于K8S集群来说,采集服务最好是容器化的,才能更好地部署和管理采集进程等。综合各种因素,华为云AOM采用第三种部署方式,契合华为CCE容器服务的日志采集。
- END -
往期推荐:
Kubernetes事件离线工具kube-eventer正式开源
Kubernetes + Jenkins + Helm + Springboot 实践
Kubelet 配置不当引发的 K8S 集群雪崩
Kubernetes 常见运维技巧
在 Kubernetes 中部署 Jenkins
🔥 1万位K8S爱好者都在这里,您值得关注!