k8s集群搭建efk集群日志收集系统

我在安装部署efk系统的时候,参考了两篇文章,先贴出来。这两篇文章我都有所参考,然后我结合自己安装部署过程中出现的问题特此整理记录,方便具有同样部署需求的朋友做个参考。
https://mp.weixin.qq.com/s/SoelIGIT5lQSgJlE4MYFjg kubernetes搭建EFK日志管理系统
https://www.jianshu.com/p/d6f2034ba62b K8S部署ELK管理集群日志

此k8s集群中使用efk日志系统,其中涉及的组件分别是flunted,elasticsearch,kibana。
组件角色说明:

  • flunted组件:通过容器日志文件来收集、过滤和转换日志数据,然后将数据传递到 Elasticsearch 集群,核心功能是收集日志数据。
  • elasticsearch组件:对k8s集群中的日志进行索引和存储。
  • kibana组件:一个可视化的数据仪表盘(dashboard),使得开发者和管理人员可以通过访问web界面的形式来查看Elasticsearch中的日志数据,同时它也支持用户自定义查询和过滤条件从而检索出特定的日志数据。
    环境说明:
服务器名称 所属的集群角色
k8s-master 主节点(master节点)
k8s-node1 从节点
k8s-node2 从节点

一、安装部署Elasticsearch集群

1、所有节点执行基本的环境配置

#拉取镜像
docker pull elasticsearch:7.5.0
#由于数据盘挂载到了/data目录上,所以将相关数据文件保存到该目录下  
#注意逐级创建文件夹,目录尽量与此处的一致,这样可以减少一些问题的发生
mkdir /data/es/data  
mkdir /data/es/config 
#开放文件夹权限
chmod 777 /data/es

#调整一个进程可拥有的VMA(虚拟内存区域)的数量,修改配置文件
vim /etc/sysctl.conf
#文件末尾追加内容
vm.max_map_count=262144  
# :wq保存退出配置文件
#启用配置——使配置文件生效
sysctl -p

2、各节点编辑配置文件
k8s-master节点执行以下操作:
编辑修改elasticsearch的配置文件,打开编辑文件vim es.yml

#集群名称
cluster.name: es-cluster
#节点名称
node.name: node-a
#是不是有资格竞选主节点
node.master: true
#是否存储数据
node.data: true
#最大集群节点数
node.max_local_storage_nodes: 10
#网关地址
network.host: 0.0.0.0
network.publish_host: !!!!自己机器上的k8s-master节点内部IP
#端口
http.port: 9200
#内部节点之间沟通端口
transport.tcp.port: 9300
http.cors.enabled: true
http.cors.allow-origin: "*"
#es7.x 之后新增的配置,写入候选主节点的设备地址,在开启服务后可以被选为主节点
discovery.seed_hosts: ["k8s-master节点内部ip","k8s-node1节点内部ip","k8s-node2节点内部ip"]

#es7.x 之后新增的配置,初始化一个新的集群时需要此配置来选举master
cluster.initial_master_nodes: !!!!k8s-master节点内部IP
#数据存储路径  注意依次创建此路径下的文件   当然大家也可以用自己的目录
path.data: /data/share/elasticsearch/data
#日志存储路径
path.logs: /data/share/elasticsearch/data/logs

说明:文件中的path.data以及path.logs字段的值大家可以不和此处该文件的一样,修改为自己设置的数据和日志存储目录即可。需要注意的是,要对这两个文件授予访问权限,使用chmod 777 /data/share/elasticsearch对文件elasticsearch授予访问权限,这样数据存储路径data/share/elasticsearch/data和日志存储路径/data/share/elasticsearch/data/logs均可被此linux服务器上的elasticsearch服务访问。

k8s-node1执行以下操作:
和k8s-master创建的配置文件es.yml文件内容大体类似,只有两个地方需要修改(node.name和network.publish_host字段的值需要修改):

...
#节点名称
node.name: node-b
...
#网关地址
#网关地址
network.host: 0.0.0.0
network.publish_host: !!!!k8s-node1节点内部IP
...

k8s-node2执行以下操作:
和k8s-master创建的配置文件es.yml文件内容大体类似,只有两个地方需要修改(node.name和network.publish_host字段的值需要修改):

...
#节点名称
node.name: node-c
...
#网关地址
#网关地址
network.host: 0.0.0.0
network.publish_host: !!!!k8s-node2节点内部IP
...

3、所有节点启动elasticsearch服务
本步骤通过dokcer run启动elasticsearch容器的方式来实现elasticsearch服务的启动。
所有节点执行启动命令(启动elasticsearch服务):

