ELK 8.8.1 + Kafka 2.5.0 日志收集架构部署

ELK 8.8.1 + Kafka 2.5.0 日志收集架构部署

  • 服务版本
  • 节点角色分布
  • 服务兼容性
  • JDK 特殊性
  • 官方文档库
  • 系统优化
  • 部署 ES 集群
    • 1. 下载 ES 源码包
    • 2. 调整配置文件 \$ES\_HOME/config/elasticsearch.yml
    • 3. 调整配置文件 \$ES\_HOME/config/jvm.option
    • 4. 将配置文件分发至所有节点,并进行配置调整
    • 5. 启动 ES 集群
    • 6. 验证 ES 集群状态
  • 部署 ES 插件 ES-Head
  • 部署 Filebeat
    • 1. 查看 Kafka 集群状态
    • 2. 下载 Filebeat 源码包
    • 3. 调整配置文件 \$FILEBEAT\_HOME/filebeat.yml
      • 4. 启动 Filebeat
    • 5. 验证 Filebeat
  • 部署 Logstach
    • 1. 下载 Logstach 源码包
    • 2. 调整配置文件 \$LOGSTACH\_HOME/conf/pipelines.yml
    • 3. 创建配置文件 /data/service/elk/logstash/conf.d/system-log.conf
    • 4. 启动 Logstach
    • 5. 验证 Logstach
  • 部署 Kibana
    • 1. 下载 Kibana 源码包
    • 2. 调整配置文件 \$KIBANA\_HOME/config/kibana.yml
    • 3. 启动 Kibana
    • 4. 验证 Kibana
  • 添加安全策略
    • 安全策略等级概述
    • ES 版本差异
    • ES 集群配置
      • 1. 创建密钥及证书存放路径
      • 2. 生成密钥文件
      • 3. 为密钥文件生成证书
      • 4. 将密钥及证书复制至所有节点
      • 5. 调整配置文件 \$ES\_HOME/config/elasticsearch.yml
      • 6. 为密钥文件生成证书
      • 7. 重启并配置 ES 相关密码
      • 8. 重启并验证 ES-Head
    • Kibana 配置
      • 1. 调整配置文件 \$KIBANA\_HOME/config/kibana.yml
      • 2. 创建 Kibana 的密钥库
      • 3. 将 ES 密钥写入 Kibana 密钥库
      • 4. 重启并查看 Kibana 状态

服务版本

服务名称 服务版本
JDK 1.8.0_322
Elasticsearch 8.8.1
Logstash 8.8.1
Filebeat 8.8.1
Kibana 8.8.1
Kafka 2.5.0
ZooKeeper 3.5.7

节点角色分布

主机名 IP 地址 承载角色
redis1 10.10.10.21 Elasticsearch Master \ Elasticsearch Worker \ Filebeat \ Logstash \ Kibana
redis2 10.10.10.22 Elasticsearch Master \ Elasticsearch Worker
redis3 10.10.10.23 Elasticsearch Master \ Elasticsearch Worker
hadoop1 10.10.10.131 Kafka Broker \ ZooKeeper Server
hadoop2 10.10.10.132 Kafka Broker \ ZooKeeper Server
hadoop3 10.10.10.133 Kafka Broker \ ZooKeeper Server

服务兼容性

  • 官方提供了服务的兼容性清单。主要分为:与操作系统、与 JVM、与 Kubernetes、与浏览器、ELK 服务之间和 Logstash 插件
  • 具体地址为:https://www.elastic.co/cn/support/matrix#matrix\_compatibility

JDK 特殊性

  • 在所下载的 elasticsearch.tar.gz 包中,都包含有 jdk 文件夹。可直接使用此 jdk 文件夹中的 jdk 版本
  • 通过如下方式,可确定 tar 包中的具体 jdk 信息
