我们计划使用Prometheus实现Kubernetes应用程序监控。我们的应用程序在apache中运行,并部署到kubernetes集群。我们正在开发自定义Apache exporter,它将运行在与我的应用程序容器相同的POD中,并从apache收集指标并将其推送到Prometheus。作为监控的一部分,我们需要在apache中解析access.log,以获得2xx、3xx、4xx和5xx请求的数量。但是我们部署在Kubernetes中的应用程序不会在POD中存储任何日志,但它会将日志记录到STDOUT。所以我可以通过kubectl logs命令访问日志。现在,我正在构建的Apache exporter托管在与我的应用程序容器相同的POD中。现在我的问题是,如何让应用程序日志(access.log)呈现/可供我的apache exporter容器访问,这样我就可以解析逻辑并得出2xx、3xx、4xx和5xx的数量等指标。
发布于 2020-05-25 00:35:45
Kubernetes将容器的STDOUT分别存储在每个节点的/var/logs/containers和/var/logs/pods中,格式分别为POD_NAMESPACE_CONTAINER_CONTAINERID.log和NAMESPACE_POD_CONTAINERID/CONTAINER/*.log。pod从节点逐出后,这些文件将被删除。
您可以将它们中的任何一个挂载到您的导出器pod以读取日志。问题是,
CONTAINER ID在Kubernetes中不能作为ENV使用。我们不能生成文件名并准确地挂载我们想要的文件。我们必须挂载整个/var/log/containers/或/var/log/pods目录。hostPath在Kubernetes中非常容易受到攻击。因此,请确保将其设置为readOnly文件系统或配置PodSecurityPolicy.YAML
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发布于 2020-05-24 04:09:53
使用日志聚合工具,例如loki,它与kubernetes和grafana很好地集成在一起,然后您可以在grafana仪表板中执行所有这些解析,并在那里创建警报
https://stackoverflow.com/questions/61956060
复制相似问题