docker run -e ES_JAVA_OPTS="-Xms512m -Xmx512m" -d -p 9200:9200 -p 9300:9300  \
-v /data/es/config/es.yml:/data/share/elasticsearch/config/elasticsearch.yml  \
-v /data/es/data:/data/share/elasticsearch/data  \
 --name ES elasticsearch:7.5.0

说明:注意启动es服务的时候/data/es/config/es.yml文件与/data/share/elasticsearch/config/elasticsearch.yml文件最好都创建一下,当然这里也可以换成自己目录下的文件,注意,如果换成自己所设置的目录下的文件则要修改启动命令; /data/es/data/data/share/elasticsearch/data也可以修改成自己服务器上所设置的目录,只是注意修改启动命令即可。


elasticsearch服务启动之后大家可以通过docker ps -a查看名称为ES的容器的启动情况,假如该容器异常退出的话,即没有处于正常运行状态,可以通过docker logs -f ES或者docker logs -f ES | grep fail | more查看名称为ES的容器的报错信息:
在这里插入图片描述
报错信息即是:ERROR: [1] bootstrap checks failed
[1]: the default discovery settings are unsuitable for production use; at least one of [discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes] must be configured.

大家可能会感到奇怪,在之前的步骤中data/es/config/es.yml文件中明明已经存在discovery.seed_hostscluster.initial_master_nodes了,那为什么还会报这个错误呢?明明在配置文件中配置discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes三个字段中的任意一个就可以了啊,为什么会报错呢?其实这也是我自己感到困惑的地方,到现在我也不是太理解,欢迎知道这个报错原因的朋友在评论区留言。但是我知道这个问题的解决方案。 不出意外的话,大家根据以上步骤在3个服务器节点上启动elasticsearch服务时可能都会报错,报错信息就是这个,我的解决方案是这样的:
所有节点上执行真正的启动方案(确保以上所有步骤都已经操作完成,包括本步骤3中的错误启动):

#所有节点查找elasticsearch.yml文件
find / -name elasticsearch.yml

编辑刚刚查找到的elasticsearch.yml文件(可能找到很多个elasticsearch.yml文件,但是真正起作用的只有其中的一个elasticsearch.yml文件,但是具体要修改哪一个elasticsearch.yml文件需要自己尝试一下,其中最有可能的文件是以/usr/share/elasticsearch/config/elasticsearch.yml为后缀的文件),各节点将该文件的内容更换成步骤2中各节点对应的es.yml文件的内容,然后各节点分别执行docker rm ES -f命令删除之前启动失败的的elasticsearch容器,最后各节点通过执行上面的启动命令即可启动成功elasticsearch服务,则各linux服务器节点的elasticsearch服务启动成功,es集群搭建成功。
大家可通过一下方式进行验证:
1、查看名称为ES的容器的日志信息。

docker logs -f ES

k8s集群搭建efk集群日志收集系统_第1张图片
若显示mesage显示“started”的信息则elasticsearch服务启动成功。
2、查看各linux服务器的9200端口的占用情况。

netstat -ntulp | grep 9200

在这里插入图片描述
若显示如上图所示的端口占用状态,则elasticsearch服务也多半是启动成功了。
3、浏览器访问ip地址+9200端口,最肯定的验证方式。(每个节点都可以操作一下)
主要是通过浏览器访问各节点的ip地址(外网ip地址)+9200端口,若返回以下有关集群的信息,则elasticsearch服务肯定启动成功了。
k8s集群搭建efk集群日志收集系统_第2张图片至此,elasticsearch集群就安装部署成功了。

二、安装部署flunted组件

只在k8s-master节点即k8s集群的主节点上安装flunted组件即可,即以下操作仅在k8s-master节点执行。因为接下来使用daemonset控制器部署fluentd组件,这样的话集群中的每个节点都可以运行同样fluentd的pod副本,则fluentd可以收集k8s集群中每个节点的日志信息。
首先准备fluentd的镜像,以免因为镜像的问题导致部署错误。

//通过docker load的方式加载fluentd的镜像
docker load -i fluentd.tar.gz

1、首先创建一个命名空间,fluentd组件将被安装到这个命名空间中。

#vim es.yaml 编辑命名空间文件
kind: Namespace
apiVersion: v1
metadata:
 name: es
#编辑完成后,使用:wq!保存退出

#运行yaml文件创建命名空间
kubectl apply -f es.yaml

2、通过DaemonSet控制器的形式安装fluentd组件。

#vim fluentd.yaml 编辑配置文件
apiVersion: v1
kind: ServiceAccount
metadata:
  name: fluentd
  namespace: es   
  labels:
    app: fluentd
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: fluentd
  labels:
    app: fluentd
