Docker和Kubernetes的日志机制

艺帆风顺 发布于 2025-04-02 21 次阅读


一、日志

日志展现的是应用程序运行产生的事件或记录,可以详细解释其运行状态。日志描述了一些离散的、不连续的事件,对于应用程序的可见性是很好的信息来源,也为应用程序的分析提供了精确的数据源。但是日志数据存在一定的局限性,它依赖于开发者暴露出来的内容,而且其存储和查询需要消耗大量的资源。

二、Docker日志

Docker支持多种日志记录机制,用以帮助用户从正在运行的容器和服务中获取信息,这种机制被称为日志驱动程序。Docker从1.6版本开始支持日志驱动,用户可以将日志直接从容器输出到如syslogd这样的日志系统中。

每个Docker守护进程都有一个默认的日志驱动程序,通常这个默认的日志驱动是json-file,也就是以JSON文件的形式保存日志信息。同时Docker还支持其他日志驱动,比如none、syslog、gelf和fluentd等。

Docker支持的日志驱动如下:

驱动描述
none不启用日志功能,该容器没有可用的日志,并且不返回任何输出
local日志以自定义格式存储,旨在最大程度减少开销
json-file日志格式为json,属于Docker默认日志驱动
syslog将日志写入syslog,此举须确保syslog守护进程在Docker主机上已运行
journald将日志写入journald,此举须确保journald守护进程在Docker主机上已运行
gelf将日志写入graylog或Logstash等端点
fluentd将日志写入fluentd,须确保fluentd在主机上已运行
awslogs将日志写入Amazon CloudWatch Logs
splunk使用HTTP Event Collector将日志写入splunk
etwlogs将日志写为HTTP Event Tracing for Windows(ETW)事件,仅适用于wondows
gcplogs将日志写入Google Cloud Platform
logentries将日志写入Rapid7 Logentries

查看当前Docker使用的日志驱动:

docker info --format '{{.LoggingDriver}}'

修改Docker日志驱动:

vim /etc/docker/daemon.json
--------------------------------------------------
{
// 修改为需要的日志驱动即可
"log-driver":"local"
}

配置Docker日志驱动:

vim /etc/docker/daemon.json
--------------------------------------------------
{
"log-driver": "json-file",
"log-opts": {
// 单个日志最大尺寸
"max-size": "10m",
// 日志文件的最大数量
"max-file": "3",
// 日志的ladel
"labels": "production_status",
"env": "os,customer"
}
}

之后重启Docker服务即可生效。

针对特定容器配置日志驱动:

# 对nginx容器设置日志驱动为local
docker run -d --log-driver local nginx
# 对nginx容器的日志驱动进行配置docker run -d --log-driver local --log-opt max-size=10m --log-opt max-file=3 nginx

三、Kubernetes日志

通过应用程序的日志记录可以更好地了解应用内部的运行状况,同时对调试问题、监控集群活动以及对应用程序运行过程的安全性分析有着非常大的作用。

在集群中,日志应该具有独立的存储和生命周期,与节点、Pod或容器的生命周期相独立。这里通常会称为集群级的日志。集群级的日志架构需要一个独立的后端用来存储、分析和查询日志。

例如通过这个yaml创建的pod,每秒钟通过标准输出打印日志记录:

apiVersion: v1
kind: Pod
metadata:
name: counter
spec:
containers:
- name: count
image: busybox
args: [/bin/sh, -c, 'i=0; while true; do echo "$i: $(date)"; i=$((i+1)); sleep 1; done']

创建pod:

kubectl apply -f aaa-pod.yaml

通过以下命令即可获取日志:

kubectl logs aaa

对于节点层面的日志记录,容器化应用写入stdout和stderr的任何数据都会被容器引擎捕获,并被重定向到某个位置,如Docker容器引擎将这两个输出流重定向到某个日志驱动,该日志驱动在Kubernetes中配置为以JSON格式写入文件。在默认情况下,如果容器重启,kubelet会保留被终止容器的日志,如果Pod在工作节点被删除,该Pod中所有的容器也会被删除,包括容器的日志记录。

在Kubernetes中,除了Pod中应用程序的日志外,Kubernetes系统组件的日志同样需要有一定的方案来记录和存储。系统组件日志主要记录了集群中发生的事件,这对于调试以及安全审计有着重要的作用。

在Kubernetes中,系统组件日志可以根据需要配置日志的粒度,灵活调整日志记录的细节程度。日志可以是只粗粒度地显示组件内的错误,也可以是更加细粒度的。系统组件根据部署和运行方式的不同,可以分为两种类型。其中一种是运行在容器中的,比如kube-scheduler、kube-proxy等;另一种是不在容器中运行的,比如kubelet以及容器运行时等。在使用systemd机制的服务器上,kubelet和容器运行时将日志写入journald中。如果没有systemd,它们会将日志写入/var/log目录下的.log文件中。

    版权声明:本文内容来自CSDN:武天旭,遵循CC 4.0 BY-SA版权协议上原文接及本声明。本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行可。原文链接:https://blog.csdn.net/wutianxu123/article/details/129586593?spm=1001.2014.3001.5501如有涉及到侵权,请联系,将立即予以删除处理。在此特别鸣谢原作者的创作。此篇文章的所有版权归原作者所有,与本公众号无关,商业转载建议请联系原作者,非商业转载请注明出处。