cat $ES_HOME/jdk/release
IMPLEMENTOR="Oracle Corporation"
JAVA_VERSION="20.0.1"
JAVA_VERSION_DATE="2023-04-18"
LIBC="gnu"
MODULES="java.base java.compiler java.datatransfer java.xml java.prefs java.desktop java.instrument java.logging java.management java.security.sasl java.naming java.rmi java.management.rmi java.net.http java.scripting java.security.jgss java.transaction.xa java.sql java.sql.rowset java.xml.crypto java.se java.smartcardio jdk.accessibility jdk.internal.jvmstat jdk.attach jdk.charsets jdk.zipfs jdk.compiler jdk.crypto.ec jdk.crypto.cryptoki jdk.dynalink jdk.internal.ed jdk.editpad jdk.hotspot.agent jdk.httpserver jdk.incubator.concurrent jdk.incubator.vector jdk.internal.le jdk.internal.opt jdk.internal.vm.ci jdk.internal.vm.compiler jdk.internal.vm.compiler.management jdk.jartool jdk.javadoc jdk.jcmd jdk.management jdk.management.agent jdk.jconsole jdk.jdeps jdk.jdwp.agent jdk.jdi jdk.jfr jdk.jlink jdk.jpackage jdk.jshell jdk.jsobject jdk.jstatd jdk.localedata jdk.management.jfr jdk.naming.dns jdk.naming.rmi jdk.net jdk.nio.mapmode jdk.random jdk.sctp jdk.security.auth jdk.security.jgss jdk.unsupported jdk.unsupported.desktop jdk.xml.dom"
OS_ARCH="x86_64"
OS_NAME="Linux"
SOURCE=".:git:a0bfbb14e326"

官方文档库

  • Elasticsearsh 8.8.1: https://www.elastic.co/guide/en/elasticsearch/reference/index.html

系统优化

  • 如下优化操作,须在所有 Elasticsearch 节点上都完成
  • 官方系统优化建议:https://www.elastic.co/guide/en/elasticsearch/reference/current/setting-system-settings.html
# 关闭防火墙并取消开机自启
systemctl stop firewalld &&systemctl disable firewalld

# 查看当前防火墙服务状态
systemctl status firewalld

# 检查 iptable 规则
iptables -nL

# 若发现已配置 iptable 规则,可通过如下方式进行清除
# 清除预设表 filter中的所有规则链的规则
iptables -F

# 清除预设表 filter 中使用者自定链中的规则
iptables -X

# 关闭 Selinux
# 调整配置文件后,需重启系统才能生效
cp /etc/selinux/config /etc/selinux/config.bkup
sed -i 's/^SELINUX=.*/SELINUX=disable/' /etc/selinux/config
cat /etc/selinux/config

# 检查 Selinux 状态
getenforce

# 创建普通用户
# 由于 ES 和 Kibana 无法通过 root 用户启动,所以必须提前添加普通用户
useradd es && useradd kibana

# 添加普通用户密码
echo "es" |passwd --stdin es && echo "kibana" |passwd --stdin kibana

# 调整用户最大文件数、进程数和最大锁定内存地址空间
# 官方的文件数建议为 65535,线程数建议为 4096
# 使用默认配置会触发报错信息:"max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]"
cp /etc/security/limits.conf /etc/security/limits.conf.bkup
cat > /etc/security/limits.conf << EOF
* soft nofile 6553537
* hard nofile 6553538
* soft nproc 6553539
* hard nproc 6553540
* soft memlock unlimited
* hard memlock unlimited
EOF
cat /etc/security/limits.conf

# 禁用 swap
# 禁用 /etc/fstab 文件中的 swap 挂载配置
swapoff -a
cp /etc/fstab /etc/fstab.bkup
sed -i '/^[^#].*swap/s/^/#/' /etc/fstab
cat /etc/fstab

# 调整 vm.swappiness 配置
# 需设置为,在正常情况下不使用 swap,当系统整体资源紧张时可使用 swap
cp /etc/sysctl.conf /etc/sysctl.conf.bkup
echo "vm.swappiness=1" > /etc/sysctl.conf

# ES默认使用 mmapfs 目录存储其索引
# mmap 的默认配置对于 ES 而言可能过低,会导致内存不足异常
# 使用默认配置会触发报错信息:"max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]"
echo "vm.max_map_count=262144" > /etc/sysctl.conf

# 降低 TCP 重传超时
# Linux 默认的重传配置为 15 次,约 900 秒。对于 ES 而言,此时间过长,无法使 ES 能够更快速地通过集群的机制完成重新分配丢失分片、重新选举新主节点等自我修复工作
echo "net.ipv4.tcp_retries2=5" > /etc/sysctl.conf

