如何在CentOS7上使用Packetbeat和ELK收集基础设施指标

来自菜鸟教程
跳转至:导航、​搜索

介绍

Packetbeat 可让您监控 HTTP 和 MySQL 等应用程序级协议以及 DNS 和其他服务的实时网络流量。

为此,您在客户端机器上配置代理,称为“托运人”,这些代理可以嗅探和解析网络流量并将消息映射到事务。 然后,这些托运人为每个操作生成记录,并将它们发送到 Elasticsearch 或 Logstash。 获得数据后,您可以使用 Kibana 搜索、分析和可视化数据,以便您可以就您的基础架构做出明智的决策或解决问题。

在本教程中,您将配置和使用带有 ELK 堆栈的 Packetbeat 来收集和可视化基础设施指标。

先决条件

  • 一台具有 4GB RAM 的 CentOS 7 服务器,配置了教程 如何在 CentOS 7 上安装 Elasticsearch、Logstash 和 Kibana 中描述的 ELK Stack 设置。 按照教程配置 ELK 堆栈并安装 Kibana 仪表板,但不要配置任何客户端计算机。
  • 一台具有任意数量 RAM 的 CentOS 7 服务器,将用作客户端计算机。
  • 每个服务器 具有 sudo 权限 的标准用户帐户。 您可以按照 Initial Server Setup with CentOS 7 教程设置标准帐户。

第 1 步 — 在 Elasticsearch 中加载 Packetbeat 索引模板

因为我们计划使用 Packetbeat 将日志传送到 Elasticsearch,所以我们首先加载 Packetbeat 索引模板,该模板配置 Elasticsearch 以智能方式分析传入的 Packetbeat 字段。

首先,登录到你的 ELK 服务器:

ssh sammy@your_elk_server_ip

登录后,将 Packetbeat 索引模板下载到您的主目录:

cd ~
curl -O https://raw.githubusercontent.com/elastic/beats/master/packetbeat/packetbeat.template-es2x.json

然后使用以下命令加载模板:

curl -XPUT 'http://localhost:9200/_template/packetbeat' -d@packetbeat.template-es2x.json

如果模板加载成功,您将看到输出。

Output{"acknowledged":true}

现在您的 ELK 服务器已准备好接受来自 Packetbeat 的数据,让我们在客户端服务器上设置托运人。

第 2 步 — 在客户端服务器上设置 Packetbeat

要设置 Packetbeat 运送器,您需要将在先决条件教程中创建的 SSL 证书传送到客户端服务器。 需要在客户端服务器和 ELK 服务器之间建立通信。

找到您的客户端服务器的 IP 地址。 然后, 在您的 ELK 服务器 上,使用 scp 命令将 SSL 证书复制到您的客户端服务器:

scp /etc/pki/tls/certs/logstash-forwarder.crt sammy@your_client_server_private_ip_address:/tmp

提供密码后,确保证书复制成功。

现在,登录到您的 客户端服务器

ssh sammy@your_client_server_ip_address

登录后,将 ELK 服务器的 SSL 证书复制到 /etc/pki/tls/certs 目录中:

sudo mkdir -p /etc/pki/tls/certs
sudo cp /tmp/logstash-forwarder.crt /etc/pki/tls/certs/

接下来,我们需要安装 Packetbeat 本身。 在您的客户端服务器上,运行以下命令将 Elasticsearch 公共 GPG 密钥导入 rpm:

sudo rpm --import http://packages.elastic.co/GPG-KEY-elasticsearch

为 Packetbeat 创建和编辑新的存储库文件:

sudo vi /etc/yum.repos.d/elastic-beats.repo

将以下行添加到文件中:

/etc/yum.repos.d/elastic-beats.repo

[beats]
name=Elastic Beats Repository
baseurl=https://packages.elastic.co/beats/yum/el/$basearch
enabled=1
gpgkey=https://packages.elastic.co/GPG-KEY-elasticsearch
gpgcheck=1

然后保存文件并退出编辑器。

现在,安装 Packetbeat 包:

sudo yum update
sudo yum -y install packetbeat

Packetbeat 现已安装,但需要进行配置才能使用它。

第 3 步 — 在客户端上配置 Packetbeat

Packetbeat 需要知道要记录什么以及将数据发送到哪里。 让我们将其配置为连接到 ELK 服务器上的 Logstash,并定义我们希望它监视的流量类型。 我们将通过修改 Packetbeat 附带的默认配置文件来做到这一点。

在客户端服务器上,编辑 Packetbeat 配置文件:

sudo vi /etc/packetbeat/packetbeat.yml

注意: Packetbeat的配置文件是YAML格式,也就是说缩进很重要! 请务必使用这些说明中指示的相同数量的空格。


在文件顶部附近,您将看到 input 部分,您可以在其中指定应将哪些指标和统计信息发送到 ELK 服务器。 我们将使用默认输入设置,但您可以随意更改它以满足您的需要。

选择要从中捕获流量的网络接口。 在 Linux 上,Packetbeat 支持捕获安装 Packetbeat 的服务器发送或接收的所有消息。 为此,使用 any 作为设备:

