一个稳定的 Elastic Stack 集群对于数据的实时采集,处理及查询非常重要。我们可以使用一个专有的 Elasticsearch 集群来监视一个生产环境的 Elasticsearch 集群。在之前的文章 “Beats:通过 Metricbeat 实现外部对 Elastic Stack 的监控”,我已经讲述了如何对 Elasticsearch 进行监控。在今天及以后的几篇文章中,我将详细讲述如何来对 Elastic Stack 的各个软件栈进行监控。尽管我们可以使用把 Elasticsearch 自己的状态信息导入到自己的索引中以进行分析,但是在实际的使用中,我们还是倾向于设置一个专用的 Elasticsearch 集群来进行监控,原因是:

  • 减少受监视集群上的负载和存储
  • 即使对于运行状况不佳的群集,也可以继续访问监控。如果没有单独的集群,那么当集群发生故障时,我们不可以继续提供监视
  • 支持隔离职责(单独的安全策略)

在生产环境中,通常的监视框架图为:


elk 监控 kubernetes 监控elasticsearch_Elastic

标题

                             使用 Metricbeat 进行监视,可将所有数据直接路由到监视群集,而完全无需接触生产群集

你可以使用 Metricbeat 将有关 Elasticsearch,Kibana,Logstash 和 Beats 的数据直接收集并运送到你的监视集群,而不是通过生产集群进行路由。 上图图说明了具有独立生产和监视群集的典型监视体系结构。

在今天以后的介绍中,我们将会使用上面的框图来进行构建。通过引入 Metricbeat 作为收集和运输监视数据的代理,不再需要通过生产集群路由监视数据。 现在可以由独立的轻量级监视代理程序收集监视数据,并将其直接发送到监视集群。

在下面的练习中,我们将使用如下的架构:

elk 监控 kubernetes 监控elasticsearch_elk 监控 kubernetes_02

在上面的配置中,我使用了两个集群:生产集群及监视集群。我们必须部署 Metricbeat 到生产集群中,并把数据传入到监视集群中。在上面的机器中,我们将分别部署所有的软件。

安装

在上面的配置中,安装的软件不少。我们先来分别安装需要的部分:

Ubuntu OS

在这个集群中,我们使用 debian 安装包进行安装,并且配置 https 的访问。在我之前的文章 “Security:如何安装 Elastic SIEM 和 EDR” 有非常详细的描述。请大家按照文章里的要求部署 Elasticsearch 及 Kibana。在这里必须要注意的一点就是在,在我们生产证书时,我们需要添加 Mac OS 电脑的 IP 地址,也就是:

/usr/share/elasticsearch/instances.yml

instances:
    - name: "elasticsearch"
      ip:
        - "192.168.0.4"
    - name: "kibana"
      ip:
        - "192.168.0.4"
    - name: "zeek"
      ip:
        - "192.168.0.4"
    - name: "metricbeat"
      ip:
        - "192.168.9.3"

在上面,我添加了 192.168.9.3 这个 IP 地址,它是我们的 Metricbeat 所运行的机器的 IP 地址。 在生成证书的过程中,它将生成 metricbeat 的证书:

  • metricbeat.crt
  • metricbeat.key

这个证书将在下面的 Metricbeat 的配置中被使用到。

Mac OS

我们可以按照我之前的文章来部署 Elasticsearch 及 Kibana:

  • 如何在 Linux,MacOS 及 Windows 上进行安装 Elasticsearch
  • Kibana:如何在 Linux,MacOS 及 Windows上安装 Elastic 栈中的 Kibana

在配置 Elasticsearch 时,我们需要针对 config/elasticsearch.yml 做一些配置:

config/elasticsearch.yml

network.host: 0.0.0.0
discovery.type: single-node

通过这样的配置,我们的 Elasticsearch 绑定于网路的所有接口。它即可被 http://localhost:9200 访问,也可以被它的私有地址 http://mac:9200。

针对 Kibana,我们也可以做如下的配置,尽管是不必要的:

config/kibana.yml

server.host: "0.0.0.0"

同样,它既可以被 localhost 也可以被 Mac OS 的私有地址所访问 http://mac:5601。配置完毕后,我们重新启动 Elasticsearch 及 Kibana。

监控 Elasticsearch

我们首先打开 Ubuntu OS 上的 Elastic Stack 的 Kibana:

elk 监控 kubernetes 监控elasticsearch_elasticsearch_03

elk 监控 kubernetes 监控elasticsearch_elastic_04

elk 监控 kubernetes 监控elasticsearch_Elastic_05

上面显示没有任何的集群被监控,而且需要被监控的集群也不是我们需要的地址。点击上面的 Monitor with Metricbeat 链接:

