解决方案:分布式日志系统 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: [&#x27;${ELASTICSEARCH_HOST:elasticsearch}:${ELASTICSEARCH_PORT:9200}&#x27;]

---

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.修复:手动采集时多个代理无法正确轮换的问题。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线