安装fluentd:首先需要安装fluentd,可以参考官方文档进行安装。在k8s集群中,我们可以使用DaemonSet将fluentd部署到所有节点上。
配置fluentd:在安装完成后,需要配置fluentd来收集k8s集群的日志。下面是一个示例配置文件:
<source>
@type tail
path /var/log/containers/*.log
pos_file /var/log/fluentd-containers.log.pos
tag kubernetes.*
read_from_head true
<parse>
@type json
time_format %Y-%m-%dT%H:%M:%S.%NZ
keep_time_key true
time_key timestamp
</parse>
</source>
<match kubernetes.**>
@type copy
<store>
@type file
path /var/log/kubernetes.log.${tag_parts[1]}
flush_interval 5s
</store>
<store>
@type elasticsearch_dynamic_index
host elasticsearch.domain.com # Elasticsearch的地址和端口号
port 9200 # Elasticsearch的端口号,默认为9200
scheme https # 如果Elasticsearch启用了https,则需要设置此项
user elastic # Elasticsearch用户名
password changeme # Elasticsearch密码
logstash_prefix ${tag_parts[1]}-kubernetes-
logstash_dateformat %Y.%m.%d # 索引格式为logstash-{index}-YYYY.MM.DD
include_tag_key true # 是否包含标签键
</store>
</match>
以上配置文件中:
- 使用tail插件从容器日志文件中读取日志;
- 使用json插件解析日志数据,并设置时间格式;
- 将标签为”kubernetes.*“的日志输出到两个地方:一个是本地文件,另一个是Elasticsearch。
在输出到本地文件时,使用了变量${tag_parts[1]}来组成文件名,这个变量表示匹配上的k8s对象名字(如pod、deployment等)。因此,不同的k8s对象的日志会被写入到不同的文件中。
同时,我们也可以使用elasticsearch_dynamic_index插件将k8s集群的日志直接输出到Elasticsearch中。在该插件中,需要指定Elasticsearch的地址和端口号、用户名和密码等信息,并且可以自定义索引名称和日期格式。最后一项include_tag_key用于指定是否包含标签键。
- 部署配置:将上述配置保存为一个fluentd-configmap.yaml文件:
apiVersion: v1
kind: ConfigMap
metadata:
name: fluentd-config
data:
fluent.conf: |
<source>
@type tail
path /var/log/containers/*.log
pos_file /var/log/fluentd-containers.log.pos
tag kubernetes.*
read_from_head true
<parse>
@type json
time_format %Y-%m-%dT%H:%M:%S.%NZ
keep_time_key true
time_key timestamp
</parse>
</source>
<match kubernetes.**>
@type copy
<store>
@type file
path /var/log/kubernetes.log.${tag_parts[1]}
flush_interval 5s
</store>
<store>
@type elasticsearch_dynamic_index
host elasticsearch.domain.com # Elasticsearch的地址和端口号
port 9200 # Elasticsearch的端口号,默认为9200
scheme https # 如果Elasticsearch启用了https,则需要设置此项
user elastic # Elasticsearch用户名
password changeme # Elasticsearch密码
logstash_prefix ${tag_parts[1]}-kubernetes-
logstash_dateformat %Y.%m.%d # 索引格式为logstash-{index}-YYYY.MM.DD
include_tag_key true # 是否包含标签键
</store>
</match>
然后使用kubectl apply命令部署该配置:
$ kubectl apply -f fluentd-configmap.yaml
最后,我们还需要创建一个fluentd DaemonSet来将fluentd部署到所有节点上,并且挂载/var/log目录以便读取容器日志:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd
spec:
selector:
matchLabels:
app: fluentd
template:
metadata:
labels:
app: fluentd
spec:
containers:
- name: fluentd-container
image: quay.io/fluent/fluentd-kubernetes-daemonset:v1.10.2-debian-elasticsearch7-20211025-01
env:
- name: FLUENT_ELASTICSEARCH_HOST
value: "elasticsearch.domain.com" # 替换成你的Elasticsearch地址
- name: FLUENT_ELASTICSEARCH_PORT
value: "9200"
- name: FLUENT_ELASTICSEARCH_SCHEME
value: "https" # 如果Elasticsearch启用了https,则需要设置此项
- name: FLUENT_ELASTICSEARCH_USER
valueFrom:
secretKeyRef:
name: fluentd-es-secret
key: username
- name: FLUENT_ELASTICSEARCH_PASSWORD
valueFrom:
secretKeyRef:
name: fluentd-es-secret
key: password
volumeMounts:
- name: varlog
mountPath: /var/log
volumes:
- name: varlog
hostPath:
path: /var/log
其中,需要替换FLUENT_ELASTICSEARCH_HOST为你的Elasticsearch地址。
- 测试:当fluentd DaemonSet部署完成后,可以使用kubectl logs命令查看容器日志是否被收集到:
$ kubectl logs <fluentd-pod-name>
如果一切正常,则应该看到k8s集群中所有容器的日志。同时,在Elasticsearch中也可以看到相应的索引和数据。