# 非官方建议优化项
# 一个布尔类型的标志,控制着当有很多的连接请求时内核的行为。启用的话,如果服务超载,内核将主动地发送 RST 包
echo "net.ipv4.tcp_abort_on_overflow=1" > /etc/sysctl.conf

# web 应用中 listen 函数的 backlog 默认会给我们内核参数的 net.core.somaxconn 限制到 128
echo "net.core.somaxconn = 2048" > /etc/sysctl.conf

# 重新加载内核参数
sysctl -p

部署 ES 集群

1. 下载 ES 源码包

# 创建服务目录
mkdir -p /data/service/elk/elasticsearch/{tmp,data1,data2,data3,logs,jvm}
mkdir -p /data/service/elk/elasticsearch/jvm/{tmp,dump,logs}

# 下载 Elasticsearch 安装包
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.8.1-linux-x86_64.tar.gz -P /data/service/elk/elasticsearch/
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.8.1-linux-x86_64.tar.gz.sha512 -P /data/service/elk/elasticsearch/

# 确定所下载 Elasticsearch 安装包完整性
shasum -a 512 -c /data/service/elk/elasticsearch/elasticsearch-8.8.1-linux-x86_64.tar.gz.sha512

# 解压 Elasticsearch 安装包
tar -zxvf /data/service/elk/elasticsearch/elasticsearch-8.8.1-linux-x86_64.tar.gz /data/service/elk/elasticsearch/

# 调整安装包权限
chown -R es:es /data/service/elk/elasticsearch

# 将目录分发至所有节点
scp -r -p /data/service/elk root@redis2:/data/service/
scp -r -p /data/service/elk root@redis3:/data/service/

# 配置环境变量
cat >> /etc/profile << EOF

# Elasticsearch 8.8.1 2023-06-12
export ES_HOME=/data/service/elk/elasticsearch/elasticsearch-8.8.1
export PATH=$PATH:$ES_HOME/bin:$ES_HOME/lib
EOF

# 刷新配置文件
source /etc/profile

2. 调整配置文件 $ES_HOME/config/elasticsearch.yml

# 备份原始配置文件
cp $ES_HOME/config/elasticsearch.yml $ES_HOME/config/elasticsearch.yml.bkup

# 配置 elasticsearch.yml 文件
cat > $ES_HOME/config/elasticsearch.yml << EOF
# 集群名称
cluster.name: es-test

# 实例名称,默认为主机名
node.name: node1

# 指定实例角色
# 角色分为:master主节点\master, voting_only仅投票主节点\data数据节点\data_hot热数据节点\data_warn暖数据节点\data_cold冷数据节点\ingest采集节点等
node.roles: [ master, data ]

# 指定数据目录路径
path.data: /data/service/elk/elasticsearch/data1,/data/service/elk/elasticsearch/data2,/data/service/elk/elasticsearch/data3

# 指定日志目录路径
path.logs: /data/service/elk/elasticsearch/logs

# 指定 IP 地址,默认为 127.0.0.1
network.host: 10.10.10.21

# 指定访问端口,默认为 9200
http.port: 9200

# 指定内部通讯端口,默认为 9300
transport.port: 9300

# 指定ES集群发现实例初始列表
discovery.seed_hosts: ["10.10.10.21:9300","10.10.10.22:9300","10.10.10.23:9300"]

# 初始的候选 master 实例列表
# 默认为主机名。须与 node.name 保持一致
# 此配置只在第一次启动时有效,后续重启时将被忽略
cluster.initial_master_nodes: ["node1","node2","node3"]

# 锁定物理内存地址。避免使用 swap 分区
# 须在配置此参数时,完成系统层面的配置优化。否则会引起报错:"memory locking requested for elasticsearch process but memory is not locked"
bootstrap.memory_lock: true

# 关闭安全模式,否则需要配置TSL认证
xpack.security.enabled: false

# 启动跨域连接
http.cors.enabled: true
http.cors.allow-origin: "*"
EOF

3. 调整配置文件 $ES_HOME/config/jvm.option

# 备份原始配置文件
cp $ES_HOME/config/jvm.options $ES_HOME/config/jvm.options.bkup

