ELK多租户方案

2020-12-11 15:26:50 浏览数 (1)

一、前言

日志分析是目前重要的系统调试和问题排查的重要手段之一,而目前分布式系统由于实例和机器众多,所以构建一套统一日志系统是非常必要的;ELK提供了一整套解决方案,并且都是开源软件,之间互相配合使用,完美衔接,高效的满足了很多场合的应用,是目前的主流选择之一。

本文主要介绍如何实现一套 ELK系统 同时给 「多套环境」「多个系统」 共同使用/测试,并实现相互之间的数据与视图相互 「隔离」 互不影响。

二、隔离方式

常见的 ELK 架构如下图所示,分别由 ElasticsearchLogstashKibanaFileBeat 组成。

分别在每个应用服务器里部署一个 FileBeat 组件作为日志收集器,通过输入插件从文件中获取数据,然后传输给 Logstash 将通过过滤插件加工并结构化处理日志数据后发送至 Elasticsearch 存储,最后通过 Kibana 进行可视化展示分析。

「PS」:需要对上图中 ELK 的各个组件分别做 「隔离」 处理

2.1. FileBeat隔离

由于每台机器上都会部署一个 Beat 实例作为日志收集,所以 FileBeat 本身无需做任何隔离配置,但是作为数据的入口需要把所属 「租户」 相关的信息传递给下游,如下图所示

通过 project(项目名) 和 env(环境) 作为 「租户」 隔离标识

2.2. Logstash隔离

主要是每个项目的日志格式可能会不一样,所以会存在不同的个性化配置文件,这个 「日志解析配置文件」 需要定义隔离规则进行分离;

使用以下命令启动 logstash 指定 config/conf/ 为配置存放目录,并指定配置文件热加载。

代码语言:javascript复制
bin/logstash -f config/conf/ --config.reload.automatic

日志解析配置文件隔离方法可参考下图方式:

「(1)01-input-beats.conf」

为通用 「输入」 配置,每个租户共享,用于接收来自 Filebeat 的数据

代码语言:javascript复制
input {
  beats {
    port => 5044
  }
}

「(2)02-output-es.conf」

为通用 「输出」 配置,每个租户共享,用于把日志数据按照定义好的 「索引命名规则」 创建索引写入到es中

需要在数据来源中添加 projectenvdocType 三个字段分别代表项目名、环境与日志类型

代码语言:javascript复制
output {

  elasticsearch {
    hosts => ["localhost"]
    user => "elastic"
    password => "changeme"
    index => "%{[fields][project]}-%{[fields][env]}-%{[fields][docType]}-%{ YYYY.MM.dd}"
  }
}

ip、用户名和密码按实际情况修改

「(3)mp.conf」

为个性化 「日志解析」 配置,每个租户单独新建一个配置文件配置自己的 filter 内容

代码语言:javascript复制
filter {
  if [fields][project] == "mp" and [fields][env] == "pre" and [fields][docType] == "syslog" {
    grok {
      ..........
    }
  }
}

「PS」:必需增加 if 语句来确认是否属于自己租户的日志数据!

2.3. Elasticsearch隔离

通过不同的索引命名,创建各自独立的索引实现物理隔离;由前面的 Logstash 在结构化数据后生成索引时,已自动通过 Filebeat 的入参变量动态生成规定的索引名。

索引的命名规则为:{项目名}-{环境}-

例如:mp-pre-syslog-2020.12.01

2.4. Kibana隔离

可通过多工作区的方式进行隔离,每个租户创建自己独立的工作空间,用于隔离自己的索引数据、展示视图等对象,并且 「相互不可见」

工作区的配置流程如下:

  1. 创建工作区
  2. 创建角色(配置权限)
  3. 创建用户(关联角色)
2.3.1 创建工作空间
2.3.1.1 超级管理员登录

使用超级管理员账号 elastic 登录Kibana,选择 「默认工作区」

2.3.1.2 进入管理页面
2.3.1.3 创建工作空间

创建工作区,并可定制显示的功能点(默认全部显示)

2.3.2 创建角色绑定工作空间

创建一个新的角色,并分配对应的 索引权限工作区权限 等权限给该角色

2.3.3 创建用户

创建用户,并绑定自己 工作空间 下的角色

「PS」:该用户只能看到自己所属 工作区 下的 索引仪表板 等对象

三、总结

每个 「租户」 需对 ELK 的各个组件分别做 「隔离」 处理

  1. 「Filebeat」:负责把区分 租户相关的信息传递给下游
  2. 「Logstash」:独立分开每个租户的个性化 Filter 配置文件
  3. 「Elasticsearch」:通过规范的索引命名,各租户独立的创建索引实现物理隔离
  4. 「Kibana」:通过多工作区的方式进行隔离,数据与仪表板等互不可见

「PS」:隔离步骤虽然有点繁琐,但是后期大家可以自行开发产品化日志系统,把上述的步骤放在图形化界面上操作实现。

0 人点赞