EFK日志收集系统+Rancher安装
前言
日志采集
Fluentd
Fluentd是一个开源数据收集、处理、转发系统。通过在kubernetes集群节点上安装Fluentd,来获取容器日志文件、过滤和转换日志数据,然后将数据传送到Elasticsearch集群,在该集群中进行索引和存储。
Filebeat
常用于采集、处理日志。是用于转发和收集日志数据的轻量级传送工具。
Filebeat监视指定的日志文件或位置,收集日志事件,并将它们转发到Elasticsearch或Logstash中。
优点是它只是一个二进制文件,占用资源非常少。缺点是没有复杂的数据解析处理能力。
beats包含六种工具
- Packetbeat:网络数据(收集网络流量数据)
- Metricbeat: 指标(收集系统、进程和文件系统级别的CPU和内存使用情况等数据)
- Filebeat:日志文件(收集文件数据)
- Winlogbeat: windows事件日志(收集Windows事件日志数据)
- Auditbeat:审计数据(收集审计日志)
- Heartbeat: 运行时间监控(收集系统运行时的数据)
Logstash
支持动态的从各种数据源收集数据,并对数据进行实时解析、转换、过滤、分析、统一格式、聚合等操作。具有实时管道功能。
缺点是最少占用2G内存、不支持缓存;优点是可以将日志转为任意格式、灵活且插件多、文档丰富,几乎可以解决任何问题。
日志缓冲/消峰
常用于解决日志阻塞、延迟、不实时等问题。
TB/天,级别的日志需要衡量做日志缓冲处理。
Kafka
Redis
Elasticsearch
Elasticsearch是一个实时的、分布式的、可扩展的日志存储和搜索引擎。支持进行全文本和结构化搜索以及对日志进行分析。
它通常用于索引和搜索大量日志数据,也可以用于搜索许多不同种类的文档。
具有分布式、零配置、自动发现、索引自动分片、索引副本机制、restful风格接口、多数据源、自动搜索负载等特点。
kibana
将Elasticsearch采集到的数据通过dashborad(仪表盘)可视化展示出来。kibana允许你通过web页面浏览Elasticsearch日志数据,也可以自定义查询条件快速检索出Elasticsearch中的日志数据。
部署EFK
安装Elasticsearch
cat kube-logging.yaml
apiVersion: v1
kind: Namespace
metadata:
name: kube-logging
kubectl apply -f kube-logging.yaml
kubectl get ns | grep kube-logging
cat elasticsearch_svc.yaml
apiVersion: v1
kind: Service
metadata:
name: elasticsearch
namespace: kube-logging
labels:
app: elasticsearch
spec:
selector:
app: elasticsearch
clusterIP: None
ports:
- port: 9200
name: rest
- port: 9300
name: inter-node
kubectl get svc -n kube-logging | grep elastic
elasticsearch ClusterIP None <none> 9200/TCP,9300/TCP 24s
部署三个节点的Elasticsearch集群,其目的是避免高可用中的多节点集群发生的脑裂问题。https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-node.html#split-brain
yum install nfs-utils -y
systemctl start nfs && systemctl enable nfs.service
mkdir -p /data/v1
cat /etc/exports
/data/v1 192.168.40.0/24(rw,no_root_squash)
exportfs -arv
systemctl restart nfs
cat serviceaccount.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: nfs-provisioner
kubectl apply -f serviceaccount.yaml
cat rbac.yaml
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: nfs-provisioner-runner
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-provisioner"]
verbs: ["use"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: run-nfs-provisioner
subjects:
- kind: ServiceAccount
name: nfs-provisioner
namespace: default
roleRef:
kind: ClusterRole
name: nfs-provisioner-runner
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-provisioner
subjects:
- kind: ServiceAccount
name: nfs-provisioner
namespace: default
roleRef:
kind: Role
name: leader-locking-nfs-provisioner
apiGroup: rbac.authorization.k8s.io
kubectl apply -f rbac.yaml
# 增加一条:--feature-gates=RemoveSelfLink=false
vim /etc/kubernetes/manifests/kube-apiserver.yaml
- kube-apiserver
- --feature-gates=RemoveSelfLink=false
# 注:下述修改过程会导致6443端口短暂的无法被访问,对于k8s的高可用集群,请一台一台的修改,apply后手动把对应的pod删除。对应单台k8s,请耐心等待。
kubectl apply -f /etc/kubernetes/manifests/kube-apiserver.yaml
# 注上述命令在k8s v1.25版本不能使用了,会导致apiServer容器启动失败,因为默认已经把RemoveSelfLink锁定为为true了。
ctr -n=k8s.io images import elasticsearch_7_2_0.tar.gz
ctr -n=k8s.io images import busybox.tar.gz
wget https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner/releases/download/nfs-subdir-external-provisioner-4.0.16/nfs-subdir-external-provisioner-4.0.16.tgz
tar -xvf nfs-subdir-external-provisioner-4.0.16.tgz
tar -xvf helm-v3.8.1-linux-amd64.tar.gz && mv linux-amd64/helm /usr/local/bin/helm && helm help
cd nfs-subdir-external-provisioner
vim values.yaml
image:
repository: registry.cn-hangzhou.aliyuncs.com/k8s-image-mirrors/nfs-subdir-external-provisioner
nfs:
server: 192.168.40.180
path: /data/v1
provisionerName: example.com/nfs
name: do-block-storage
kubectl create ns nfs
helm install nfs-subdir-external-provisioner . -n nfs
kubectl get sc
kubectl apply -f elasticsearch-statefulset.yaml
kubectl get pods -n kube-logging
kubectl port-forward es-cluster-0 9200:9200 --namespace=kube-logging
curl http://localhost:9200/_cluster/state?pretty
kubectl get pvc -n kube-logging
ctr -n=k8s.io images import kibana_7_2_0.tar.gz
kubectl apply -f kibana.yaml
kubectl get pods -n kube-logging
kubectl get svc -n kube-logging
kubectl edit svc kibana -n kube-logging
type: NodePort
浏览器打开网址:http://192.168.40.183:30147/app/kibana#/home?_g=()
使用deamonset的方式运行Fluentd容器。Fluentd可以tail、过滤和把日志转换成指定格式发送到Elasticsearch集群。
除了容器日志,Fluentd也可以采集kubelet、kube-proxy、docker日志。
ctr -n=k8s.io images import fluentd.tar.gz
kubectl apply -f fluentd.yaml
kubectl get pods -n kube-logging
kibana查询语言官方地址:https://www.elastic.co/guide/en/kibana/7.2/kuery-query.html
部署Rancher
官方网址:https://ranchermanager.docs.rancher.com/zh/getting-started/overview
k8s版本与Rancher版本版本矩阵:https://www.suse.com/suse-rancher/support-matrix/all-supported-versions/rancher-v2-7-3/
# 在安装有docker服务的服务器上导入Rancher server 服务镜像
docker pull rancher/rancher:v2.7.3
ocker run -d --restart=unless-stopped \
-p 80:80 -p 443:443 \
--privileged \
rancher/rancher:v2.7.3
# 使用浏览器打开网址:https://192.168.40.183/dashboard/
docker ps -a
docker logs 41da18323f94 2>&1 | grep "Bootstrap Password:"
# 在k8s集群的node节点导入Rancher-agent镜像
docker pull rancher/rancher-agent:v2.7.3
docker pull rancher/shell:v0.1.19
docker save -o rancher-agent-v2.7.3.tar.gz docker.io/rancher/rancher-agent:v2.7.3
ctr -n k8s.io images import rancher-agent-v2.7.3.tar.gz
curl --insecure -sfL https://192.168.40.183/v3/import/dhfwk4bs6g4c8tmf5f4lcn25h2gt4crmqctdq7wt65w2qztnjgnvds_c-m-7w96p4r9.yaml | kubectl apply -f -
kubectl get pods -n cattle-system