# 配置 jvm.options 文件
cat > $ES_HOME/config/jvm.options << EOF
# JVM 配置
# JVM 默认为 4GB
# JVM 大小建议为整体实例物理内存的一半,另一半预留给底层的 Lucene
# 由于内存指针压缩的原因,不建议将内存大小调整为 32GB 或更高。若物理内存高于 32GB,则可分割为多个 Elasticsearch 实例
# 建议预先获取的内存大小与最大值相同
-Xms1g
-Xmx1g

# GC 配置
# GC 处理器默认为 G1
-XX:+UseG1GC
-Djava.io.tmpdir=/data/service/elk/elasticsearch/jvm/tmp
-XX:+HeapDumpOnOutOfMemoryError
-XX:+ExitOnOutOfMemoryError
-XX:HeapDumpPath=/data/service/elk/elasticsearch/jvm/dump
-XX:ErrorFile=/data/service/elk/elasticsearch/jvm/logs/hs_err_pid%p.log
+XX:+PrintGCDetails
-Xlog:gc*,gc+age=trace,safepoint:file=/data/service/elk/elasticsearch/jvm/logs/gc.log:utctime,level,pid,tags:filecount=10,filesize=100m
EOF

4. 将配置文件分发至所有节点,并进行配置调整

scp -pr $ES_HOME/config.yml root@redis2:$ES_HOME
scp -pr $ES_HOME/config root@redis3:$ES_HOME

# redis2
sed -i 's/^node.name:.*/node.name: node2/' $ES_HOME/config/elasticsearch.yml
sed -i 's/^network.host:.*/network.host: 10.10.10.22/' $ES_HOME/config/elasticsearch.yml

# redis3
sed -i 's/^node.name:.*/node.name: node3/' $ES_HOME/config/elasticsearch.yml
sed -i 's/^network.host:.*/network.host: 10.10.10.23/' $ES_HOME/config/elasticsearch.yml

5. 启动 ES 集群

  • 在内部测试环境中,可能会由于网络问题导致无法正常启动。只需再次尝试重启即可
# redis1
su - es
cd $ES_HOME
bin/elasticsearch -d

# redis2
su - es
cd $ES_HOME
bin/elasticsearch -d

# redis3
su - es
cd $ES_HOME
bin/elasticsearch -d

6. 验证 ES 集群状态

# 查看每个实例状态
# 若 cluster_name 显示为空,或者未显示为所设置的 Cluster 名称,则说明配置存在异常
curl http://10.10.10.21:9200
{
  "name" : "node1",
  "cluster_name" : "es-test",
  "cluster_uuid" : "OKMi6WrSRf-Vgk_oz-oqJQ",
  "version" : {
    "number" : "8.8.1",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "f8edfccba429b6477927a7c1ce1bc6729521305e",
    "build_date" : "2023-06-05T21:32:25.188464208Z",
    "build_snapshot" : false,
    "lucene_version" : "9.6.0",
    "minimum_wire_compatibility_version" : "7.17.0",
    "minimum_index_compatibility_version" : "7.0.0"
  },
  "tagline" : "You Know, for Search"
}

curl http://10.10.10.22:9200
{
  "name" : "node2",
  "cluster_name" : "es-test",
  "cluster_uuid" : "OKMi6WrSRf-Vgk_oz-oqJQ",
  "version" : {
    "number" : "8.8.1",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "f8edfccba429b6477927a7c1ce1bc6729521305e",
    "build_date" : "2023-06-05T21:32:25.188464208Z",
    "build_snapshot" : false,
    "lucene_version" : "9.6.0",
    "minimum_wire_compatibility_version" : "7.17.0",
    "minimum_index_compatibility_version" : "7.0.0"
  },
  "tagline" : "You Know, for Search"
}

curl http://10.10.10.23:9200
{
  "name" : "node3",
  "cluster_name" : "es-test",
  "cluster_uuid" : "OKMi6WrSRf-Vgk_oz-oqJQ",
  "version" : {
    "number" : "8.8.1",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "f8edfccba429b6477927a7c1ce1bc6729521305e",
    "build_date" : "2023-06-05T21:32:25.188464208Z",
    "build_snapshot" : false,
    "lucene_version" : "9.6.0",
    "minimum_wire_compatibility_version" : "7.17.0",
    "minimum_index_compatibility_version" : "7.0.0"
  },
  "tagline" : "You Know, for Search"
}

