解决方案:分布式日志系统 EFK 的应用实践(二)
优采云 发布时间: 2022-12-20 08:25解决方案:分布式日志系统 EFK 的应用实践(二)
之前的评论
在中,我们介绍了分布式日志系统的相关背景。 基于云原生容器的日志采集与传统的日志采集有哪些异同。 接着介绍ELKB分布式日志系统。 本文将继上文章之后,继续介绍如何基于EFK搭建云原生日志平台。
前置条件:数据存储持久化
日志存储涉及持久化相关的问题。 所以数据k8s持久化存储pv和pvc需要在部署前创建。 我们的实践涉及3台主机,信息如下:
角色
知识产权
大师
192.168.11.195
节点1
192.168.11.196
节点2
192.168.11.197
选择 Node1:192.168.11.196 作为 NFS 服务器。
# 三台都安装 NFS 和 RPCBIND
yum -y install nfs-utils rpcbind
mkdir -pv /ifs/kubernetes
systemctl enable rpcbind
systemctl enable nfs
systemctl start nfs
复制
$ vim /etc/exports
/ifs/kubernetes *(rw,no_root_squash)
复制
exportfs -r
复制
执行以上命令后,在其他机器上测试一下:
mount -t nfs 192.168.11.196:/ifs/kubernetes /mnt/
复制
在NFS服务器(即k8snode1)上新建三个文件夹:
mkdir -pv /ifs/kubernetes/{pv00001,pv00002,pv00003}
复制
采用动态分配pv的方式。
#生产动态存储卷
kubectl apply -f class.yaml
#生成pods
kubectl apply -f deployment.yaml
#赋权
kubectl apply -f rbac.yaml
# 最后自动创建存储卷
kubectl apply -f deployment-pvc.yaml
#验证效果
kubectl get pv,pvc
复制
执行以上命令后,可以查看pv和pvc的信息:
相关配置文件class.yaml、deployment.yaml、rbac.yaml、deployment-pvc.yaml比较简单,这里就不一一列举了。 如有需要,可从公众号后台获取。
安装EFK
根据上面创建的pv storage,我们启动如下服务:
# 启动 es
kubectl apply -f elasticsearch.yaml
# filebeat.yaml
kubectl apply -f filebeat.yaml
# kibana.yaml
kubectl apply -f kibana.yaml
复制
通过以上命令,即可部署三个组件。 下面分别来看一下这三个组件的配置文件。
弹性搜索.yaml
elasticsearch的资源文件如下:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: elasticsearch
namespace: kube-system
labels:
k8s-app: elasticsearch
spec:
serviceName: elasticsearch
selector:
matchLabels:
k8s-app: elasticsearch
template:
metadata:
labels:
k8s-app: elasticsearch
spec:
containers:
- image: elasticsearch:7.3.2
name: elasticsearch
resources:
limits:
cpu: 1
memory: 2Gi
requests:
cpu: 0.5
memory: 500Mi
env:
- name: "discovery.type"
value: "single-node"
- name: ES_JAVA_OPTS
value: "-Xms512m -Xmx2g"
ports:
- containerPort: 9200
name: db
protocol: TCP
volumeMounts:
- name: elasticsearch-data
mountPath: /usr/share/elasticsearch/data
volumeClaimTemplates:
- metadata:
name: elasticsearch-data
spec:
storageClassName: "managed-nfs-storage"
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 20Gi
---
apiVersion: v1
kind: Service
<p>
metadata:
name: elasticsearch
namespace: kube-system
spec:
clusterIP: None
ports:
- port: 9200
protocol: TCP
targetPort: db
selector:
k8s-app: elasticsearch
</p>
复制
指定elasticsearch镜像版本为7.3.2,配置1核2G,挂载managed-nfs-storage存储,Service暴露elasticsearch的db端口。
文件beat.yaml
然后安装filebeat,filebeat轻量级数据采集引擎。 我们这里也是基于k8s平台。 配置文件如下:
---
apiVersion: v1
kind: ConfigMap
metadata:
name: filebeat-config
namespace: kube-system
labels:
k8s-app: filebeat
data:
filebeat.yml: |-
filebeat.config:
inputs:
reload.enabled: false
modules:
path: ${path.config}/modules.d/*.yml
output.elasticsearch:
hosts: ['${ELASTICSEARCH_HOST:elasticsearch}:${ELASTICSEARCH_PORT:9200}']
---
apiVersion: v1
kind: ConfigMap
metadata:
name: filebeat-inputs
namespace: kube-system
labels:
k8s-app: filebeat
data:
kubernetes.yml: |-
- type: docker
containers.ids:
- "*"
processors:
- add_kubernetes_metadata:
in_cluster: true
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: filebeat
namespace: kube-system
labels:
k8s-app: filebeat
spec:
selector:
matchLabels:
k8s-app: filebeat
template:
metadata:
labels:
k8s-app: filebeat
spec:
serviceAccountName: filebeat
terminationGracePeriodSeconds: 30
containers:
- name: filebeat
image: elastic/filebeat:7.3.2
args: [
"-c", "/etc/filebeat.yml",
"-e",
]
env:
- name: ELASTICSEARCH_HOST
value: elasticsearch
- name: ELASTICSEARCH_PORT
value: "9200"
securityContext:
runAsUser: 0
# If using Red Hat OpenShift uncomment this:
#privileged: true
resources:
limits:
memory: 200Mi
requests:
cpu: 100m
memory: 100Mi
volumeMounts:
- name: config
mountPath: /etc/filebeat.yml
readOnly: true
subPath: filebeat.yml
- name: inputs
mountPath: /usr/share/filebeat/inputs.d
readOnly: true
- name: data
mountPath: /usr/share/filebeat/data
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
readOnly: true
volumes:
- name: config
configMap:
defaultMode: 0600
name: filebeat-config
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
- name: inputs
configMap:
defaultMode: 0600
name: filebeat-inputs
- name: data
hostPath:
path: /var/lib/filebeat-data
type: DirectoryOrCreate
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
<p>
metadata:
name: filebeat
subjects:
- kind: ServiceAccount
name: filebeat
namespace: kube-system
roleRef:
kind: ClusterRole
name: filebeat
apiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
name: filebeat
labels:
k8s-app: filebeat
rules:
- apiGroups: [""] # "" indicates the core API group
resources:
- namespaces
- pods
verbs:
- get
- watch
- list
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: filebeat
namespace: kube-system
labels:
k8s-app: filebeat
---
</p>
复制
filebeat镜像版本为7.3.2,通过configMap配置采集数据源。 filebeat 基于 Logstash-fowarder 的源代码。 也就是说:Filebeat是Logstash-fowarder的新版本,也将是ELK Stack在shipper端的首选。
kibana.yaml
Kibana用于日志的可视化展示。 它可以搜索和显示存储在 Elasticsearch 中的索引数据。 使用它可以通过图表、表格和地图轻松显示和分析数据。
apiVersion: apps/v1
kind: Deployment
metadata:
name: kibana
namespace: kube-system
labels:
k8s-app: kibana
spec:
replicas: 1
selector:
matchLabels:
k8s-app: kibana
template:
metadata:
labels:
k8s-app: kibana
spec:
containers:
- name: kibana
image: kibana:7.3.2
resources:
limits:
cpu: 1
memory: 500Mi
requests:
cpu: 0.5
memory: 200Mi
env:
- name: ELASTICSEARCH_HOSTS
value: http://elasticsearch-0.elasticsearch.kube-system:9200
- name: I18N_LOCALE
value: zh-CN
ports:
- containerPort: 5601
name: ui
protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
name: kibana
namespace: kube-system
spec:
type: NodePort
ports:
- port: 5601
protocol: TCP
targetPort: ui
nodePort: 30601
selector:
k8s-app: kibana
复制
Kibana 将 nodePort 暴露为 30601,我们是通过这个主机端口访问的。
此时,我们查看pod和svc,发现它们已经处于running状态。 三个组件安装成功。
查询日志结果
通过上面的组件安装,我们可以建立一个索引来查找日志信息。
访问k8s mater对应的主机IP+端口30601,结果如下:
接下来,我们需要建立索引:filebeat-7.3.2-*
创建索引后,您可以在搜索页面搜索相应的关键词。
查看K8S的一些pod、namespace、service日志,如上图,都是采集的。
微服务日志检索
以上就是采集和搜索k8s组件相关的日志,那么如何采集我们的微服务日志呢。 首先,我们部署一个像 webdemo 这样的微服务。
kubectl create deployment webdemo --image=nginx
kubectl expose deployment webdemo --port=80 --target-port=80 --name=webdemo --type=NodePort
复制
执行过程如上图所示。 看看是否创建成功:
为了模拟浏览器的请求做日志,我们需要查看webdemo的端口号:
通过服务配置我们可以知道webdemo的nodeport是32008,通过命令行请求:
curl http://192.168.11.195:32008/
复制
同时打开webdemo的容器服务日志,查看是否产生了相应的日志:
可以看到上面生成了相应的日志,然后就可以去kibana中获取日志了。
成功获取日志。 以上配置说明该方法可以正常获取微服务的日志。
概括
通过两篇文章介绍了云原生日志采集的相关概念和基于EFK组件的实践,从安装到日志检索的过程。
K8s的特点是容器日志输出控制台,Docker本身提供了日志采集能力。 通过k8s搭建elasticsearch+filebeat+kibana的日志平台,成功采集容器、k8s组件、微服务的日志,并通过kibana图形化展示。
整套解决方案:EditorTools(全自动采集器)
全自动采集器(Editortools)中小型网站自动升级利器! 可以帮助用户解决中小型网站和企业网站的自动信息采集操作,更加智能的采集解决方案,保证您的网站内容能够优质及时的更新! EditorTools的出现将为您节省大量时间,让您的站长和管理员从繁琐的网站更新工作中解放出来!
特征
【特点】设定好计划后,24小时自动工作,无需人工干预
[特点] 与网站分离,通过独立制作的界面,可以支持任何网站或数据库
【特点】体积小、功耗低、稳定性好非常适合运行在服务器上
【特点】所有规则均可导入导出,灵活的资源复用
[特点] 使用FTP上传文件,稳定安全
[采集] 可以选择倒序、顺序、随机采集文章
【采集】支持自动列出网址
【采集】支持采集数据分布在多层页面的网站
[采集] 自由设置采集数据项,每个数据项可单独筛选排序
【采集】支持分页内容采集
【采集】支持任意格式和类型的文件(包括图片、视频)下载
[采集] 可以破解防盗链文件
【采集】支持动态文件URL解析
【采集】支持采集需要登录访问的网页
【支持】 可设置关键词采集
[支持] 可设置防止采集的敏感词
【支持】可设置图片水印
【发布】支持发布带回复的文章,可广泛应用于论坛、博客等项目
[Release] 与采集数据分离的发布参数项可以自由对应采集数据或预设值,大大增强发布规则的复用性
【发布】支持随机选择发布账号
【发布】任意发布项支持语言翻译
【发布】支持转码,支持UBB码
[发布]可选择文件上传自动创建年月日目录
【发布】模拟发布支持在无法安装接口的网站上进行发布操作
[支持] 程序可以正常运行
[支持] 防止网络运营商劫持HTTP功能
[支持] 手动采集和发布单个项目
【支持】详细的工作流程监控和信息反馈,让您快速了解工作状态
更新日志
1、新增:数据项的采集模式和常规模式增加了内容来源选项,支持其他数据项作为采集来源。
2.修复:手动采集时多个代理无法正确轮换的问题。