elk 监控 kubernetes 监控elasticsearch_大数据_06

elk 监控 kubernetes 监控elasticsearch_大数据_07

按照上面的要求,我们在 Mac OS 上安装好自己的 Metricbeat,并同时执行如下的命令:

metricbeat modules enable elasticsearch-xpack

上面的命令启动 elasticsearch-xpack 模块,实现对 Elasticsearch 的监控。如果你对如何启动 Beats 的模块想了解更多,请参阅我之前的文章 “Beats:Beats 入门教程 (二)”。这里有不再累述了。

$ pwd
/Users/liuxg/elastic1/metricbeat-7.11.0-darwin-x86_64
$ ./metricbeat modules enable elasticsearch-xpack
Enabled elasticsearch-xpack

接下来,我们需要把我们在设置 Ubuntu 机器上的集群的证书拷入到 /Users/liuxg/elastic1 目录中 (这个目录依赖于你自己的目录不同而不同):

$ pwd
/Users/liuxg/elastic1
$ ls *.crt
ca.crt         metricbeat.crt
$ ls *.key
metricbeat.key

我们需要对 Metricbeat 做相应的配置:

elk 监控 kubernetes 监控elasticsearch_elk 监控 kubernetes_08

由于我们在 Ubuntu 的 Elasticsearch 中启动了 https 安全,我们需要对 Metricbeat 中的 output.elasticsearch 做如下的修改:

metricbeat.yml

output.elasticsearch:
  # Array of hosts to connect to.
  hosts: ["192.168.0.4:9200"]

  # Protocol - either `http` (default) or `https`.
  protocol: "https"

  # Authentication credentials - either API key or username/password.
  #api_key: "id:api_key"
  username: "elastic"
  password: "password"
  output.elasticsearch.ssl.certificate: "/Users/liuxg/elastic1/metricbeat.crt"
  output.elasticsearch.ssl.key: "/Users/liuxg/elastic1/metricbeat.key"
  ssl.certificate_authorities: [ "/Users/liuxg/elastic1/ca.crt" ]

等配置完 metricbeat.yml 文件后,我们可以使用如下的命令来进行测试:

./metricbeat test output
$ ./metricbeat test output
elasticsearch: https://192.168.0.4:9200...
  parse url... OK
  connection...
    parse host... OK
    dns lookup... OK
    addresses: 192.168.0.4
    dial up... OK
  TLS...
    security: server's certificate chain verification is enabled
    handshake... OK
    TLS version: TLSv1.3
    dial up... OK
  talk to server... OK
  version: 7.11.2

如果你能看到上面的输出,就表明我们的配置是成功的。接下来,我们还需要对 modules.d/elasticsearch-xpack.yml 进行配置:

modules.d/elasticsearch-xpack.yml

- module: elasticsearch
  xpack.enabled: true
  period: 10s
  hosts: ["https://192.168.0.3:9200"]

请注意上面的 192.168.0.3 是我的 Mac OS 电脑的地址,也就是被监控的集群。配置完毕后,我们使用如下的命令来运行 Metricbeat:

./metricbeat -e

我们在  Ubunut 上的 Kibana 中将看到:

elk 监控 kubernetes 监控elasticsearch_elk 监控 kubernetes_09

 在上面我们显示了如何使用一个监视集群监督另外一个集群。这个功能是免费的,可以在 Basic 许可下使用。在实际的使用中,我们可能会使用一个集群来监视超过一个以上的集群,比如:

elk 监控 kubernetes 监控elasticsearch_elk 监控 kubernetes_10

这个对集群的监控属于 Gold/Platinum 许可。你如果想了解更多,请参阅我们的官方文档 订阅 | Elastic Stack 产品和支持 | Elastic

显然我们的监控已经起作用了。但是在右边我们没有看到 Logs 的信息。这个我们还需要配置。在我之前的文章 “Elastic:配置 Elasticsearch 服务器 logs” 有做详细的介绍。

我们可以使用 Filebeat 来收集 Elasticsearch 的日志信息。由于 Filebeat 和 Metricbeat 运行于同一个 host 上,出于方便,我们可以直接使用在之前使用的 metricbeat 的证书信息。我们安装好 Filebeat,并对 filebeat.yml 做如下的配置:

filebeat.yml

output.elasticsearch:
  # Array of hosts to connect to.
  hosts: ["192.168.0.4:9200"]

  # Protocol - either `http` (default) or `https`.
  protocol: "https"

  # Authentication credentials - either API key or username/password.
  #api_key: "id:api_key"
  username: "elastic"
  password: "password"
  output.elasticsearch.ssl.certificate: "/Users/liuxg/elastic1/metricbeat.crt"
  output.elasticsearch.ssl.key: "/Users/liuxg/elastic1/metricbeat.key"
  ssl.certificate_authorities: [ "/Users/liuxg/elastic1/ca.crt" ]