# 实例状态查看
# 在 master 字段中,* 表示 master 节点
curl http://10.10.10.21:9200/_cat/nodes?v
ip          heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
10.10.10.21           39          37   3    0.31    0.23     0.12 dm        -      node1
10.10.10.23           66          24   4    0.07    0.36     0.20 dm        *      node3
10.10.10.22           44          24   5    0.47    0.54     0.26 dm        -      node2

# 集群状态查看
# 在 status 字段中,green 表示正常
curl http://10.10.10.21:9200/_cluster/health?pretty
{
  "cluster_name" : "es-test",
  "status" : "green",
  "timed_out" : false,
  "number_of_nodes" : 3,
  "number_of_data_nodes" : 3,
  "active_primary_shards" : 24,
  "active_shards" : 49,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 0,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 100.0
}

部署 ES 插件 ES-Head

# 下载 nodjs 安装包
wget https://nodejs.org/dist/v12.17.0/node-v12.17.0-linux-x64.tar.xz -P /data/service/elk/elasticsearch/

# 解压 tar 包
tar -xvJf /data/service/elk/elasticsearch/node-v12.17.0-linux-x64.tar.xz /data/service/elk/elasticsearch/

# 配置环境变量
cat >> /etc/profile << EOF
# Node 12.17.0 2023-06-12
export NODE_HOME=/data/service/node/node-v12.17.0-linux-x64
export PATH=$JAVA_HOME/bin:$NODE_HOME/bin:$PATH
EOF

# 刷新配置
source /etc/profile

# 验证 nodjs 是否生效
node -v

# 下载 es-head 安装包
wget https://github.com/mobz/elasticsearch-head/archive/master.zip -P /data/service/elk/elasticsearch/

# 解压 tar 包
unzip /data/service/elk/elasticsearch/elasticsearch-head-master.zip

# 安装 es-head 插件
cd /data/service/elk/elasticsearch/elasticsearch-head-master/
npm install

# 运行 es-head 插件
cd /data/service/elk/elasticsearch/elasticsearch-head-master/
nohup npm run start &
  • 通过浏览器登录:http://10.10.10.21:9100

部署 Filebeat

  • 如下操作只在 10.10.10.21 节点运行

1. 查看 Kafka 集群状态

# 10.10.10.131
$KAFKA_HOME/bin/kafka-topics.sh --bootstrap-server hadoop1:9092 --list

2. 下载 Filebeat 源码包

# 创建服务目录
mkdir -p /data/service/elk/filebeat

# 下载 Fliebeat 安装包
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-8.8.1-linux-x86_64.tar.gz -P /data/service/elk/filebeat
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-8.8.1-linux-x86_64.tar.gz.sha512 -P /data/service/elk/filebeat

# 确定所下载 Fliebeat 安装包完整性
shasum -a 512 -c /data/service/elk/filebeat/filebeat-8.8.1-linux-x86_64.tar.gz.sha512

# 解压 Fliebeat 安装包
tar -zxvf /data/service/elk/filebeat/filebeat-8.8.1-linux-x86_64.tar.gz /data/service/elk/filebeat/

3. 调整配置文件 $FILEBEAT_HOME/filebeat.yml

# 备份原始配置文件
cp /data/service/elk/filebeat/filebeat-8.8.1-linux-x86_64/filebeat.yml /data/service/elk/filebeat/filebeat-8.8.1-linux-x86_64/filebeat.yml.bkup

# 配置 filebeat.yml 文件
cat > /data/service/elk/filebeat/filebeat-8.8.1-linux-x86_64/filebeat.yml << EOF
filebeat.inputs:

# 文件类型为 log
- type: log
  enabled: true

# 指定文件路径
  paths:
    - /var/log/messages

# 开启 json 文件支持
  json.keys_under_root: true
  json.overwriite_keys: true

# 在日志中增加一个字段,字段为 log_topic,值为 nginx_access,logstash 根据带有这个字段的日志存储到指定的 es 索引库
  fields:
    log_topic: system-log

# 开启日志监控,从日志的最后一行开始收集
  tail_files: true

# 指定输出到 Kafka
output.kafka:
  enabled: true

