三十二、K8S容器日志收集-EFK
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 集群即可: