MiniKube EFK日志监控平台
参考MiniKube安装准备环境。
EFK日志监控平台部署架构
EFK,集中式的日志监控平台。Elasticsearch, Fluentd, Kibana三个组件的首字母构成它的名字。
- Elasticsearch,分布式的搜索引擎系统,简称ES。可以用于日志数据的集中存储和检索。
- Fluentd,日志采集组件,可以实现日志数据的采集,装饰,转换和传输等功能。
- Kibana,是基于ES的日志查询展示界面,也可以做基于ES的性能分析,或者大数据分析和展示。
如果要对K8S的Pod,容器采集日志,那么我们需要在K8S集群的每个节点上都部署一个fluentd的pod。发布形式为DaemonSet。
fluentd负责采集节点上所有容器产生的日志。具体要采集哪个日志,可以通过fluentd的配置文件进行配置。
fluentd采集好日志后,会定期传到elasticsearch集群的端点,elasticsearch会将日志集中存储并且根据配置建立反向索引。
然后开发,运维人员可以通过Kibana界面,集中的查询和分析日志。
如果要对fluentd的监控日志目标进行配置,可以通过configmap这种方式来实现,运维人员可以通过configmap可以定制fluentd的日志采集配置文件,然后发布到K8S环境。
fluentd的Pod可以通过持久卷的形式挂载configmap中的配置文件。就是说,可以通过configmap,运维人员可以动态发布和更新fluentd的配置文件。这种更新可以实时生效。需要重启fluentd的Pod。
实际企业生产环境,kibana和elasticsearch不会部署在K8S当中。另外,在实际生产环境中,企业级日志分析平台EFK架构中,在fluentd与elasticsearch之间,还有一套kafka队列来做缓冲,在数据量大的时候,可以解决ES性能跟不上的问题。ES建反向索引是比较耗资源的,而且比较慢,数据量大的时候,ES可能会跟不上。有了kafka缓冲之后,后台ES,Kibana升级维护就会比较容易。
DaemonSet - Fluentd
DaemonSet是与ReplicaSet对应的概念。不同之处是daemonSet会在K8S所有节点上,都部署一个pod。
K8S DaemonSet机制会保证,每个节点上都有一个pod可用。如果一个Pod挂了,daemonSet会自动重启。
EFK安装
MiniKube本身是有EFK Addon的。但是本实验打算有发布文件的形式搞一搞。
可以用以下命令查看:
minikube addons list
[ryan@lab3 ~]$ minikube addons list
|-----------------------------|----------|--------------|
| ADDON NAME | PROFILE | STATUS |
|-----------------------------|----------|--------------|
| ambassador | minikube | disabled |
| csi-hostpath-driver | minikube | disabled |
| dashboard | minikube | enabled ? |
| default-storageclass | minikube | enabled ? |
| efk | minikube | disabled |
| freshpod | minikube | disabled |
| gcp-auth | minikube | disabled |
YAML 文件准备
- ns.yml 创建一个新的namespace,名字叫logging。ES,Kibana会发布到logging namespace当中。
- elastic.yml
- kibana.yml
- fluentd-rbac.yml, role based access control, 让fluentd有权限访问K8S的资源或者操作,获得容器的日志。
- fluentd-daemonset.yml
文件:ns.yml
apiVersion: v1
kind: Namespace
metadata:
name: logging
文件:elastic.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: elasticsearch
namespace: logging
spec:
selector:
matchLabels:
component: elasticsearch
template:
metadata:
labels:
component: elasticsearch
spec:
containers:
- name: elasticsearch
image: docker.elastic.co/elasticsearch/elasticsearch