# Kafka 集群列表
  hosts: ["10.10.10.131:9092","10.10.10.132:9092","10.10.10.133:9092"]

# 指定将日志存储到 Kafka 集群的哪个 topic 中,这里的 topic 值是引用在 inputs 中定义的 fields,通过这种方式可以将不同路径的日志分别存储到不同的 topic 中
  topic: '%{[fields][log_topic]}'
  partition.round_robin:
    reachable_only: false
  required_acks: 1
  compression: gzip
  max_message_bytes: 1000000
EOF

4. 启动 Filebeat

cd /data/service/elk/filebeat/filebeat-8.8.1-linux-x86_64/
nohup ./filebeat &

5. 验证 Filebeat

  • 查看 Kafka 中是否已生成指定的 topic 并且已存入数据
# 10.10.10.131
$KAFKA_HOME/bin/kafka-topics.sh --bootstrap-server hadoop1:9092 --list
  • 由于已配置 Kafka Manager,也可通过 Kafka Manager Web UI 进行查看

部署 Logstach

  • 如下操作只在 10.10.10.21 节点运行

1. 下载 Logstach 源码包

# 创建服务目录。
mkdir -p /data/service/elk/logstach/conf.d

# 下载 Fliebeat 安装包。
wget https://artifacts.elastic.co/downloads/logstash/logstash-8.8.1-linux-x86_64.tar.gz -P /data/service/elk/logstach
wget https://artifacts.elastic.co/downloads/logstash/logstash-8.8.1-linux-x86_64.tar.gz.sha512 -P /data/service/elk/logstach

# 确定所下载 Fliebeat 安装包完整性。
shasum -a 512 -c /data/service/elk/logstach/logstash-8.8.1-linux-x86_64.tar.gz.sha512

# 解压 Fliebeat 安装包。
tar -zxvf /data/service/elk/logstach/logstash-8.8.1-linux-x86_64.tar.gz /data/service/elk/logstach/

# 配置环境变量
cat >> /etc/profile << EOF
# Logstach 8.8.1 2023-06-12
export LOGSTACH_HOME=/data/service/elk/logstash/logstash-8.8.1
export PATH=$PATH:$LOGSTACH_HOME/bin:$LOGSTACH_HOME/lib
EOF

# 刷新配置文件
source /etc/profile

2. 调整配置文件 $LOGSTACH_HOME/conf/pipelines.yml

# 备份原始配置文件。
cp $LOGSTACH_HOME/config/pipelines.yml $LOGSTACH_HOME/config/pipelines.yml.bkup

# 配置 logstash.yml 文件。
cat > $LOGSTACH_HOME/config/pipelines.yml << EOF
# 指定 pipeline 名称
- pipeline.id: pipeline-system-log

# 指定 pipeline 配置文件路径
  path.config: "/data/service/elk/logstash/conf.d/system-log.conf"
EOF

3. 创建配置文件 /data/service/elk/logstash/conf.d/system-log.conf

cat > /data/service/elk/logstash/conf.d/system-log.conf << EOF
input {
  kafka {

# Kafka 集群地址
    bootstrap_servers => ["10.10.10.131:9092,10.10.10.132:9092,10.10.10.133:9092" ]
    topics => ["system-log"]
    codec => "json"
  }
}
output {
  elasticsearch {

# ES 集群地址
    hosts => ["10.10.10.21:9200","10.10.10.22:9200","10.10.10.23:9200"]
    index => "system-log-%{+YYYY.MM.dd}"
  }
}
EOF

4. 启动 Logstach

cd $LOGSTACH_HOME
/bin/logstash -d

5. 验证 Logstach

# 10.10.10.21
curl http://10.10.10.21:9200/_cat/indices?v

部署 Kibana

  • 如下操作只在 10.10.10.21 节点运行

1. 下载 Kibana 源码包

# 创建服务目录
mkdir -p /data/service/elk/kibana

# 下载 Kibana 安装包
wget https://artifacts.elastic.co/downloads/kibana/kibana-8.8.1-linux-x86_64.tar.gz -P /data/service/elk/kibana/
wget https://artifacts.elastic.co/downloads/kibana/kibana-8.8.1-linux-x86_64.tar.gz.sha512 -P /data/service/elk/kibana/