packetbeat.yml

# Select the network interfaces to sniff the data. You can use the "any"
# keyword to sniff on all connected interfaces.
interfaces:
  device: any

protocols 部分,配置 Packetbeat 可以找到每个协议的端口。 如果您使用任何非标准端口,请在此处添加它们。 否则,默认值应该就可以了。

packetbeat.yml

protocols:
  dns:
    ports: [53]

    include_authorities: true
    include_additionals: true

  http:
    ports: [80, 8080, 8081, 5000, 8002]

  memcache:
    ports: [11211]

  mysql:
    ports: [3306]

  pgsql:
    ports: [5432]

  redis:
    ports: [6379]

  thrift:
    ports: [9090]

  mongodb:
    ports: [27017]

接下来,我们需要告诉 Packetbeat 将其数据发送到哪里。

output 部分下,找到以 elasticsearch: 开头的行,表示 Elasticsearch 输出部分。 我们不会使用此部分,因此 删除或注释掉整个 Elasticsearch 输出部分 ,直到显示 #logstash: 的行)。

从这里开始删除:

packetbeat.yml

  ### Elasticsearch as output
  elasticsearch:
    # Array of hosts to connect to.
    # Scheme and port can be left out and will be set to the default (http and 9200)
    
    ...

并继续删除,直到找到这一行:

packetbeat.yml

  ### Logstash as output

我们不会将数据发送到 Elasticsearch,而是将其发送到 Logstash。 因此,找到注释掉的 Logstash 输出部分,由以 #logstash:. 开头的行表示,通过删除前面的 # 取消注释该行。 然后取消注释 hosts: ["localhost:5044"] 行并将 localhost 更改为您的 ELK 服务器的私有 IP 地址。 配置文件的部分应如下所示:

packetbeat.yml

  ### Logstash as output
  logstash:
    # The Logstash hosts
    hosts: ["your_ELK_server_private_ip_address:5044"]

这会将 Packetbeat 配置为在端口 5044 上连接到您的 ELK 服务器上的 Logstash,这是我们在先决条件教程中为 Logstash 输入指定的端口。

接下来,找到tls部分,去掉tls:前面的注释。 然后取消注释指定 certificate_authorities 的行,并将其值更改为 ["/etc/pki/tls/certs/logstash-forwarder.crt"]

packetbeat.yml

    tls:
      # List of root certificates for HTTPS server verifications
      certificate_authorities: ["/etc/pki/tls/certs/logstash-forwarder.crt"]

这会将 Packetbeat 配置为使用我们从 ELK 服务器复制的证书。 没有这个,客户端将无法建立连接。

如果您想仔细检查您的配置文件,请将您的配置文件与此示例进行比较,该示例省略了大部分不必要的注释以提高可读性:

packetbeat.yml

############################# Sniffer #########################################
interfaces:
  device: any

############################# Protocols #######################################
protocols:
  dns:
    ports: [53]

    include_authorities: true
    include_additionals: true

  http:
    ports: [80, 8080, 8081, 5000, 8002]

  memcache:
    ports: [11211]

  mysql:
    ports: [3306]

  pgsql:
    ports: [5432]

  redis:
    ports: [6379]

  thrift:
    ports: [9090]

  mongodb:
    ports: [27017]

############################# Output ##########################################
output:

  ### Logstash as output
   logstash:
    hosts: ["your_ELK_server_private_ip_address:5044"]

    tls:
      certificate_authorities: ["/etc/pki/tls/certs/logstash-forwarder.crt"]

############################# Logging #########################################
logging:

  files:
    rotateeverybytes: 10485760 # = 10MB

查看配置后,保存文件并退出文本编辑器。

现在启动 Packetbeat 以将您的更改落实到位:

sudo systemctl start packetbeat

并配置 Packetbeat 在您的服务器重新启动时启动:

sudo systemctl enable packetbeat

对您要监控的任何其他服务器重复此部分。

Packetbeat 现在应该正在侦听网络流量并将其发送到 Logstash。 让我们看看它是否有效。

第 4 步 — 测试 Packetbeat 安装

此时,您的客户端服务器上的 Packetbeat 应该将您的网络流量日志发送到您的 ELK 服务器上的 Logstash。 Logstash 应该在名为 packetbeat-YYYY.MM.DD 的带日期标记的索引中将 Packetbeat 数据加载到 Elasticsearch 中。 让我们通过在客户端机器上创建一个简单的 HTTP 请求并在 ELK 服务器上的 Elasticsearch 中查找该请求来测试它是否有效。

在您的客户端服务器上,使用 curlhttp://www.elastic.co 发出请求。

curl http://www.elastic.co/ > /dev/null

然后,在您的 ELK 服务器上,通过使用以下命令查询 Packetbeat 索引来验证 Elasticsearch 确实在接收数据:

curl -XGET 'http://localhost:9200/packetbeat-*/_search?pretty'

您应该会看到一堆如下所示的输出:

Output{
  "hits" : {
    "total" : 3,
    "max_score" : 1.0,
    "hits" : [ {
      "_index" : "packetbeat-2016.11.13",
      "_type" : "dns",
      "_id" : "AVheUqX0CSBq6gd6x-Oj",
      "_score" : 1.0,
      "_source" : {
        "direction" : "out",
        "server" : "",
        "responsetime" : 49,
        "resource" : "www.elastic.co",
        "dns" : {
          "additionals_count" : 0,
          "answers" : [ {
            "class" : "IN",
            "data" : "2406:da00:ff00::6b16:f086",
            "name" : "www.elastic.co",
            "ttl" : 59,
            "type" : "AAAA"
          }, {
            "class" : "IN",
            "data" : "2406:da00:ff00::b849:ab0e",
            "name" : "www.elastic.co",
            "ttl" : 59,
            "type" : "AAAA"
          }, {
            "class" : "IN",
            "data" : "2406:da00:ff00::ccec:d96c",
            "name" : "www.elastic.co",
            "ttl" : 59,
            "type" : "AAAA"
          } ],
          "answers_count" : 3,
          "authorities_count" : 0,
          "flags" : {
            "authoritative" : false,
            "recursion_allowed" : true,
            "recursion_desired" : true,
            "truncated_response" : false
          },
          "id" : 26078,
          "op_code" : "QUERY",
          "question" : {
            "class" : "IN",
            "name" : "www.elastic.co",
            "type" : "AAAA"
          },
          "response_code" : "NOERROR"
        },
        "method" : "QUERY",
        "count" : 1,
        "client_ip" : "your_client_server_ip",
        "proc" : "",
        "transport" : "udp",
        "status" : "OK",
        "ip" : "8.8.8.8",
        "client_port" : 52505,
        "client_server" : "",
        "port" : 53,
        "@timestamp" : "2016-11-13T15:33:43.500Z",
        "type" : "dns",
        "query" : "class IN, type AAAA, www.elastic.co",
        "client_proc" : "",
        "beat" : {
          "hostname" : "your_client_server_hostname",
          "name" : "your_client_server_hostname"
        },
        "bytes_in" : 32,
        "bytes_out" : 116,
        "@version" : "1",
        "host" : "your_client_server_hostname",
        "tags" : [ "beats_input_raw_event" ]
      }
    ...
    ...
    } ]
  }
}

如果您的输出显示总命中数为 0,则 Elasticsearch 没有在您搜索的索引下加载任何 Packetbeat 数据,您应该在几秒钟后重试,因为可能需要很短的时间才能获取数据。 如果您在等待后仍然没有看到任何结果,请检查您的设置是否有错误。 确保您已将 Packetbeat 的配置文件指向您传输过来的证书,因为如果路径不正确,这将静默失败。

收到预期输出后,您可以继续下一步,学习如何使用 Kibana 查看网络流量的一些图表。

第 5 步 — 使用 Kibana 可视化数据

当您在要为其收集系统统计信息的所有服务器上设置完 Packetbeat 后,让我们看看 Kibana。

在网络浏览器中,转到您的 ELK 服务器的域名或公共 IP 地址。 输入您的 ELK 服务器的凭据后,您应该会看到您的 Kibana Discover 页面。

注意:您在先决条件教程中为 Kibana 配置用户时配置了这些凭据。


单击页面顶部的 设置 选项卡。 现在,从界面左侧的Index Patterns菜单中选择packetbeat-*,并将其设置为默认索引:

然后选择屏幕顶部的 Discover 选项卡以查看此数据。 您将在屏幕上看到以下内容:

在这里,您可以通过过滤可用字段来查看各种 Packetbeat 条目。 您可以单击这些字段来添加它们,或使用聚合(计数、总和、最小值、最大值、中值等)将它们可视化。

Kibana 还提供了广泛的可视化功能,您可以使用它们来分析数据。 单击屏幕顶部的 Visualize 选项卡以列出可视化或打开已保存的可视化。

接下来,让我们查看在本教程开始时加载的示例 Packetbeat 仪表板。 单击屏幕顶部的 Dashboard 选项卡,然后单击屏幕右侧的 Load Saved Dashboard 图标。 您将看到仪表板过滤器列表作为分页建议:

从建议列表中选择 Packetbeat-Dashboard。 由于我们的索引中只有几个 Web 请求作为文档,因此仪表板将导致 No results found 用于 DB、缓存、RPC 事务或其他结果。

但是,如果您向下滚动,您将看到从您安装 Packetbeat 的客户端服务器收集的各种指标。

从这里您可以创建基于索引数据的图表。 例如,您可以创建一个图表来显示基于响应时间的 HTTP 查询细分,这有助于跟踪来自您的 Web 应用程序的缓慢响应。 您可以通过使用子聚合来深入了解每个代码、访问的域等的响应时间。

您可以浏览 Packetbeat 文档 以了解更多信息。

结论

现在您的系统指标通过 Elasticsearch 和 Logstash 集中,并且您可以使用 Kibana 将它们可视化,您应该能够一目了然地看到您的服务器在做什么。 从这里,您可能想要调查其他托运人,包括 Filebeat、Topbeat 等。 查看 Beats 页面以获取有关可用托运人的更多信息。