EFK 实战一 - 基础环境搭建

本贴最后更新于 1781 天前,其中的信息可能已经水流花落

在分布式系统中,由于节点服务会部署多台,一旦出现线上问题需要通过日志分析定位问题就需要登录服务器一台一台进行日志检索,非常不便利,这时候就需要用到 EFK 日志收集工具。

在应用服务端部署 Filebeat,将我们打印到日志文件中的日志发送到 Logstash 中,在经过 Logstash 的解析格式化后将日志发送到 ElasticSearch 中,最后通过 Kibana 展现出来。EFK 基础版的架构如下:
image.png

本文主要是使用 docker 和 docker-Compose 部署 ELK 的基础环境,选择 7.5.1 作为 EFK 组件版本。

当然了如果大家对 dockerdocker-compose 不是很熟悉的话可以翻看我之前为大家准备的两篇文章:

实在不想使用 docker 部署的话也可以下载对应的安装包然后手动部署,配置方式基本一样。

安装配置

elasticsearch

安装 elasticsearch 之前先配置如下的系统变量

  • 修改 /etc/sysctl.conf,在最后追加如下配置
    vm.max_map_count = 655360

  • 修改 /etc/security/limits.conf,增加如下配置

*    		soft    memlock          unlimited
*       	hard    memlock          unlimited
*       	hard    nofile           65536
*       	soft    nofile           65536
  • 修改 /etc/security/limits.d/20-nproc.conf,增加如下配置
*          soft    nproc     4096
root       soft    nproc     unlimited
  • 启动 elasticsearch 临时容器
    docker run --rm --name es -p9200:9200 -p9300:9300 -e discovery.type=single-node elasticsearch:7.5.1

  • 导出 elasticsearch 配置文件
    docker cp fbce586c8a56:/usr/share/elasticsearch/config/elasticsearch.yml /app/elk/elasticsearch/conf/elasticsearch.yml

  • 修改 es 配置文件

cluster.name: "elk-cluster"
network.host: 0.0.0.0
bootstrap.memory_lock: true
discovery.type: single-node
  • 建立 es 的日志文件夹和数据文件夹,并对文件夹授权
mkdir -p /app/elk/elasticsearch/logs
mkdir -p /app/elk/elasticsearch/data
chmod -R 777 /app/elk/elasticsearch/logs
chmod -R 777 /app/elk/elasticsearch/data
  • 停止临时容器
    docker stop fbce586c8a56

logstash

  • 启动临时容器
    docker run --rm --name logstash -p5044:5044 -p9600:9600 logstash:7.5.1

  • 导出 docker 的配置文件
    docker cp 5adb0971bb0f:/usr/share/logstash/config /app/elk/logstash

  • 建立 logstash 数据文件夹,并对其授权

mkdir -p /app/elk/logstash/data
chmod -R 777 /app/elk/logstash/data
  • 复制 logstash 启动文件,并对其修改
cd /app/elk/logstash/config
cp logstash-sample.conf logstash.conf

修改 logstash.conf,配置 output

# Sample Logstash configuration for creating a simple
# Beats -> Logstash -> Elasticsearch pipeline.

input {
  beats {
    port => 5044
  }
}

output {
  elasticsearch {
    hosts => ["http://172.31.0.207:9200"]
    index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
    #user => "elastic"
    #password => "changeme"
  }
}

暂时修改一下 ES 的访问路径即可。

  • 停止临时容器
    docker stop 5adb0971bb0f

kibana

  • 启动临时容器
    docker run --rm --name kibana -p5601:5601 kibana:7.5.1

  • 导出 kibana 配置文件
    docker cp f21f0f9e0259:/usr/share/kibana/config/kibana.yml /app/elk/kibana/conf/kibana.yml

  • 修改 kibana 配置

server.name: kibana
server.host: "0"
elasticsearch.hosts: [ "http://172.31.0.207:9200" ]
xpack.monitoring.ui.container.elasticsearch.enabled: true
i18n.locale: zh-CN

设置 i18n.locale: zh-CN 属性后会对 kibana 进行汉化,这样便于操作,主要还是我英语不太好~

  • 停止临时容器
    docker stop f21f0f9e0259

docker-compose

经过上面的准备,我们可以编写 docker-compose 文件,方便我们对容器进行编排,一键启动。有了之前的基础,我们很容易编写出对应的 yml 文件,编写后的内容如下:

version: "3"
services:
  elasticsearch:
    image: docker.io/elasticsearch:7.5.1
    container_name: elasticsearch
    environment:
      - "ES_JAVA_OPTS=-Xms4096m -Xmx4096m -Xmn1300m"
    volumes:
      - /app/elk/elasticsearch/conf/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
      - /app/elk/elasticsearch/data:/usr/share/elasticsearch/data:rw
      - /app/elk/elasticsearch/logs:/usr/share/elasticsearch/logs:rw
    ports:
      - "9200:9200"
      - "9300:9300"
    restart: always

  kibana:
    image: docker.io/kibana:7.5.1
    container_name: kibana
    volumes:
      - /app/elk/kibana/conf/kibana.yml:/usr/share/kibana/config/kibana.yml
    ports:
      - "5601:5601"
    depends_on:
      - elasticsearch
    restart: always

  logstash:
    image: logstash:7.5.1
    container_name: logstash
    command: logstash -f /usr/share/logstash/config/logstash.conf
    volumes:
      - /app/elk/logstash/config:/usr/share/logstash/config
      - /app/elk/logstash/data:/usr/share/logstash/data
    ports:
      - "9600:9600"
      - "5044:5044"
    depends_on:
      - elasticsearch
    restart: always

将 docker-compose 文件上传至服务器,启动 docker 服务
docker-compose -f elk.yml up -d
image.png

启动完成后访问 kibana 地址 http://172.31.0.207:5601/ 验证是否正常访问

安全认证

我们刚刚部署的 elk 环境是不需要密码就可以登录 kibana 的,这样谁都可以访问而且可以更改数据。所以我们需要给 kibana 加个密码,必须要登录才可以进行操作。

主要是利用 elasticsearch 自带的 xpack 作为权限验证功能。操作步骤如下:

  • 修改 es 外部配置文件 /app/elk/elasticsearch/conf/elasticsearch.yml,开启权限验证
xpack.security.enabled: true
  • 重启 elasticsearch 服务
    docker-compose -f elk.yml restart elasticsearch

  • 进入 es 容器,为内置账号设置密码

docker exec -it  elasticsearch /bin/bash
cd /usr/share/elasticsearch/bin
./elasticsearch-setup-passwords interactive

image.png

  • 修改 kibana 配置文件 /app/elk/kibana/conf/kibana.yml
elasticsearch.username: "elastic"
elasticsearch.password: "xxxxxx"
  • 重启 kibana
    docker-compose -f elk.yml restart kibana

  • 重新访问 kibana,并使用上面设置的 elastic 账号进行登录
    image.png
    至此我们顺利给 ELK 加上了安全认证,可以放心在生产环境部署使用了!

好了,各位朋友们,本期的内容到此就全部结束啦,下一期我们会将业务系统的日志接入 ELK 并对日志进行解析格式化,欢迎持续关注。

如果觉得这篇文章对你有所帮助的话请扫描下面二维码加个关注。"转发" 加 "在看",养成好习惯!咱们下期再见!
image.png

  • ELK
    23 引用 • 18 回帖
  • 运维

    互联网运维工作,以服务为中心,以稳定、安全、高效为三个基本点,确保公司的互联网业务能够 7×24 小时为用户提供高质量的服务。

    149 引用 • 257 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...