# 确定所下载 Kibana 安装包完整性
shasum -a 512 -c /data/service/elk/kibana/kibana-8.8.1-linux-x86_64.tar.gz.sha512

# 解压 Kibana 安装包
tar -zxvf /data/service/elk/kibana/kibana-8.8.1-linux-x86_64.tar.gz.sha512 /data/service/elk/kibana/

# 调整安装包权限
chown -R kibana:kibana /data/service/elk/kibana

# 配置环境变量
cat >> /etc/profile << EOF
# Kibana 8.8.1 2023-06-12
export KIBANA_HOME=/data/service/elk/kibana/kibana-8.8.1
export PATH=$PATH:$KIBANA_HOME/bin:$KIBANA_HOME/lib
EOF

# 刷新配置文件
source /etc/profile

2. 调整配置文件 $KIBANA_HOME/config/kibana.yml

# 备份原始配置文件
cp $KIBANA_HOME/config/kibana.yml $KIBANA_HOME/config/kibana.yml.bkup

# 配置 kibana.yml 文件
cat > $KIBANA_HOME/config/kibana.yml << EOF
server.port: 5601
server.host: 10.10.10.21
server.name: kibana-test
elasticsearch.hosts: [" http://10.10.10.21:9200"," http://10.10.10.22:9200"," http://10.10.10.23:9200"]
i18n.locale: "zh-CN"
EOF

3. 启动 Kibana

  • 整体启动时间相对较慢,大约需要等待 5 分钟
  • 具体启动过程,可查看 $KIBANA_HOME 目录下的 nohup.out 文件
su - kibana
cd $KIBANA_HOME
nohup ./bin/kibana &

4. 验证 Kibana

  • 通过浏览器登录:http://10.10.10.21:5601

添加安全策略

安全策略等级概述

  • 最小化安全策略(Minimal security):最小化安全策略等级适用于本地开发。在此模式下,可以对单节点服务设置密码来提供安全防护功能,但是对于本地集群环境,需要开启 TLS,以保证节点之间通信安全
  • 基本安全策略(Basic security):
    • 最低安全配置仅适用于单节点服务,而不符合集群的最低安全要求。如果集群有多个节点,那么您必须在节点之间配置 TLS。如果您不启用 TLS,无法启动生产集群
    • 传输层依赖双向 TLS 对节点进行加密和认证。正确应用 TLS 可确保恶意节点无法加入集群并与其他节点交换数据。虽然在 HTTP 层实现用户名和密码身份验证对于保护本地集群很有用,但节点之间的通信安全需要 TLS
    • Transport 协议是 Elasticsearch 节点用于相互通信的协议的名称。此名称特定于 Elasticsearch,用于区分传输端口(默认 9300)和 HTTP 端口(默认 9200)。节点使用传输端口相互通信,REST 客户端使用 HTTP 端口与 Elasticsearch 通信
  • 基本安全策略 + https:在生产环境中,如果没有基于 HTTPS 上启用 TLS,那么部分安全功能会无法使用,比如 Token 和 API 密钥

ES 版本差异

  • ES 6.x 及以前:需手动安装安全插件 x-pack
  • ES 6.8 和 7.x 及以后:已内置 x-pack 插件,默认关闭 Security 配置
  • ES 8.x 及以后:默认开启 Security 配置

ES 集群配置

  • 此文档只进行基本安全策略配置
  • 所有操作须在普通用户 es 上运行,以保证数据的权限正常

1. 创建密钥及证书存放路径

  • ES 获取密钥及证书的默认路径为:$ES_HOME/conf
  • 若需额外指定路径,也必须是 $ES_HOME/conf 目录下的子路径
mkdir -p $ES_HOME/conf/certs

2. 生成密钥文件

# --out 指定密钥文件路径及文件名
# --pass 指定密钥文件对应密码
$ES_HOME/bin/elasticsearch-certutil ca --out $ES_HOME/conf/certs/elastic-stack-ca.p12 --pass "es"

3. 为密钥文件生成证书

