tzghostK零S
目前我们的应用日志是使用ELK管理的,filebeat–>kafka–>logstash–>es–>kibana。filebeat将不同应用的日志输出到kafka,并根据不同topic进行分类,logstash再进行清洗处理。我们的需求是:在KS中的应用,日志也想使用现有的ELK收集管理。这个需求,用什么样的方案比较好呢?
目前我们的应用日志是使用ELK管理的,filebeat–>kafka–>logstash–>es–>kibana。filebeat将不同应用的日志输出到kafka,并根据不同topic进行分类,logstash再进行清洗处理。我们的需求是:在KS中的应用,日志也想使用现有的ELK收集管理。这个需求,用什么样的方案比较好呢?
平台设置 - 日志接收者,将 ES 的地址指向你自己的ES
tzghost 还没看到有人实施过,kubesphere 后续版本会考虑增强这里。但理论上是修改 fluent bit 的 Filter
有一篇以 fluentd 为蓝本的 https://kubesphere.com.cn/forum/d/284 供参考
huanggze 参考相关资料折腾了几天,目前我是以DaemonSet的形式,在业务的namespace下跑了fluentd。通过在平台设置 - 日志接收者配置fluentd的地址端口,将应用日志过滤后输出到ES的。目前我遇到的问题是,在filter中grep过滤单个应用日志是正常的,但过滤多个应用日志时就有问题,麻烦帮忙看看,相关配置如下:
fluentd-es-configmap.yaml
kind: ConfigMap
apiVersion: v1
metadata:
name: fluentd-es-config-v0.2.0
namespace: zzb-test
labels:
addonmanager.kubernetes.io/mode: Reconcile
data:
containers.input.conf: |-
<source>
@id fluentd-containers.log
@type tail
path /var/log/containers/*.log
pos_file /var/log/es-containers.log.pos
tag raw.kubernetes.*
read_from_head true
<parse>
@type multi_format
<pattern>
format json
time_key time
time_format %Y-%m-%dT%H:%M:%S.%NZ
</pattern>
<pattern>
format /^(?<time>.+) (?<stream>stdout|stderr) [^ ]* (?<log>.*)$/
time_format %Y-%m-%dT%H:%M:%S.%N%:z
</pattern>
</parse>
</source>
# Detect exceptions in the log output and forward them as one log entry.
<match raw.kubernetes.**>
@id raw.kubernetes
@type detect_exceptions
remove_tag_prefix raw
message log
stream stream
multiline_flush_interval 5
max_bytes 500000
max_lines 1000
</match>
# Concatenate multi-line logs
<filter **>
@id filter_concat
@type concat
key message
multiline_end_regexp /\n$/
separator ""
</filter>
# Enriches records with Kubernetes metadata
<filter kubernetes.**>
@id filter_kubernetes_metadata
@type kubernetes_metadata
</filter>
# Fixes json fields in Elasticsearch
<filter kubernetes.**>
@id filter_parser
@type parser
key_name log
reserve_data true
remove_key_name_field true
<parse>
@type multi_format
<pattern>
format json
</pattern>
<pattern>
format none
</pattern>
</parse>
</filter>
forward.input.conf: |-
# Takes the messages sent over TCP
<source>
@id forward
@type forward
</source>
<filter **>
@type grep
<regexp>
key $.kubernetes.pod_name
pattern /(^zzbservice)/
</regexp>
</filter>
monitoring.conf: |-
# Prometheus Exporter Plugin
# input plugin that exports metrics
<source>
@id prometheus
@type prometheus
</source>
<source>
@id monitor_agent
@type monitor_agent
</source>
# input plugin that collects metrics from MonitorAgent
<source>
@id prometheus_monitor
@type prometheus_monitor
<labels>
host ${hostname}
</labels>
</source>
# input plugin that collects metrics for output plugin
<source>
@id prometheus_output_monitor
@type prometheus_output_monitor
<labels>
host ${hostname}
</labels>
</source>
# input plugin that collects metrics for in_tail plugin
<source>
@id prometheus_tail_monitor
@type prometheus_tail_monitor
<labels>
host ${hostname}
</labels>
</source>
output.conf: |-
<match **>
@id elasticsearch
@type elasticsearch
@log_level info
type_name _doc
include_tag_key true
host 192.168.0.95
port 9200
logstash_format true
logstash_prefix zzbservice
logstash_dateformat %Y.%m.%d
<buffer>
@type file
path /var/log/fluentd-buffers/kubernetes.system.buffer
flush_mode interval
retry_type exponential_backoff
flush_thread_count 2
flush_interval 5s
retry_forever
retry_max_interval 30
chunk_limit_size 2M
total_limit_size 500M
overflow_action block
</buffer>
</match>
fluentd-es-ds.yaml:
apiVersion: v1
kind: ServiceAccount
metadata:
name: fluentd-es
namespace: zzb-test
labels:
k8s-app: fluentd-es
addonmanager.kubernetes.io/mode: Reconcile
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: fluentd-es
labels:
k8s-app: fluentd-es
addonmanager.kubernetes.io/mode: Reconcile
rules:
- apiGroups:
- ""
resources:
- "namespaces"
- "pods"
verbs:
- "get"
- "watch"
- "list"
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: fluentd-es
labels:
k8s-app: fluentd-es
addonmanager.kubernetes.io/mode: Reconcile
subjects:
- kind: ServiceAccount
name: fluentd-es
namespace: zzb-test
apiGroup: ""
roleRef:
kind: ClusterRole
name: fluentd-es
apiGroup: ""
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd-es-v3.0.0
namespace: zzb-test
labels:
k8s-app: fluentd-es
version: v3.0.0
addonmanager.kubernetes.io/mode: Reconcile
spec:
selector:
matchLabels:
k8s-app: fluentd-es
version: v3.0.0
template:
metadata:
labels:
k8s-app: fluentd-es
version: v3.0.0
# This annotation ensures that fluentd does not get evicted if the node
# supports critical pod annotation based priority scheme.
# Note that this does not guarantee admission on the nodes (#40573).
annotations:
seccomp.security.alpha.kubernetes.io/pod: 'docker/default'
spec:
priorityClassName: k8s-cluster-critical
serviceAccountName: fluentd-es
containers:
- name: fluentd-es
image: registry.cn-hangzhou.aliyuncs.com/google_containers/fluentd-elasticsearch:v2.4.0
env:
- name: FLUENTD_ARGS
value: --no-supervisor -q
resources:
limits:
memory: 500Mi
requests:
cpu: 100m
memory: 200Mi
volumeMounts:
- name: varlog
mountPath: /var/log
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
readOnly: true
- name: config-volume
mountPath: /etc/fluent/config.d
ports:
- containerPort: 24231
name: prometheus
protocol: TCP
livenessProbe:
tcpSocket:
port: prometheus
initialDelaySeconds: 5
timeoutSeconds: 10
readinessProbe:
tcpSocket:
port: prometheus
initialDelaySeconds: 5
timeoutSeconds: 10
terminationGracePeriodSeconds: 30
volumes:
- name: varlog
hostPath:
path: /var/log
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
- name: config-volume
configMap:
name: fluentd-es-config-v0.2.0
上面是我过滤单个应用日志时的正常配置,我的需求是需要过滤多个应用日志,比如有两个业务应用a 和 b,都在同一个namespace,过滤后日志分别输出到ES的不同索引中,要怎么做呢?
fluentd 的具体使用估计得在 fluentd 社区问下。
你说的需求建议,社区正在评估,最终以什么方式呈现可以在 https://github.com/kubesphere/community 讨论。我们目前还没有实践和尝试,所以只能提供一个前面给出的 basic idea 给你了