如何在kubernetes中将应用程序的日志从一个容器放到另一个容器中

如何在kubernetes中将应用程序的日志从一个容器放到另一个容器中,kubernetes,monitoring,prometheus,Kubernetes,Monitoring,Prometheus,我们计划使用Prometheus实现Kubernetes应用程序监控。我们的应用程序在apache中运行,并部署到kubernetes集群。我们正在开发定制的ApacheExporter,它将与我的应用程序容器运行在同一个POD中&从Apache收集指标并将它们推送到Prometheus。作为此监视的一部分,我们需要在apache中解析access.log以获取2xx、3xx、4xx和5xx请求的数量。但是我们部署在Kubernetes中的应用程序不在POD中存储任何日志,而是登录到STDOUT

我们计划使用Prometheus实现Kubernetes应用程序监控。我们的应用程序在apache中运行,并部署到kubernetes集群。我们正在开发定制的ApacheExporter,它将与我的应用程序容器运行在同一个POD中&从Apache收集指标并将它们推送到Prometheus。作为此监视的一部分,我们需要在apache中解析access.log以获取2xx、3xx、4xx和5xx请求的数量。但是我们部署在Kubernetes中的应用程序不在POD中存储任何日志,而是登录到STDOUT。所以我可以从kubectl logs命令访问日志。现在,我正在构建的Apache导出器与我的应用程序容器托管在同一个POD中。现在我的问题是如何让应用程序日志(access.log)显示在apache exporter容器中/可供其访问,这样我就可以分析逻辑并得出2xx、3xx、4xx和5xx的数量等指标。

使用日志聚合工具,例如loki,它与kubernetes和grafana很好地集成,然后,您可以在grafana仪表板中执行所有这些分析,并在那里创建报警

使用日志聚合工具,例如loki,它与kubernetes和grafana很好地集成,然后,您可以在grafana仪表板中执行所有这些解析,并在那里创建报警

Kubernetes将容器的标准输出分别存储在每个节点的
/var/logs/containers
/var/logs/pods
格式的
POD\u NAMESPACE\u container\u CONTAINERID.log
NAMESPACE\u POD\u CONTAINERID/container/*.log
。一旦pod从节点中退出,这些文件将被删除

您可以将其中任何一个装入导出器吊舱以读取日志。问题是,

  • CONTAINER ID
    在Kubernetes中不能作为ENV使用。我们无法生成文件名并准确装入所需的文件。我们必须装载整个
    /var/log/containers/
    /var/log/pods
    目录
  • 在Kubernetes中,装载可写的
    主机路径
    非常容易受到攻击。因此,请确保将其设置为
    readOnly
    文件系统或配置
    PodSecurityPolicy
亚马尔

日志


Kubernetes在每个节点的
/var/logs/containers
/var/logs/pods
中分别以
POD\u NAMESPACE\u container\u CONTAINERID.log
NAMESPACE\u POD\u CONTAINERID/container/*.log
的格式存储容器的stdout。一旦pod从节点中退出,这些文件将被删除

您可以将其中任何一个装入导出器吊舱以读取日志。问题是,

  • CONTAINER ID
    在Kubernetes中不能作为ENV使用。我们无法生成文件名并准确装入所需的文件。我们必须装载整个
    /var/log/containers/
    /var/log/pods
    目录
  • 在Kubernetes中,装载可写的
    主机路径
    非常容易受到攻击。因此,请确保将其设置为
    readOnly
    文件系统或配置
    PodSecurityPolicy
亚马尔

日志


您可以尝试将Apache配置为登录到文件,而不是登录到标准输出。我建议将它们存储在一个卷中,并将该卷装入两个容器中。我认为容器化标准是将日志推送到标准输出,而不是存储在POD中。我们还将原木推送至Splunk/ELK。另外,如果我们将日志存储在POD中,并且存储在一些卷中,那么我们如何将这些日志推送到Splunk?我们在所有工作节点中也安装了Splunk转发器,将日志推送到Splunk。由于上述原因,我们不能将日志存储在POD中&我们不能将日志装入可以共享到两个容器的卷中。您可以尝试将Apache配置为登录到文件,而不是登录到STDOUT。我建议将它们存储在卷中,并将卷装入两个容器中。我认为容器化标准是推送日志将其取出,而不是储存在吊舱中。我们还将原木推送至Splunk/ELK。另外,如果我们将日志存储在POD中,并且存储在一些卷中,那么我们如何将这些日志推送到Splunk?我们在所有工作节点中也安装了Splunk转发器,将日志推送到Splunk。由于上述原因,我们不能将日志存储在POD中&我们不能将日志装入可以共享到两个容器的卷中。嘿,我可以使用ls/var/log命令列出容器中的文件,但我无法使用cat命令查看内容。它没有给出这样的文件或目录。可能是什么问题?解决了上述问题。。您还需要挂载/var/lib/docker/containershey。我可以使用ls/var/log命令列出容器中的文件,但我无法使用cat命令查看内容。它没有给出这样的文件或目录。可能是什么问题?解决了上述问题。。您还需要装载/var/lib/docker/containers
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: nginx
  name: nginx
spec:
  containers:
  - image: nginx
    name: nginx
    resources: {}
  - image: busybox
    name: exporter
    command: ["cat"]
    tty: true
    volumeMounts:
    - mountPath: /var/log/
      name: logs
      readOnly: true
  volumes:
  - name: logs
    hostPath:
      path: /var/log/containers/
      # path: /var/log/pods/
      type: Directory
  dnsPolicy: ClusterFirst
  restartPolicy: Never
status: {}
$ kubectl exec -it nginx -n dev -c exporter sh -- ls /var/log | grep nginx
nginx_dev_exporter-41a2a80de1b899d1ee848378d2bf31285658bf86700671e560588ac69b2717b4.log
nginx_dev_nginx-e4c12df0c9dae129ed113f4195d750b447a570a686e3b5608e1af37ced788549.log