rules:
- apiGroups:
  - ""
  resources:
  - pods
  - namespaces
  verbs:
  - get
  - list
  - watch
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: fluentd
roleRef:
  kind: ClusterRole
  name: fluentd
  apiGroup: rbac.authorization.k8s.io
subjects:
- kind: ServiceAccount
  name: fluentd
  namespace: es
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd
  namespace: es
  labels:
    app: fluentd
spec:
  selector:
    matchLabels:
      app: fluentd
  template:
    metadata:
      labels:
        app: fluentd
    spec:
      serviceAccount: fluentd
      serviceAccountName: fluentd
      tolerations:
      - key: node-role.kubernetes.io/master
        effect: NoSchedule
      containers:
      - name: fluentd
        image: fluent/fluentd-kubernetes-daemonset:v1.4.2-debian-elasticsearch-1.1
        imagePullPolicy: IfNotPresent
        env:
          - name:  FLUENT_ELASTICSEARCH_HOST
            value: "10.24.2.236"
          - name:  FLUENT_ELASTICSEARCH_PORT
            value: "9200"
          - name:  FLUENT_ELASTICSEARCH_SCHEME
            value: "http"
          - name: FLUENTD_SYSTEMD_CONF
            value: disable
        resources:
          limits:
            memory: 512Mi
          requests:
            cpu: 100m
            memory: 200Mi
        volumeMounts:
        - name: varlog
          mountPath: /var/log
        - name: varlibdockercontainers
          mountPath: /data/docker/containers
          readOnly: true
      terminationGracePeriodSeconds: 30
      volumes:
      - name: varlog
        hostPath:
          path: /var/log
      - name: varlibdockercontainers
        hostPath:
          path: /data/docker/containers
#文件编辑完成后,使用:wq!保存退出
#使用kubectl apply -f fluentd.yaml运行fluentd.yam文件,安装fluentd服务

注意:
字段FLUENT_ELASTICSEARCH_HOST对应的值是k8s-master节点的内网ip地址,大家注意将此值替换为自己k8s集群主节点的内网ip地址
字段varlibdockercontainers对应的目录是docker的容器目录,因为我之前修改过docker根目录,所以该文件中此字段的值是/data/docker/containers(大家要是没有修改过docker的根目录的话,一般默认是/var/lib/docker/contaners)。大家可以通过docker info查看docker根目录的值,总之,此字段的值要对应自己服务器上docker的根目录,k8s集群中各节点的docker的根目录最好统一一下。

三、安装kibana服务

只在k8s-master节点上进行kibana服务的安装部署即可,即以下操作仅在k8s-master节点执行。
注意: kibana的版本最好与elasticsearch的组件一致,否则可能会因为版本不匹配的问题导致一系列错误。

#拉取kibana镜像
docker pull kibana:7.5.0
#创建存放数据的文件夹  大家可以不使用此处设置的目录,自己设置目录之后在启动命令中修改即可
mkdir /data/es/kibana/config
mkdir /data/es/kibana/plugins
#授予文件夹权限
chmod 777 /data/es/kibana

#vim /data/es/kibana/config/kibana.yml 编辑配置文件
server.name: kibana
server.host: "0.0.0.0" 
elasticsearch.hosts: [ "http://k8s-master节点外网ip:9200","http://k8s-node1节点外网ip:9200","http://k8s-node2节点外网ip:9200"]
xpack.monitoring.ui.container.elasticsearch.enabled: true
#配置文件编辑完成后  使用 :wq! 保存退出

此处依然是通过启动kibana容器的方式启动kibana服务的,kibana启动命令如下:

docker run -d --name kibana  -p 5601:5601 \
-v  /data/es/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml \
-v /data/es/kibana/plugins:/usr/share/kibana/plugins:rw  \
--name kibana   kibana:7.5.0

说明:注意将此启动命令中的各文件及文件夹的目录设置成自己k8s-master节点机器上的文件目录,可能需要替换的文件及文件目录有/data/es/kibana/config/kibana.yml、usr/share/kibana/config/kibana.yml、/data/es/kibana/plugins、/usr/share/kibana/plugins,注意通过chmod 777 文件/文件夹进行文件访问权限的授予。
可以通过docker logs -f kibana查看名称为kibana的容器的日志信息,若日志信息显示kibana服务已在运行,则服务启动成功。此时kibana容器的日志信息为
k8s集群搭建efk集群日志收集系统_第3张图片
此时浏览器访问 k8s-master节点外网的ip:5601则可看到kibana的web界面。
初次运行注意开启监控,然后就可以监控到elasticsearch集群中的日志信息。
k8s集群搭建efk集群日志收集系统_第4张图片
k8s集群搭建efk集群日志收集系统_第5张图片

至此kibana服务也安装完毕。

你可能感兴趣的:(docker,docker,linux,centos,服务器)