如何配置 DaemonSet Fluentd 以从自定义日志文件和控制台读取
How to configure DaemonSet Fluentd to read from custom log file and console
我正在尝试在本地 minikube 设置中配置 EFK 堆栈。我已关注 this tutorial.
一切正常(我可以在 kibana 和 Elasticsearch 中看到我所有的控制台日志)。但我还有一个要求。我有 Node.js 应用程序,它作为文件记录到 pod 内的自定义路径 /var/log/services/dev
。
文件树:
/var/log/services/dev/# ls -l
total 36
-rw-r--r-- 1 root root 28196 Nov 27 18:09 carts-service-dev.log.2021-11-27T18.1
-rw-r--r-- 1 root root 4483 Nov 27 18:09 carts-service-dev.log.2021-11-27T18
如何配置我的 Fluentd 以读取我的所有控制台日志以及从配置的自定义路径读取日志?
我的应用部署文件:
apiVersion: apps/v1
kind: Deployment
metadata:
name: carts
spec:
replicas: 1
selector:
matchLabels:
app: carts
template:
metadata:
labels:
app: carts
spec:
containers:
- name: app
image: carts-service
resources:
limits:
memory: "1024Mi"
cpu: "500m"
ports:
- containerPort: 4000
我的 Fluentd DaemonSet 文件:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd
namespace: kube-system
labels:
k8s-app: fluentd-logging
version: v1
spec:
selector:
matchLabels:
k8s-app: fluentd-logging
version: v1
template:
metadata:
labels:
k8s-app: fluentd-logging
version: v1
spec:
terminationGracePeriodSeconds: 30
volumes:
- name: varlog
hostPath:
path: /var/log
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
tolerations:
- key: node-role.kubernetes.io/master
effect: NoSchedule
containers:
- name: fluentd
image: fluent/fluentd-kubernetes-daemonset:v1-debian-elasticsearch
volumeMounts:
- name: varlog
mountPath: /var/log
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
readOnly: true
resources:
limits:
memory: 200Mi
requests:
cpu: 100m
memory: 200Mi
env:
- name: FLUENT_ELASTICSEARCH_HOST
value: "elasticsearch.default"
- name: FLUENT_ELASTICSEARCH_PORT
value: "9200"
我知道如果 pod 崩溃,写入自定义路径 /var/log/services/dev
的日志文件将被删除。所以我必须使用持久卷来挂载这条路径。
但我缺乏如何为该路径创建持久卷以及 link Fluentd 从中读取的经验。
提前致谢。
如果 pod 崩溃,仍然可以在 efk
中访问所有日志。无需将持久卷添加到您的应用程序的 Pod 中,仅用于存储日志文件。
主要问题是如何从此文件中获取日志。有两种主要方法,它们是基于 kubernetes 文档建议的:
使用 sidecar 容器.
pod 中的容器具有相同的文件系统,并且 sidecar
容器会将日志从文件流式传输到 stdout
and/or stderr
(取决于实现)和日志之后将被 kubelet 接收。
请找到 streaming sidecar container 并举例说明它是如何工作的。
使用带有日志代理的边车容器。
请查找 Sidecar container with a logging agent 和使用 fluentd
的配置示例。在这种情况下,日志将由 fluentd
收集并且它们将无法通过 kubectl logs
命令获得,因为 kubelet
不对这些日志负责。
我正在尝试在本地 minikube 设置中配置 EFK 堆栈。我已关注 this tutorial.
一切正常(我可以在 kibana 和 Elasticsearch 中看到我所有的控制台日志)。但我还有一个要求。我有 Node.js 应用程序,它作为文件记录到 pod 内的自定义路径 /var/log/services/dev
。
文件树:
/var/log/services/dev/# ls -l
total 36
-rw-r--r-- 1 root root 28196 Nov 27 18:09 carts-service-dev.log.2021-11-27T18.1
-rw-r--r-- 1 root root 4483 Nov 27 18:09 carts-service-dev.log.2021-11-27T18
如何配置我的 Fluentd 以读取我的所有控制台日志以及从配置的自定义路径读取日志?
我的应用部署文件:
apiVersion: apps/v1
kind: Deployment
metadata:
name: carts
spec:
replicas: 1
selector:
matchLabels:
app: carts
template:
metadata:
labels:
app: carts
spec:
containers:
- name: app
image: carts-service
resources:
limits:
memory: "1024Mi"
cpu: "500m"
ports:
- containerPort: 4000
我的 Fluentd DaemonSet 文件:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd
namespace: kube-system
labels:
k8s-app: fluentd-logging
version: v1
spec:
selector:
matchLabels:
k8s-app: fluentd-logging
version: v1
template:
metadata:
labels:
k8s-app: fluentd-logging
version: v1
spec:
terminationGracePeriodSeconds: 30
volumes:
- name: varlog
hostPath:
path: /var/log
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
tolerations:
- key: node-role.kubernetes.io/master
effect: NoSchedule
containers:
- name: fluentd
image: fluent/fluentd-kubernetes-daemonset:v1-debian-elasticsearch
volumeMounts:
- name: varlog
mountPath: /var/log
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
readOnly: true
resources:
limits:
memory: 200Mi
requests:
cpu: 100m
memory: 200Mi
env:
- name: FLUENT_ELASTICSEARCH_HOST
value: "elasticsearch.default"
- name: FLUENT_ELASTICSEARCH_PORT
value: "9200"
我知道如果 pod 崩溃,写入自定义路径 /var/log/services/dev
的日志文件将被删除。所以我必须使用持久卷来挂载这条路径。
但我缺乏如何为该路径创建持久卷以及 link Fluentd 从中读取的经验。
提前致谢。
如果 pod 崩溃,仍然可以在 efk
中访问所有日志。无需将持久卷添加到您的应用程序的 Pod 中,仅用于存储日志文件。
主要问题是如何从此文件中获取日志。有两种主要方法,它们是基于 kubernetes 文档建议的:
使用 sidecar 容器.
pod 中的容器具有相同的文件系统,并且
sidecar
容器会将日志从文件流式传输到stdout
and/orstderr
(取决于实现)和日志之后将被 kubelet 接收。请找到 streaming sidecar container 并举例说明它是如何工作的。
使用带有日志代理的边车容器。
请查找 Sidecar container with a logging agent 和使用
fluentd
的配置示例。在这种情况下,日志将由fluentd
收集并且它们将无法通过kubectl logs
命令获得,因为kubelet
不对这些日志负责。