[单master节点k8s部署]22.构建EFK日志收集平台(一)
数据收集传输
FileBeat
fileBeat是一个轻量级的日志采集的工具,占用资源极少,可靠性高。虽然具备一定的过滤能力,但是能力有限,所以需要搭配其他的工具进行数据传输和分析。
Fluentd
Fluentd是一个用于日志收集、传输和聚合的工具根据,而且在传输过程中,Fluentd能对日志进行格式化、解析和过滤,他的优势是尽可能的用JSON作为日志输出,所以传输工具以及下游的传输线不需要猜测字符串里面的各个字段的类型。
Fluentd的灵活性并不好,资源消耗也不小,在一些小的嵌入式设备上可以安装Fluent Bit。
Fluentd | FileBeat |
日志收集、处理和传输框架 | 日志收集和传输 |
基于插件的架构,支持多种输入、过滤和输出插件 | 轻量级,专注于日志收集和传输 |
支持复杂的日志处理、过滤、解析和格式化 | 处理能力有限 |
插件生态丰富 | 插件较少,主要依赖于Elasticsearch |
由于支持插件和处理功能,所以资源占用较高 | 资源占用较少 |
适合复杂的日志管道和需要进行实时处理的场景 | 适合轻量日志收集 |
是CNCF的项目,集成了很多云原生工具 | 是Elastic Stack的一部分,与elasticsearch、kibana集成 |
Logagent
是一个性能介于FLuentd和FileBeat之间的一个日志收集工具,适合容器和服务器环境,插件有限,与Sematext平台深度集成。
Logstash
数据收集与数据解析过滤,通过强大的额过滤插件,用户可以对原始数据进行结构化处理,例如提取字段、格式化时间戳、删除或添加字段。它适合处理大量数据的场景。Logstash与Elasticsearch紧密结合,适合ELK Stack。
它的致命缺点是性能以及资源消耗,尽管性能在近几年已经提升很多,但是比其他替代者还是慢很多,它的优势是使用Grok工具将非结构化数据解析为结构化和可查的结构数据。另一个痛点是 不支持缓存,有可能造成数据丢失,因此替代方案是将Redis或Kafka作为中心缓冲池。
数据分析
ElasticSearch
免费的分布式开源搜索和分析引擎,是Elastic Stack中的核心组件。
Beats工具:
fileBeat:日志文件收集
packetBeat: 网络数据收集
MetricBeat: 指标收集
WinlogBeat: windows事件收集
AuditBeat: 审计数据收集
HeartBeat: 运行时间监控
搭建
-
创建命名空间:
创建一个叫kube-logging的命名空间
-
创建headless-service:
headless service不会像普通service一样进行负载均衡,而是直接将pod的IP地址暴露给dns。假设我们有三个后端的pod(防止裂脑问题),有一个名为elasticsearch的Headless Service,那么DNS表为:
elasticsearch.default.svc.cluster.local -> es-node-0.default.svc.cluster.local
-> es-node-1.default.svc.cluster.local
-> es-node-2.default.svc.cluster.local
这个可以方便我们创建statefulset的一个elasticsearch的服务。
我们通过如下的yaml文件创建一个headless service,则我们有了一个域名:elastic31.kube-logging31.svc.cluster.local
kind: Service
apiVersion: v1
metadata:
name: elasticsearch31
namespace: kube-logging31
labels:
app: elasticsearch
spec:
selector:
app: elasticsearch
clusterIP: None
ports:
- port: 9200
name: rest
- port: 9300
name: inter-node
-
创建nfs空间:
在master节点创建一个目录。
mkdir /data/v1 -p
[root@xomaster ~]# vim /etc/exports
/data/v1 192.168.244.128/24(rw,no_root_squash) #加载配置,使配置生效
[root@master ~]# exportfs -arv
[root@master ~]# systemctl restart nfs
-
创建nfs作为存储供应商
首先进行serviceaccount创建和rbac授权:
apiVersion: v1
kind: ServiceAccount
metadata:
name: nfs-provisioner31
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: nfs-provisioner-runner31
rules:
- apiGroups: [""]
resources: ["persistentvolumes"]
verbs: ["get", "list", "watch", "create", "delete"]
- apiGroups: [""]
resources: ["persistentvolumeclaims"]
verbs: ["get", "list", "watch", "update"]
- apiGroups: ["storage.k8s.io"]
resources: ["storageclasses"]
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources: ["events"]
verbs: ["create", "update", "patch"]
- apiGroups: [""]
resources: ["services", "endpoints"]
verbs: ["get"]
- apiGroups: ["extensions"]
resources: ["podsecuritypolicies"]
resourceNames: ["nfs-provisioner31"]
verbs: ["use"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: run-nfs-provisioner31
subjects:
- kind: ServiceAccount
name: nfs-provisioner31
namespace: default
roleRef:
kind: ClusterRole
name: nfs-provisioner-runner31
apiGroup: rbac.authorization.k8s.io
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: leader-locking-nfs-provisioner
rules:
- apiGroups: [""]
resources: ["endpoints"]
verbs: ["get", "list", "watch", "create", "update", "patch"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: leader-locking-nfs-provisioner31
subjects:
- kind: ServiceAccount
name: nfs-provisioner31
namespace: default
roleRef:
kind: Role
name: leader-locking-nfs-provisioner31
apiGroup: rbac.authorization.k8s.io
修改/etc/kubernetes/manifests/kube-apiserver.yaml的内容,添加
- --feature-gates=RemoveSelfLink=false 。
可以看到在修改之前,提供api服务的pod名叫api-server-master,当修改后,发现多了一个api-server的pod,而且是pending状态,因此删除这个pod。
[root@master 31efk]# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-677cd97c8d-bqrpr 1/1 Running 0 65d
calico-node-27c2l 1/1 Running 176 (7h9m ago) 65d
calico-node-55kpl 1/1 Running 185 (7h10m ago) 65d
calico-node-flv9r 1/1 Running 178 (7h9m ago) 65d
coredns-6d8c4cb4d-c7qcr 1/1 Running 0 65d
coredns-6d8c4cb4d-vc77w 1/1 Running 0 65d
deamonset26-9psp2 1/1 Running 0 53d
deamonset26-c967m 1/1 Running 0 53d
deamonset26-pq6ns 1/1 Running 0 53d
etcd-master 1/1 Running 0 65d
kube-apiserver-master 1/1 Running 1 (58d ago) 65d
kube-controller-manager-master 1/1 Running 10 (5d14h ago) 65d
kube-proxy-2v8x6 1/1 Running 0 51d
kube-proxy-45db5 1/1 Running 0 51d
kube-proxy-8q8rq 1/1 Running 0 51d
kube-scheduler-master 1/1 Running 3 (5d14h ago) 51d
kube-state-metrics-57794dcf65-wcjkx 1/1 Running 0 52d
monitoring-grafana-7948df75d9-jrj45 1/1 Running 0 52d
[root@master 31efk]# vim /etc/kubernetes/manifests/kube-apiserver.yaml
[root@master 31efk]# vim /etc/kubernetes/manifests/kube-apiserver.yaml
[root@master 31efk]# kubectl apply -f /etc/kubernetes/manifests/kube-apiserver.yaml
pod/kube-apiserver created
[root@master 31efk]# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-677cd97c8d-bqrpr 1/1 Running 0 65d
calico-node-27c2l 1/1 Running 176 (7h16m ago) 65d
calico-node-55kpl 1/1 Running 185 (7h17m ago) 65d
calico-node-flv9r 1/1 Running 178 (7h16m ago) 65d
coredns-6d8c4cb4d-c7qcr 1/1 Running 0 65d
coredns-6d8c4cb4d-vc77w 1/1 Running 0 65d
deamonset26-9psp2 1/1 Running 0 53d
deamonset26-c967m 1/1 Running 0 53d
deamonset26-pq6ns 1/1 Running 0 53d
etcd-master 1/1 Running 0 65d
kube-apiserver 0/1 Pending 0 26s
kube-apiserver-master 1/1 Running 1 (53s ago) 30s
kube-controller-manager-master 1/1 Running 11 (113s ago) 65d
kube-proxy-2v8x6 1/1 Running 0 51d
kube-proxy-45db5 1/1 Running 0 51d
kube-proxy-8q8rq 1/1 Running 0 51d
kube-scheduler-master 1/1 Running 4 (113s ago) 51d
kube-state-metrics-57794dcf65-wcjkx 1/1 Running 0 52d
monitoring-grafana-7948df75d9-jrj45 1/1 Running 0 52d
-
安装nfs服务:
解压nfs镜像,并且进行deployment配置
kind: Deployment
apiVersion: apps/v1
metadata:
name: nfs-provisioner31
spec:
selector:
matchLabels:
app: nfs-provisioner31
replicas: 1
strategy:
type: Recreate
template:
metadata:
labels:
app: nfs-provisioner31
spec:
serviceAccount: nfs-provisioner31
volumes:
- name: nfs-client-root
nfs:
server: 192.168.244.128
path: /data/v1
containers:
- name: nfs-provisioner
image: registry.cn-hangzhou.aliyuncs.com/open-ali/xianchao/nfs-client-provisioner:v1
imagePullPolicy: IfNotPresent
volumeMounts:
- name: nfs-client-root
mountPath: /persistentvolumes
env:
- name: PROVISIONER_NAME
value: example.com/nfs
- name: NFS_SERVER
value: 92.168.244.128
- name: NFS_PATH
value: /data/v1
成功创建了nfs服务:
[root@master 31efk]# kubectl get pods | grep nfs
nfs-provisioner31-648f6c98ff-4qfs8 1/1 Running 0 9m27s
nfs-provisioner31-648f6c98ff-hcx6k 1/1 Running 0 9m27s
-
创建storageClass
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: do-block-storage
provisioner: example.com/nfs