三十二、K8S容器日志收集-EFK

发布于:2025-03-04 ⋅ 阅读:(12) ⋅ 点赞:(0)

K8S容器日志收集-EFK

一、概要

在这里插入图片描述

在这里插入图片描述

传统架构ELK

Elasticsearch+ Logstash+Kibanna

新架构EFK技术栈

Elasticsearch+Fleentd+Kibana

Logstash,使用java开发,启动就占用资源,另外语法比较复杂

在这里插入图片描述

在这里插入图片描述

Filebeat也一个直接输入到Elasticsearch,但是需要注意版本,有可能不兼容,所有不推荐。

logstash,只做日志数据的解析,不做采集工作,所以占用资源少。


二、EFK 收集控制台日志

1. 部署Elasticsearch+Fluentd+Kibana

node节点内存要大于4G

下载需要的部署文件:

# git clone https://github.com/dotbalo/k8s.git
# cd k8s/efk-7.10.2/

创建 EFK 所用的命名空间:

[root@k8s-master01 efk-7.10.2]#kubectl create -f create-logging-namespace.yaml
namespace/logging created

创建 Elasticsearch 集群(企业内已有 ELK 平台可以不创建):

[root@k8s-master01 efk-7.10.2]#kubectl create -f es-service.yaml
service/elasticsearch-logging created

[root@k8s-master01 efk-7.10.2]#kubectl create -f es-statefulset.yaml
serviceaccount/elasticsearch-logging created
clusterrole.rbac.authorization.k8s.io/elasticsearch-logging created
clusterrolebinding.rbac.authorization.k8s.io/elasticsearch-logging created
statefulset.apps/elasticsearch-logging created

创建 Kibana(企业内已有 ELK 平台可以不创建):

[root@k8s-master01 efk-7.10.2]#kubectl create -f kibana-deployment.yaml -f kibana-service.yaml
deployment.apps/kibana-logging created
service/kibana-logging created

由于在 Kubernetes 集群中,我们可能并不需要对所有的机器都采集日志,所以可以更改

Fluentd 的部署文件如下,添加一个 NodeSelector,只部署至需要采集的主机即可:

[root@k8s-master01 efk-7.10.2]#grep "nodeSelector" fluentd-es-ds.yaml -A 3
      nodeSelector:
        fluentd: "true"
      volumes:
      - name: varlog
# 不想用,也可以已注销掉。

之后给需要采集日志的节点打上一个标签,以 k8s-node01 为例:

[root@k8s-master01 efk-7.10.2]#kubectl label node k8s-node01 fluentd=true
node/k8s-node01 labeled

[root@k8s-master01 efk-7.10.2]#kubectl get node -l fluentd=true --show-labels
NAME         STATUS   ROLES    AGE    VERSION   LABELS
k8s-node01   Ready    <none>   252d   v1.28.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,fluentd=true,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node01,kubernetes.io/os=linux,node.kubernetes.io/node=,region=chaoyang
[root@k8s-master01 efk-7.10.2]#

创建 Fluentd:

[root@k8s-master01 efk-7.10.2]#kubectl create -f fluentd-es-ds.yaml -f fluentd-es-configmap.yaml
serviceaccount/fluentd-es created
clusterrole.rbac.authorization.k8s.io/fluentd-es created
clusterrolebinding.rbac.authorization.k8s.io/fluentd-es created
daemonset.apps/fluentd-es-v3.1.1 created
configmap/fluentd-es-config-v0.2.1 created

Fluentd 的 ConfigMap 有个字段需要注意,在 fluentd-es-configmap.yaml 最后有一个

output.conf:

[root@k8s-master01 efk-7.10.2]#vim fluentd-es-configmap.yaml
......
  output.conf: |-
    <match **>
      @id elasticsearch
      @type elasticsearch
      @log_level info
      type_name _doc
      include_tag_key true
      host elasticsearch-logging
      port 9200
      logstash_format true

2. Kibana 使用

确认创建的 Pod 都已经成功启动:

[root@k8s-master01 efk-7.10.2]#kubectl get po -n logging
NAME                              READY   STATUS    RESTARTS   AGE
elasticsearch-logging-0           1/1     Running   0          12m
fluentd-es-v3.1.1-4bv7p           1/1     Running   0          2m50s
kibana-logging-5d7b68499c-v7c2t   1/1     Running   0          8m39s

接下来查看 Kibana 暴露的端口号,访问 Kibana:

[root@k8s-master01 efk-7.10.2]#kubectl get svc -n logging
NAME                    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)             AGE
elasticsearch-logging   ClusterIP   None            <none>        9200/TCP,9300/TCP   13m
kibana-logging          NodePort    10.96.144.216   <none>        5601:32297/TCP      9m1s

使用任意一个部署了 kube-proxy 服务的节点的 IP+32297 端口即可访问 Kibana:

地址:http://10.1.3.31:32297/kibana

点击 Explore on my own,之后再点击 Visualize

在这里插入图片描述
在这里插入图片描述

之后点击 Add your data → Create index pattern:

在这里插入图片描述

在这里插入图片描述

在 Index pattern name 输入索引名 logstash*,然后点击 Next Step:

在这里插入图片描述

再次选择 timestamp,即可创建索引:

在这里插入图片描述

之后点击菜单栏→Discover 即可看到相关日志:

在这里插入图片描述

在这里插入图片描述

核对日志:

[root@k8s-master01 efk-7.10.2]#kubectl get po -n kube-system -owide | grep node01
calico-node-lpwdc                          1/1     Running   2 (146d ago)   251d   10.1.3.34        k8s-node01     <none>           <none>
[root@k8s-master01 efk-7.10.2]#kubectl logs calico-node-lpwdc -n kube-system --tail 5

详细用法需要练习,比如已命名空间查询等。


三、使用 Filebeat 收集自定义文件日志

1. 创建 Kafka 和 Logstash

首先需要部署 Kafka 和 Logstash 至 Kubernetes 集群,如果企业内已经有比较成熟的技术栈,

可以无需部署,直接将 Filebeat 的输出指向外部 Kafka 集群即可: