如何在Ubuntu16.04上使用Packetbeat和ELK收集基础设施指标
介绍
Packetbeat 可让您监控 HTTP 和 MySQL 等应用程序级协议以及 DNS 和其他服务的实时网络流量。
为此,您在客户端机器上配置代理,称为“托运人”,这些代理可以嗅探和解析网络流量并将消息映射到事务。 然后,这些托运人为每个操作生成记录,并将它们发送到 Elasticsearch 或 Logstash。 获得数据后,您可以使用 Kibana 搜索、分析和可视化数据,以便您可以就您的基础架构做出明智的决策或解决问题。
在本教程中,您将配置和使用带有 ELK 堆栈的 Packetbeat 来收集和可视化基础设施指标。
先决条件
- 一台具有 4GB RAM 的 Ubuntu 16.04 服务器,配置了教程 如何在 Ubuntu 16.04 上安装 Elasticsearch、Logstash 和 Kibana 中描述的 ELK Stack 设置。 按照教程配置 ELK 堆栈并安装 Kibana 仪表板,但不要配置任何客户端计算机。
- 一台具有任意数量 RAM 的 Ubuntu 16.04 服务器,将用作客户端计算机。
- 每个服务器 具有
sudo
权限 的标准用户帐户。 您可以按照 Initial Server Setup with Ubuntu 16.04 教程设置标准帐户。
第 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 本身。 在您的客户端服务器上,确保 Beats 源列表存在。 打开文件/etc/apt/sources.list.d/beats.list
进行编辑:
sudo nano /etc/apt/sources.list.d/beats.list
如果您之前安装了托运人,则此文件可能已经包含以下行:
/etc/apt/source.list.d/beats.list
deb https://packages.elastic.co/beats/apt stable main
如果文件为空,或者该行不存在,请添加并保存文件。 然后退出编辑器。
要安装这个源,我们需要一个 GPG 密钥。 Packetbeat 使用与 Elasticsearch 相同的 GPG 密钥,我们使用以下命令安装它:
wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
现在,安装 Packetbeat 包:
sudo apt-get update sudo apt-get install packetbeat
Packetbeat 现已安装,但需要进行配置才能使用它。
第 3 步 — 在客户端上配置 Packetbeat
Packetbeat 需要知道要记录什么以及将数据发送到哪里。 让我们将其配置为连接到 ELK 服务器上的 Logstash,并定义我们希望它监视的流量类型。 我们将通过修改 Packetbeat 附带的默认配置文件来做到这一点。
在客户端服务器上,编辑 Packetbeat 配置文件:
sudo nano /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 service packetbeat restart
并配置 Packetbeat 在您的服务器重新启动时启动:
sudo update-rc.d packetbeat defaults 95 10
对您要监控的任何其他服务器重复此部分。
Packetbeat 现在应该正在侦听网络流量并将其发送到 Logstash。 让我们看看它是否有效。
第 4 步 — 测试 Packetbeat 安装
此时,您的客户端服务器上的 Packetbeat 应该将您的网络流量日志发送到您的 ELK 服务器上的 Logstash。 Logstash 应该在名为 packetbeat-YYYY.MM.DD
的带日期标记的索引中将 Packetbeat 数据加载到 Elasticsearch 中。 让我们通过在客户端机器上创建一个简单的 HTTP 请求并在 ELK 服务器上的 Elasticsearch 中查找该请求来测试它是否有效。
在您的客户端服务器上,使用 curl
向 http://www.elastic.co
发出请求。
curl http://www.elastic.co/ > /dev/null
然后,在您的 ELK 服务器上,通过使用以下命令查询 Packetbeat 索引来验证 Elasticsearch 确实在接收数据:
curl -XGET 'http://localhost:9200/packetbeat-*/_search?pretty'
您应该会看到一堆如下所示的输出:
Output{ "_index" : "packetbeat-2016.09.29", "_type" : "http", "_id" : "AVdDG6pDqHsDFrI4DAlI", "_score" : 1.0, "_source" : { "responsetime" : 80, "path" : "/", "beat" : { "hostname" : "your_client_server_hostname", "name" : "your_client_server_name" }, "direction" : "out", "port" : 80, "server" : "", "status" : "OK", "params" : "", "count" : 1, "client_port" : 52072, "client_proc" : "", "ip" : "52.38.222.131", "bytes_out" : 432, "bytes_in" : 78, "query" : "GET /", "http" : { "code" : 301, "content_length" : 178, "phrase" : "Permanently" }, "proc" : "", "client_ip" : "your_client_server_ip", "client_server" : "", "@timestamp" : "2016-09-29T15:41:07.725Z", "type" : "http", "method" : "GET", "@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 页面以获取有关可用托运人的更多信息。