# --ca 指定密钥文件路径及文件名
# --out 指定证书文件路径及文件名
# --ca-pass 指定密钥文件对应密码
# --pass 指定证书对应密码
$ES_HOME/bin/elasticsearch-certutil cert --ca $ES_HOME/conf/certs/elastic-stack-ca.p12 --out $ES_HOME/conf/certs/elastic-certificates.p12 --ca-pass "es" --pass "es"

4. 将密钥及证书复制至所有节点

scp -rp $ES_HOME/certs es@redis2:$ES_HOME/
scp -rp $ES_HOME/certs es@redis2:$ES_HOME/

5. 调整配置文件 $ES_HOME/config/elasticsearch.yml

  • 所有节点都需进行如下调整
# 备份原始配置文件
cp $ES_HOME/config/elasticsearch.yml $ES_HOME/config/elasticsearch.yml.bkup

# 配置 elasticsearch.yml 文件
# 将原先关闭的 xpack.security.enabled 参数开启
sed -i '/^[^#]*xpack.security.enabled:/s/^\(xpack.security.enabled:\s*\).*/\1true/' $ES_HOME/config/elasticsearch.yml

# 开启并添加 SSL/TLS 认证配置
cat >> $ES_HOME/config/elasticsearch.yml << EOF

# 开启 ES 的 SSL/TLS 加密
xpack.security.transport.ssl.enabled: true

# 设置 SSL/TLS 验证模式为证书验证模式
xpack.security.transport.ssl.verification_mode: certificate

# 要求客户端进行 SSL/TLS 客户端身份验证
xpack.security.transport.ssl.client_authentication: required

# 指定 SSL/TLS 密钥库的路径和文件名
xpack.security.transport.ssl.keystore.path: certs/elastic-certificates.p12

# 指定 SSL/TLS 信任库的路径和文件名
xpack.security.transport.ssl.truststore.path: certs/elastic-certificates.p12

# 允许跨域请求的 HTTP 请求头
# 若未安装 es-head,则无需配置此参数
http.cors.allow-headers: Authorization,X-Requested-With,Content-Length,Content-Type
EOF

6. 为密钥文件生成证书

  • 所有节点都需进行如下操作
  • 如下命令都会进入交互界面,所需键入的密码就是上述生成证书时所配置的密码
  • 若在生成密钥及证书时未设置密码,则无需进行此配置
# 在密码库中添加密钥
$ES_HOME/bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password

# 在信任库中添加密钥
$ES_HOME/bin/elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password

7. 重启并配置 ES 相关密码

  • 如下命令都会进入交互界面,共需要配置多个用户的密码
    • 超级用户 elastic : elastic
    • APM(Application Performance Monitoring,应用性能监控) 用户 apm_system : apmsystem
    • Kibana 用户 kibana_system : kibana
    • Logstash 用户 logstash_system : logstash
    • Beats 用户 beats_system : beatssystem
    • 远程监控用户 remote_monitoring_user : monitor
  • 密码长度必须超过 6 个字符
  • 在测试环境中,可将所有用户的密码设置为统一密码,便于使用
# 配置密码
$ES_HOME/bin/elasticsearch-setup-passwords interactive

# 通过密码查看 ES 信息
# -u 指定用户名和密码
curl http://10.10.10.21:9200/_cat/nodes?v -u elastic:elastic

8. 重启并验证 ES-Head

  • 通过浏览器登录:http://10.10.10.21:9100?auth\_user=elastic&auth\_password=elastic

Kibana 配置

1. 调整配置文件 $KIBANA_HOME/config/kibana.yml

# 备份原始配置文件
cp $KIBANA_HOME/config/kibana.yml $KIBANA_HOME/config/kibana.yml.bkup

# 配置 kibana.yml 文件
sed -i 's/#elasticsearch.username: "kibana_system"/elasticsearch.username: "kibana_system"/' $KIBANA_HOME/config/kibana.yml

2. 创建 Kibana 的密钥库

$KIBANA_HOME/bin/kibana-keystore create

3. 将 ES 密钥写入 Kibana 密钥库

  • 如下命令都会进入交互界面,所需键入的密码是 kibana_system 的密码
$KIBANA_HOMEbin/kibana-keystore add elasticsearch.password

4. 重启并查看 Kibana 状态

  • 通过浏览器登录:http://10.10.10.21:5601
  • 密码:elastic : elastic

你可能感兴趣的:(ELK,elk,kafka,架构)