k8sEfk快速搭建

本文详细介绍如何在Kubernetes环境中部署ELK(Elasticsearch、Logstash替代为Fluentd、Kibana)日志系统,包括各组件的配置、工作原理及实战部署步骤。

1.前言

ELK 相信大家都很熟悉

  • ElasticSearch,分布式搜索和分析引擎。
  • Logstash,实时传输能力的数据收集引擎。
  • Kibana,为 Elasticsearch 提供了分析和可视化的 Web 平台。它可以在 Elasticsearch 的索引中查找,交互数据,并生成各种维度表格、图形。

这里我们把Logstash 替换成 Fluentd,进行部署

1.1 logstash 和 fluentd 对比
名称 优点 缺点
logstash Logstash 主要的有点就是它的灵活性,主要因为它有很多插件,详细的文档以及直白的配置格式让它可以在多种场景下应用。我们基本上可以在网上找到很多资源,几乎可以处理任何问题 效能上表现略逊,大数据量的情况下会是个问题
fluentd 效能好,轻量 灵活性差
1.2 flutend 相关说明
1.2.1 flutend 介绍

Fluentd 是一个高效的日志聚合器,是用 Ruby 编写的,并且可以很好地扩展。对于大部分企业来说,Fluentd 足够高效并且消耗的资源相对较少,另外一个工具Fluent-bit更轻量级,占用资源更少,但是插件相对 Fluentd 来说不够丰富,所以整体来说,Fluentd 更加成熟,使用更加广泛,所以我们这里也同样使用 Fluentd 来作为日志收集工具

1.2.2 工作原理

Fluentd 通过一组给定的数据源抓取日志数据,处理后(转换成结构化的数据格式)将它们转发给其他服务,比如 Elasticsearch、对象存储等等。Fluentd 支持超过300个日志存储和分析服务,所以在这方面是非常灵活的。主要运行步骤如下:

  • 首先 Fluentd 从多个日志源获取数据
  • 结构化并且标记这些数据
  • 然后根据匹配的标签将数据发送到多个目标服务去
1.2.3 架构图

flutend 架构图

2.部署

本次搭建的环境是测试环境,一个主节点,四个工作节点

  • Kubernetes:v1.17.3
  • Kibana镜像 :kibana:7.6.2
  • Elasticsearch镜像:elasticsearch:7.6.2
  • Fluentd 镜像:willdockerhub/fluentd-elasticsearch:v2.3.2

2.1 Elasticsearch 相关

2.1.1 es-statefulset.yaml配置

apiVersion: apps/v1
kind: StatefulSet
metadata:
 name: es
 namespace: logging
spec:
 serviceName: elasticsearch
 replicas: 3
 selector:
   matchLabels:
     app: elasticsearch
 template:
   metadata:
     labels: 
       app: elasticsearch
   spec:
     nodeSelector:
       es: log
     initContainers:
     - name: increase-vm-max-map
       image: busybox
       command: ["sysctl", "-w", "vm.max_map_count=262144"]
       securityContext:
         privileged: true
     - name: increase-fd-ulimit
       image: busybox
       command: ["sh", "-c", "ulimit -n 65536"]
       securityContext:
         privileged: true
     containers:
     - name: elasticsearch
       image: elasticsearch:7.6.2
       ports:
       - name: rest
         containerPort: 9200
       - name: inter
         containerPort: 9300
       resources:
         limits:
           cpu: 1000m
         requests:
           cpu: 1000m
       volumeMounts:
       - name: elasticsearch-logging
         mountPath: /usr/share/elasticsearch/data
       env:
       - name: cluster.name
         value: k8s-logs
       - name: node.name
         valueFrom:
           fieldRef:
             fieldPath: metadata.name
       - name: cluster.initial_master_nodes
         value: "es-0,es-1,es-2"
       - name: discovery.zen.minimum_master_nodes
         value: "2"
       - name: discovery.seed_hosts
         value: "elasticsearch"
       - name: ES_JAVA_OPTS
         value: "-Xms512m -Xmx512m"
       - name: network.host
         value: "0.0.0.0"
 volumeClaimTemplates:
 - metadata:
     name: elasticsearch-logging
     annotations:
       volume.beta.kubernetes.io/storage-class: course-nfs-storage
   spec:
     accessModes: [ "ReadWriteOnce" ]
     resources:
       requests:
         storage: 1Gi      

关于volumeClaimTemplates相关的内容,我是参考 简书的一个博客

2.1.2 es-svc.yaml配置

kind: Service
apiVersion: v1
metadata:
  name: elasticsearch
  namespace: logging
  labels:
    app: elasticsearch
spec:
  selector:
    app: elasticsearch
  clusterIP: None
  ports:
    - port: 9200
      name: rest
    - port: 9300
      name: inter-node

2.1.3 安装es相关配置文件

$ kubectl create -f es-statefulset.yaml -n logging
$ kubectl create -f es-svc.yaml -n logging

$ kubectl get pods -n logging
NAME                      READY   STATUS    RESTARTS   AGE
es-0                      1/1     Running   0          6h9m
es-1                      1/1     Running   0          6h9m
es-2                      1/1     Running   0          6h8m

ps node label

$ kubectl get svc -n logging
NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)             AGE
elasticsearch   ClusterIP   None            <none>        9200/TCP,9300/TCP   6h17m

2.1.4 测试es

$ kubectl port-forward es-0 9200:9200 --namespace=logging
Forwarding from 127.0.0.1:9200 -> 9200
Forwarding from [::1]:9200 -> 9200

打开新的终端

$ curl http://localhost:9200/_cluster/state?pretty

正常应该是可以看到该信息的

2.2 Kibana 相关

2.2.1 kibana.yaml配置文件

apiVersion: v1
kind: Service
metadata:
  name: kibana
  namespace: logging
  labels:
    app: kibana
spec:
  ports:
  - port: 5601
  type: NodePort
  selector:
    app: kibana

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: kibana
  namespace: logging
  labels:
    app: kibana
spec:
  selector:
    matchLabels:
      app: kibana
  template:
    metadata:
      labels:
        app: kibana
    spec:
      nodeSelector:
        es: log
      containers:
      - name: kibana
        image: kibana:7.6.2
        resources:
          limits:
            cpu: 1000m
          requests:
            cpu: 1000m
        env:
        - name: ELASTICSEARCH_HOSTS
          value: http://elasticsearch:9200
        ports:
        - containerPort: 5601

2.2.2 部署kibana相关yaml

$ kubectl create -f kibana.yaml -n logging

$ kubectl get pods -n logging
NAME                      READY   STATUS    RESTARTS   AGE
es-0                      1/1     Running   0          6h9m
es-1                      1/1     Running   0   
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值