kubectl logs 命令中的 Kubernetes 日志与 GKE 集群中的 /var/log/containers 不同

Tho*_*ach 5 logging kubernetes google-kubernetes-engine

我在 GCP 上创建了一个 GKE 集群。

kubectl logs 命令中的 Kubernetes 日志与 /var/log/containers 不同

库贝克特尔

{"method":"GET","path":"/healthz","format":"*/*","controller":"Public::PublicPagesController","action":"healthz","status":204,"duration":0.39,"view":0.0,"request_id":"ca29b519-d1e8-49a2-95ae-e5f23b60c36f","params":{},"custom":null,"request_time":"2022-04-27T15:25:43.780+00:00","process_id":6,"@version":"vcam-backend-vvcam-72_shareholder_event-rc16","@timestamp":"2022-04-27T15:25:43.780Z","message":"[204] GET /healthz (Public::PublicPagesController#healthz)"}
Run Code Online (Sandbox Code Playgroud)

并登录 /var/log/containers,将时间戳添加到我的容器日志的开头:

2022-04-27T15:25:43.780523421Z stdout F {"method":"GET","path":"/healthz","format":"*/*","controller":"Public::PublicPagesController","action":"healthz","status":204,"duration":0.39,"view":0.0,"request_id":"ca29b519-d1e8-49a2-95ae-e5f23b60c36f","params":{},"custom":null,"request_time":"2022-04-27T15:25:43.780+00:00","process_id":6,"@version":"vcam-backend-vvcam-72_shareholder_event-rc16","@timestamp":"2022-04-27T15:25:43.780Z","message":"[204] GET /healthz (Public::PublicPagesController#healthz)"}
Run Code Online (Sandbox Code Playgroud)

我希望我的应用程序日志保持一致,我希望它采用 json 格式,就像来自 kubectl 命令的日志一样,这样我就可以解析和分析更多内容。

我想删除这部分:2022-04-27T15:25:43.780523421Z stdout F

有人遇到这个问题吗?如何使容器日志与 kubectl 命令日志相同?

GKE 版本:

Server Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.10-gke.2000", GitCommit:"0823380786b063c3f71d5e7c76826a972e30550d", GitTreeState:"clean", BuildDate:"2022-03-17T09:22:22Z", GoVersion:"go1.16.14b7", Compiler:"gc", Platform:"linux/amd64"}
Run Code Online (Sandbox Code Playgroud)

Docker 守护进程.json

{
  "pidfile": "/var/run/docker.pid",
  "iptables": false,
  "ip-masq": false,
  "log-level": "warn",
  "bip": "169.254.123.1/24",
  "mtu": 1460,
  "storage-driver": "overlay2",
  "live-restore": true,
  "log-driver": "json-file",
  "log-opts": {
      "max-size": "10m",
      "max-file": "5"
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:我注意到日志行开头的时间戳仅在我们添加选项时显示docker logs -t此处的文档 但我仍然不知道如何在 GKE 集群中解决此问题。

Tho*_*ach 4

此问题与容器运行时接口(CRI)有关。您可以在此处阅读有关 CRI 的信息。

目前,我仍然无法根据需要更改日志格式,我只是适应这种新格式。这种格式称为CRI log format,GKE 集群的 CRI 默认总是以这种格式生成日志,聚合日志应用程序也适应这种新的 CRI 日志格式:

  • Grafana/Loki这是支持CRI日志格式的PR : PR
  • Fluent-bit 为 CRI 日志格式创建一个新的解析器:文档

所以我认为你需要改变解决这个问题的方式:如果我们不能按照我们想要的方式改变日志格式,我们可以使用支持这种日志格式的应用程序。

注意:我不确定,但我认为这个问题来自:Kubernetes is removing support for Docker as a container runtime- docs,并且新的容器运行时生成此 CRI 日志格式。