等配置完毕后,我们可以使用如下的命令来对它进行验证:

./filebeat test output
$ ./filebeat test output
elasticsearch: https://192.168.0.4:9200...
  parse url... OK
  connection...
    parse host... OK
    dns lookup... OK
    addresses: 192.168.0.4
    dial up... OK
  TLS...
    security: server's certificate chain verification is enabled
    handshake... OK
    TLS version: TLSv1.3
    dial up... OK
  talk to server... OK
  version: 7.11.2

上面标明,我们的配置是没有任何的问题的。我们接着使用如下的命令来启动 elasticsearch 模块:

./filebeat modules enable elasticsearch

接着我们修改 modules.d/elasticsearch.yml 文件:

modules.d/elasticsearch.yml

- module: elasticsearch
  # Server log
  server:
    enabled: true

    # Set custom paths for the log files. If left empty,
    # Filebeat will choose the paths depending on your OS.
    var.paths:
      - ../elasticsearch*/logs/*_server.json

  gc:
    enabled: true
    # Set custom paths for the log files. If left empty,
    # Filebeat will choose the paths depending on your OS.
    var.paths:
      - ../elasticsearch*/logs/gc/log.[0-9]*
      - ../elasticsearch*/logs/gc.log

  audit:
    enabled: true
    # Set custom paths for the log files. If left empty,
    # Filebeat will choose the paths depending on your OS.
    var.paths:
      - ../elasticsearch*/logs/*_audit.json

  slowlog:
    enabled: true
    # Set custom paths for the log files. If left empty,
    # Filebeat will choose the paths depending on your OS.
    var.paths:
      - ../elasticsearch*/logs/*_index_search_slowlog.json
      - ../elasticsearch*/logs/*_index_indexing_slowlog.json

  deprecation:
    enabled: true
    # Set custom paths for the log files. If left empty,
    # Filebeat will choose the paths depending on your OS.
    var.paths:
      - ../elasticsearch/logs/*_deprecation.json

保存上面的文件,并用一下的方式来运行 Filbeat:

./filebeat -e

我们访问 Ubuntu 中的 Logs:

elk 监控 kubernetes 监控elasticsearch_Elastic_11

从上面显示,我们可以看出来有 Logs 的信息出现。如果你是白金的用户的话,你还可以同时监视多个集群:

elk 监控 kubernetes 监控elasticsearch_大数据_12

监控 Kibana

监控 Kibana 其实和 Elasticsearch 也差不多。在上面,我们其实已经配置了 Metricbeat 的 output.elasticsearch。这里就不需要重新配置了。我们可以使用如下的命令来启动 kibana-xpack 模块:

./metricbeat modules enable kibana-xpack

接下来,我们需要对 modules.d/kibana-xpack.yml 进行配置:

modules.d/kibana-xpack.yml

- module: kibana
  xpack.enabled: true
  period: 10s
  hosts: ["localhost:5601"]
  #basepath: ""
  #username: "user"
  #password: "secret"

由于我们的 Kibana 可以同时被 localhost 以及本地 IP 地址访问,所以我们不需要做任何的改变。

我们重新启动 Metricbeat:

./metricbeat -e

我们重新回到 Ubuntu  机器的 Kibana 界面,并打开正在被监视的集群:

elk 监控 kubernetes 监控elasticsearch_elastic_13

elk 监控 kubernetes 监控elasticsearch_Elastic_14

这一次,我们看到多一个 Kibana 的监控界面。我们可以点进 Overview 来查看 Kibana 的运行情况:

elk 监控 kubernetes 监控elasticsearch_大数据_15

总结

在今天的练习中,我们展示了如何使用一个 Elasticsearch 集群来对另外一个集群进行监控。一个健康的可被监控的 Elasticsearch 集群对于一些生成环境来说非常重要。 所有监控指标都存储在监控的 Elasticsearch 中,这使您可以轻松地可视化来自 Kibana 的数据。 默认情况下,监视指标存储在本地索引中。在生产中,我们强烈建议使用单独的监视群集。 使用单独的监视群集可防止生产群集中断影响你访问监视数据的能力。 它还可以防止监视活动影响生产集群的性能。 出于相同的原因,我们还建议使用单独的 Kibana 实例来查看监视数据。在接下来的文章 “Elastic:监控 Beats 及 APM Server” 中,我将详述如何监控 Beats 以及 APM Server。