单节点ELK日志系统容器化实战:30分钟极速部署指南
一、准备
1. 版本选择
Elastic在2019年5月发布的Elasticsearch 6.8.0(6.x系列的最后一个次要版本)和2019年6月发布的Elasticsearch 7.1.0(7.x系列的第一个次要版本)中,将基础安全功能从商业版(X-Pack Security)开源,纳入默认发行版(即开源版)。
这些开源免费的安全功能包括:
-
身份认证:支持用户名/密码登录(如
elastic超级用户); -
角色-based访问控制(RBAC) :允许创建角色(定义权限集合)和用户(分配角色);
-
索引级权限控制:限制用户对特定索引的操作(如读、写、管理);
-
Transport层SSL加密:节点间通信加密(保障集群内部安全);
-
Kibana集成:Kibana支持通过ES的安全功能实现登录验证和权限控制(如限制用户访问Kibana的某些功能或索引数据)。
Kibana作为Elastic Stack的可视化组件,其对安全功能的支持依赖于Elasticsearch的配置。当ES启用开源安全功能后,Kibana需完成以下配置(以6.8.0/7.1.0及以上版本为例):
-
连接ES的认证配置:在
kibana.yml中设置ES的用户名和密码(如elastic用户),确保Kibana能正常连接ES; -
启用Kibana安全功能:通过
xpack.security.enabled: true启用Kibana的登录验证(用户需输入ES的用户名/密码登录Kibana); -
管理界面支持:Kibana的管理(Management) → 安全(Security) 界面会显示用户(Users) 和角色(Roles) 选项,允许管理员创建/编辑用户、定义角色权限(如索引级读/写权限)。
本次选用ES 8.x,默认启用安全功能(包括SSL和身份认证),无需额外配置xpack.security.enabled: true;在6.8.0之前,开源版需使用第三方插件(如Search Guard、ReadonlyREST)实现权限控制,但这些插件非官方,且可能有收费或功能限制;
2. 服务器准备
Rocky Linux release 9.4,内核:5.14.0-284.30.1.el9_2.x86_64,CentOS7.9也经过实验可行,4C 8G的环境即可,如果资源充足,可以设置高一些,随着接入日志的增多,cpu的压力会逐步增大。磁盘20G系统盘+100G数据盘,建议区分,后续实验会修改容器的数据路径,如果只有单盘,注意不要修改容器的数据路径
二、基础环境配置
1. 磁盘逻辑卷(按需)
##磁盘分区
[root@iv-ydyqlal98gvr6ol8w9rt ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
vda 253:0 0 40G 0 disk
├─vda1 253:1 0 200M 0 part /boot/efi
└─vda2 253:2 0 39.8G 0 part /
vdb 253:16 0 200G 0 disk
##GPT分区,单盘可达到2T以上空间,MBR类型,单盘最大2T
##进入交互页面后,(parted)后面为输入的命令
[root@iv-ydyqlal98gvr6ol8w9rt ~]# parted /dev/vdb
GNU Parted 3.5
Using /dev/vdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) mklabel gpt
(parted) mkpart primary 0% 100%
(parted) print
Model: Virtio Block Device (virtblk)
Disk /dev/vdb: 215GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 1049kB 215GB 215GB primary
(parted) quit
Information: You may need to update /etc/fstab.
##逻辑卷配置,安装依赖
[root@iv-ydyqlal98gvr6ol8w9rt ~]# yum install lvm2 -y
##创建物理卷
[root@iv-ydyqlal98gvr6ol8w9rt ~]# pvcreate /dev/vdb1
[root@iv-ydyqlal98gvr6ol8w9rt ~]# pvdisplay /dev/vdb1
##创建卷组
[root@iv-ydyqlal98gvr6ol8w9rt ~]# vgcreate vg_data /dev/vdb1
[root@iv-ydyqlal98gvr6ol8w9rt ~]# vgdisplay vg_data
##创建逻辑卷,并分配卷组全部空间
[root@iv-ydyqlal98gvr6ol8w9rt ~]# lvcreate -l 100%VG -n lv_data vg_data
[root@iv-ydyqlal98gvr6ol8w9rt ~]# lvdisplay /dev/vg_data/lv_data
##文件系统格式化,这里格式化成了xfs,其他类型的也可以
[root@iv-ydyqlal98gvr6ol8w9rt ~]# mkfs.xfs /dev/vg_data/lv_data
##创建挂载点
[root@iv-ydyqlal98gvr6ol8w9rt ~]# mkdir /data
##挂载逻辑卷
[root@iv-ydyqlal98gvr6ol8w9rt ~]# mount /dev/vg_data/lv_data /data
##检查挂载
[root@iv-ydyqlal98gvr6ol8w9rt ~]# lsblk
[root@iv-ydyqlal98gvr6ol8w9rt ~]# df -hT
##设置开机自启,使用UUID方式,先获取分区的UUID信息
[root@iv-ydyqlal98gvr6ol8w9rt ~]# blkid /dev/vg_data/lv_data
/dev/vg_data/lv_data: UUID="a7b24d84-ed96-4eb5-b66a-626dcbe53ca6" TYPE="xfs"
##替换UUID,免交互写入开机自启配置文件
[root@iv-ydyqlal98gvr6ol8w9rt ~]# tee -a /etc/fstab <<EOF
UUID=a7b24d84-ed96-4eb5-b66a-626dcbe53ca6 /data xfs defaults 0 0
EOF
[root@iv-ydyqlal98gvr6ol8w9rt ~]# cat /etc/fstab
##检查挂载情况
[root@iv-ydyqlal98gvr6ol8w9rt ~]# mount -a
##逻辑卷检查
[root@iv-ydyqlal98gvr6ol8w9rt ~]# lvs
[root@iv-ydyqlal98gvr6ol8w9rt ~]# vgs
[root@iv-ydyqlal98gvr6ol8w9rt ~]# pvs
2. 系统参数调整
##免交互写入配置文件
[root@iv-ydyqlal98gvr6ol8w9rt ~]# tee -a /etc/sysctl.conf <<EOF
kernel.pid_max = 3276800
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_orphan_retries = 0
net.ipv4.tcp_abort_on_overflow = 0
net.core.netdev_max_backlog=32768
kernel.softlockup_panic=1
kernel.softlockup_all_cpu_backtrace=1
vm.max_map_count=262144
fs.file-max = 500000
EOF
#检查配置文件信息,如有缺失,尽量补齐,至少包含下面的这些非注释的文件
[root@iv-ydyqlal98gvr6ol8w9rt ~]# cat /etc/sysctl.conf
# sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).
vm.swappiness = 0
kernel.sysrq = 1
net.ipv4.neigh.default.gc_stale_time = 120
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 1024
net.ipv4.tcp_synack_retries = 2
net.ipv4.neigh.*.gc_stale_time = 120
net.ipv4.conf.*.rp_filter = 0
net.ipv4.conf.*.arp_announce = 2
kernel.pid_max = 3276800
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_orphan_retries = 0
net.ipv4.tcp_abort_on_overflow = 0
net.core.netdev_max_backlog=32768
kernel.softlockup_panic=1
kernel.softlockup_all_cpu_backtrace=1
vm.max_map_count=262144
fs.file-max = 500000
##配置文件生效操作
[root@iv-ydyqlal98gvr6ol8w9rt ~]# sysctl -p
3. 安装docker环境
##关闭防火墙和selinux
[root@iv-ydyqlal98gvr6ol8y3fi yum.repos.d]# setenfore 0
[root@iv-ydyqlal98gvr6ol8y3fi yum.repos.d]# getenforce
Disabled
[root@iv-ydyqlal98gvr6ol8y3fi yum.repos.d]# systemctl stop firewalld
[root@iv-ydyqlal98gvr6ol8y3fi yum.repos.d]# systemctl status firewalld
○ firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; preset: enabled)
Active: inactive (dead)
Docs: man:firewalld(1)
##yum更新
[root@iv-ydyqlal98gvr6ol8w9rt ~]# yum update
##移除旧的docker
[root@iv-ydyqlal98gvr6ol8w9rt ~]# yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
##安装所需的软件包。
##yum-utils 提供了 yum-config-manager
##device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2
[root@iv-ydyqlal98gvr6ol8w9rt ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
##添加docker的yum源
[root@iv-ydyqlal98gvr6ol8w9rt ~]# ls /etc/yum.repos.d/docker-ce.repo
ls: cannot access '/etc/yum.repos.d/docker-ce.repo': No such file or directory
[root@iv-ydyqlal98gvr6ol8w9rt ~]# yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
Repository baseos is listed more than once in the configuration
Repository appstream is listed more than once in the configuration
Repository extras is listed more than once in the configuration
Adding repo from: http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
##更新yum缓存
[root@iv-ydyqlal98gvr6ol8w9rt ~]# yum makecache
#安装docker-ce
[root@iv-ydyqlal98gvr6ol8w9rt ~]# yum install docker-ce \
docker-ce-cli \
containerd.io \
docker-compose-plugin
##安装指定版本的docker-ce
[root@iv-ydyqlal98gvr6ol8w9rt ~]# yum list docker-ce --showduplicates | sort -r
[root@iv-ydyqlal98gvr6ol8w9rt ~]# yum list docker-ce-cli --showduplicates | sort -r
[root@iv-ydyqlal98gvr6ol8w9rt ~]# yum install docker-ce-3:24.0.7-1.el9 docker-ce-cli-1:24.0.7-1.el9 containerd.io -y
##启动docker服务并开机自启
[root@iv-ydyqlal98gvr6ol8w9rt ~]# systemctl start docker
[root@iv-ydyqlal98gvr6ol8w9rt ~]# systemctl enable docker
[root@iv-ydyqlal98gvr6ol8w9rt ~]# systemctl status docker
[root@iv-ydyqlal98gvr6ol8w9rt ~]# docker -v
[root@iv-ydyqlal98gvr6ol8w9rt ~]# docker version
[root@iv-ydyqlal98gvr6ol8w9rt ~]# docker info
在这里可以切换为其他yum源,如清华源,不做介绍

4. 配置docker加速
配置加速,一是可以提升镜像下载速度:默认情况下,Docker从官方镜像仓库(Docker Hub)下载镜像。但是由于网络的限制或地理位置的原因,有时候从官方仓库下载镜像的速度可能会较慢。配置镜像加速器可以将镜像下载源切换到国内的镜像站点,从而加快镜像下载速度,提高开发和部署效率。二是解决访问限制问题:有些时候,访问官方仓库可能会受到网络的限制,例如在某些特殊环境下无法正常访问国外网站。配置镜像加速器可以解决这样的问题,通过使用国内的镜像站点,避免了对官方仓库的直接访问,确保能够正常下载和使用镜像。
修改docker数据存放文件,可以避免在系统默认根目录下产生大文件,尽量放到数据盘去,默认路径是在/var/lib/docker。
#配置docker加速
[root@iv-ydyqlal98gvr6ol8w9rt ~]# cd /etc/docker/
[root@iv-ydyqlal98gvr6ol8w9rt docker]# tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://dockerproxy.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.nju.edu.cn",
"https://e7n1ndig.mirror.aliyuncs.com"
],
"data-root": "/data/docker"
}
EOF
[root@iv-ydyqlal98gvr6ol8w9rt docker]# cat /etc/docker/daemon.json
#重载docker
[root@iv-ydyqlal98gvr6ol8w9rt docker]# systemctl daemon-reload
[root@iv-ydyqlal98gvr6ol8w9rt docker]# systemctl restart docker
5. 安装docker-compose
docker-compose作为编排工具,可以提高容器的维护效率,使用docker run启动容器的时候,需要携带大量的参数,通过docker-compose,将相关参数都写入配置文件,一条简单的命令就可以将容器拉起来,实现和docker run一样的效果,更加高效便捷,当然也可以在一个composer文件中维护所有的ELK组件,一次性拉起所有服务,本次实验分开来介绍,不放在一个文件中。
#-L,跟随重定向;-o,指定下载文件的保存路径和名称
[root@iv-ydyqlal98gvr6ol8w9rt ~]# curl -L "https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
[root@iv-ydyqlal98gvr6ol8w9rt ~]# chmod +x /usr/local/bin/docker-compose
[root@iv-ydyqlal98gvr6ol8w9rt ~]# ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
[root@iv-ydyqlal98gvr6ol8w9rt ~]# docker-compose version
6. 环境备份
基础环境安装好后,虚拟机环境的话,尽量做个快照,有个兜底保障措施。后面elk跑起来接入日志之前,也可以再打一个快照。
三、部署ELK
1. 创建docker网络
通过docker run运行的容器和docker-compose运行的容器会有使用网络上的不一样,因此尽量创建一个容器网络,将所有容器都纳入到这个网络中,实现容器之间的通信。
##创建容器网络
[root@iv-ydyqlal98gvr6ol8w9rt ~]# docker network create -d bridge elastic
##罗列现在的容器网络
[root@iv-ydyqlal98gvr6ol8w9rt ~]# docker network ls
##查看网络的详细信息
[root@iv-ydyqlal98gvr6ol8w9rt ~]# docker inspect elastic
2. 部署elasticsearch
##建立存放yml文件的目录,存放启动elasticsearch容器的yml文件以及es的配置文件
[root@iv-ydyqlal98gvr6ol8w9rt ~]# mkdir /data/elasticsearch
##启动ES,生成通用的配置
##第一次执行脚本不要加-d这个参数,否则看不到服务首次运行时生成的随机密码和随机enrollment token
[root@iv-ydyqlal98gvr6ol8w9rt ~]# docker run -it \
-p 9200:9200 \
-p 9300:9300 \
--name elasticsearch \
--net elastic \
-e ES_JAVA_OPTS="-Xms1g -Xmx1g" \
-e LANG=C.UTF-8 \
-e LC_ALL=C.UTF-8 \
elasticsearch:8.4.3

docker run后将当前终端的这些信息复制保存下来,这个里面包含了密码、token信息等关键信息,token有效期30min,过时需要重新生成。
✅ Elasticsearch security features have been automatically configured!
✅ Authentication is enabled and cluster connections are encrypted.
ℹ️ Password for the elastic user (reset with `bin/elasticsearch-reset-password -u elastic`):
N--EmhbbCCuwiORXVzds ##注意此处为密码
ℹ️ HTTP CA certificate SHA-256 fingerprint:
aa08b7d2010abef765ed66cac97ae9f9eb6b98bb472853753de38fef83f0599c ##CA证书相关
ℹ️ Configure Kibana to use this cluster:
• Run Kibana and click the configuration link in the terminal when Kibana starts.
• Copy the following enrollment token and paste it into Kibana in your browser (valid for the next 30 minutes): ##token信息
eyJ2ZXIiOiI4LjQuMyIsImFkciI6WyIxNzIuMTguMC4yOjkyMDAiXSwiZmdyIjoiYWEwOGI3ZDIwMTBhYmVmNzY1ZWQ2NmNhYzk3YWU5ZjllYjZiOThiYjQ3Mjg1Mzc1M2RlMzhmZWY4M2YwNTk5YyIsImtleSI6IlhISTJ4SmNCSE0zRG9fZWh6WTRyOi1jdVE0anQyVHdpQ3ZJNE9yMTBrTncifQ==
ℹ️ Configure other nodes to join this cluster:
• Copy the following enrollment token and start new Elasticsearch nodes with `bin/elasticsearch --enrollment-token <token>` (valid for the next 30 minutes):
eyJ2ZXIiOiI4LjQuMyIsImFkciI6WyIxNzIuMTguMC4yOjkyMDAiXSwiZmdyIjoiYWEwOGI3ZDIwMTBhYmVmNzY1ZWQ2NmNhYzk3YWU5ZjllYjZiOThiYjQ3Mjg1Mzc1M2RlMzhmZWY4M2YwNTk5YyIsImtleSI6IlduSTJ4SmNCSE0zRG9fZWh6WTRwOnUzam5DbTRUU0ZpZjhiMF81MUMtZFEifQ==
If you're running in Docker, copy the enrollment token and run:
`docker run -e "ENROLLMENT_TOKEN=<token>" docker.elastic.co/elasticsearch/elasticsearch:8.4.3`
##拷贝容器内的配置文件
[root@iv-ydyqlal98gvr6ol8w9rt ~]# cd /data/elasticsearch/
[root@iv-ydyqlal98gvr6ol8w9rt ~]# docker cp elasticsearch:/usr/share/elasticsearch/config /data/elasticsearch/
[root@iv-ydyqlal98gvr6ol8w9rt ~]# docker cp elasticsearch:/usr/share/elasticsearch/data /data/elasticsearch/
[root@iv-ydyqlal98gvr6ol8w9rt ~]# docker cp elasticsearch:/usr/share/elasticsearch/plugins /data/elasticsearch/
[root@iv-ydyqlal98gvr6ol8w9rt ~]# docker cp elasticsearch:/usr/share/elasticsearch/logs /data/elasticsearch/
[root@iv-ydyqlal98gvr6ol8w9rt ~]# ls
##得到容器的相关数据后,就可以删除容器了,crtc+c 结束es容器输出,或新开一个终端
[root@iv-ydyqlal98gvr6ol8w9rt ~]# docker stop elasticsearch
[root@iv-ydyqlal98gvr6ol8w9rt ~]# docker rm -f elasticsearch
[root@iv-ydyqlal98gvr6ol8w9rt ~]# docker ps -a
##配置yml文件,elasticsearch.yml
##增加:xpack.monitoring.collection.enabled: true
##说明:添加这个配置以后在kibana中才会显示联机状态,否则会显示脱机状态
##注释最后一行master节点信息,在docker-composer里面会体现
[root@iv-ydyqlal98gvr6ol8w9rt ~]# cd /data/elasticsearch/config/
[root@iv-ydyqlal98gvr6ol8w9rt ~]# cp elasticsearch.yml elasticsearch.yml.bak
[root@iv-ydyqlal98gvr6ol8w9rt ~]# vim elasticsearch.yml

##配置docker-compose并启动es
[root@iv-ydyqlal98gvr6ol8w9rt ~]# cd /data/elasticsearch/
[root@iv-ydyqlal98gvr6ol8w9rt ~]# vim docker-compose.yml
version: '3'
networks:
elastic:
external: true
services:
elasticsearch:
image: elasticsearch:8.4.3
container_name: elasticsearch
restart: always
logging:
driver: json-file
options:
max-size: 200m
max-file: 3
environment:
- LANG=C.UTF-8
- LC_ALL=C.UTF-8
- bootstrap.memory_lock=true
- "discovery.type=single-node"
- "ES_JAVA_OPTS=-Xms2g -Xmx2g"
volumes:
- /data/elasticsearch/config:/usr/share/elasticsearch/config
- /data/elasticsearch/data:/usr/share/elasticsearch/data
- /data/elasticsearch/plugins:/usr/share/elasticsearch/plugins
- /data/elasticsearch/logs:/usr/share/elasticsearch/logs
ports:
- 9200:9200
- 9300:9300
networks:
- elastic
##上述配置文件写完保持退出后,启动es容器
[root@iv-ydyqlal98gvr6ol8w9rt ~]# docker-compose up -d --build
[root@iv-ydyqlal98gvr6ol8w9rt ~]# docker ps
[root@iv-ydyqlal98gvr6ol8w9rt ~]# docker inspect elasticsearch
访问宿主机ip地址,访问测试,要使用https协议:https://192.168.1.2:9200/_cluster/health?pretty,用户名就是:elastic,密码在第一次启动时保存下来的信息中查找,状态为green,表示节点运行正常。


docker inspect的信息如下,主要是看容器的网络信息

3. 部署kibana
##拉取镜像
[root@iv-ydyqlal98gvr6ol8w9rt ~]# docker pull kibana:8.4.3
[root@iv-ydyqlal98gvr6ol8w9rt ~]# docker images
##第一次执行,不要有参数 -d ,否则看不见初始化链接
[root@iv-ydyqlal98gvr6ol8w9rt ~]# docker run -it \
--restart=always \
--log-driver json-file \
--log-opt max-size=100m \
--log-opt max-file=2 \
--net elastic \
--name kibana \
-p 5601:5601 \
kibana:8.4.3

初始化,访问url地址,url地址粘贴输出的内容,包括后面的code信息,0.0.0.0换成宿主机ip。登陆kibana,粘贴es的token信息,如果超过了30分钟,token需要重新生成。
重新生成token的方法:在textarea中填入之前elasticsearch生成的相关信息,注意这个token只有30分钟的有效期,如果过期了只能进入容器重置token,进入容器执行 bin/elasticsearch-create-enrollment-token -s kibana --url "https://127.0.0.1:9200"
##进入容器
docker exec -it elasticsearch /bin/bash
##注意,这里选择es主节点,且ip不能是宿主机的ip,进入后,直接拷贝下面的命令,生成token信息
elasticsearch@739be64915f0:~$ bin/elasticsearch-create-enrollment-token -s kibana --url "https://127.0.0.1:9200"

web访问kibana的地址后,粘贴第一次生成token信息



这个验证码信息,在kibana容器的终端显示,直接拿过来粘贴

粘贴验证码后,初始化成功

继续后面的操作
##创建目录及拷贝文件
[root@iv-ydyqlal98gvr6ol8w9rt ~]# mkdir /data/kibana
[root@iv-ydyqlal98gvr6ol8w9rt ~]# cd /data/kibana
[root@iv-ydyqlal98gvr6ol8w9rt ~]# docker cp kibana:/usr/share/kibana/config /data/kibana/
[root@iv-ydyqlal98gvr6ol8w9rt ~]# docker cp kibana:/usr/share/kibana/data /data/kibana/
[root@iv-ydyqlal98gvr6ol8w9rt ~]# docker cp kibana:/usr/share/kibana/plugins /data/kibana/
[root@iv-ydyqlal98gvr6ol8w9rt ~]# docker cp kibana:/usr/share/kibana/logs /data/kibana/
##修改配置文件
##增加:i18n.locale: "zh-CN",中文翻译
##增加:server.publicBaseUrl信息,去掉正式的界面提示,这里写kibana宿主机的地址
##其他配置是使用token初始化生成的,不需要改动!!!
##增加初始化页面提示的部分,总共修改2处
[root@iv-ydyqlal98gvr6ol8w9rt kibana]# vim config/kibana.yml
### >>>>>>> BACKUP START: Kibana interactive setup (2024-02-28T10:19:30.247Z)
#
# ** THIS IS AN AUTO-GENERATED FILE **
#
# Default Kibana configuration for docker target
#server.host: "0.0.0.0"
#server.shutdownTimeout: "5s"
#elasticsearch.hosts: [ "http://elasticsearch:9200" ]
#monitoring.ui.container.elasticsearch.enabled: true
### >>>>>>> BACKUP END: Kibana interactive setup (2024-02-28T10:19:30.247Z)
i18n.locale: "zh-CN"
# This section was automatically generated during setup.
server.host: 0.0.0.0
server.shutdownTimeout: 5s
#设置SERVER_PUBLICBASEURL,避免访问页面一直弹出修改建议,使用宿主机内网地址
server.publicBaseUrl: "http://10.11.4.2:5601"
#这个ip一定是elasticsearch的容器ip,可使用docker inspect | grep -i ipaddress,初始化kibana生成,不需要更改
elasticsearch.hosts: ['https://172.19.0.2:9200']
monitoring.ui.container.elasticsearch.enabled: true
#以下信息是刚才初始化kibana健全配置后自动生成的,如果没有说明之前初始化失败了
elasticsearch.serviceAccountToken: AAEAAWVsYXN0aWMva2liYW5hL2Vucm9sbC1wcm9jZXNzLXRva2VuLTE3MDkxMTU1Njg3MDE6bVZYQlE0c3FTVXFTc2VCMmYwQXU5dw
##自动生成的,不需要更改
elasticsearch.ssl.certificateAuthorities: [/usr/share/kibana/data/ca_1709115570238.crt]
##ca_trusted_fingerprint参数,为es第一次执行一串输出中的值,不需要修改
xpack.fleet.outputs: [{id: fleet-default-output, name: default, is_default: true, is_default_monitoring: true, type: elasticsearch, hosts: ['https://172.18.0.2:9200'], ca_trusted_fingerprint: e924551c1453c893114a05656882eea81cb11dd87c1258f83e6f676d2428f8f2}]

删除容器,创建docker-compose,并启动容器
##删除
[root@iv-ydyqlal98gvr6ol8w9rt ~]# docker stop kibana
[root@iv-ydyqlal98gvr6ol8w9rt ~]# docker rm kibana
##创建compose文件
[root@iv-ydyqlal98gvr6ol8w9rt kibana]# vim docker-compose.yml
version: '3'
networks:
elastic:
external: true
services:
kibana:
image: kibana:8.4.3
container_name: kibana
restart: always
logging:
driver: json-file
options:
max-size: 200m
max-file: 3
ports:
- "5601:5601"
volumes:
- /data/kibana/config:/usr/share/kibana/config
- /data/kibana/data:/usr/share/kibana/data
- /data/kibana/plugins:/usr/share/kibana/plugins
- /data/kibana/logs:/usr/share/kibana/logs
networks:
- elastic
##启动容器
[root@iv-ydyqlal98gvr6ol8w9rt ~]# docker-compose up -d --build
[root@iv-ydyqlal98gvr6ol8w9rt ~]# docker ps
[root@iv-ydyqlal98gvr6ol8w9rt ~]# docker inspect kibana

登陆kibana,输入用户名:elastic,密码:第一次启动elasticsearch保存的密码


配置账号和密码


4. 部署logstash
##拉镜像
[root@iv-ydyqlal98gvr6ol8w9rt ~]# docker pull logstash:8.4.3
##第一次启动,获取相关配置信息
[root@iv-ydyqlal98gvr6ol8w9rt ~]# docker run -it \
-d \
--name logstash \
-p 9600:9600 \
-p 5044:5044 \
--net elastic \
logstash:8.4.3
[root@iv-ydyqlal98gvr6ol8w9rt ~]# docker ps
##拷贝配置数据
[root@iv-ydyqlal98gvr6ol8w9rt ~]# mkdir /data/logstash
[root@iv-ydyqlal98gvr6ol8w9rt ~]# docker cp logstash:/usr/share/logstash/config /data/logstash/
[root@iv-ydyqlal98gvr6ol8w9rt ~]# docker cp logstash:/usr/share/logstash/pipeline /data/logstash/
##拷es证书
[root@iv-ydyqlal98gvr6ol8w9rt ~]# cp -rf /data/elasticsearch/config/certs /data/logstash/config/certs
[root@iv-ydyqlal98gvr6ol8w9rt ~]# chown -R 1000:1000 /data/logstash
##修改logstash.yml,原文件内容简单,可以直接删除,用下面内容替换,注意esip为容器的ip,需要提前看下es的ip信息,使用docker inspect elasticsearch检查
[root@iv-ydyqlal98gvr6ol8w9rt config]# vim logstash.yml
http.host: "0.0.0.0"
xpack.monitoring.enabled: true
xpack.monitoring.elasticsearch.hosts: [ "https://172.19.0.2:9200" ]
xpack.monitoring.elasticsearch.username: "elastic"
xpack.monitoring.elasticsearch.password: "sKXqRsR5CoedDJY*zl3B" ##第一次启动elasticsearch是保存的信息中查找
xpack.monitoring.elasticsearch.ssl.certificate_authority: "/usr/share/logstash/config/certs/http_ca.crt"
xpack.monitoring.elasticsearch.ssl.ca_trusted_fingerprint: "4e25896dbc39bfb0678fd658b25c1a596f6202bf5e04d8dadd9862979dcc44e4" #第一次启动elasticsearch是保存的信息中查找
##修改配置文件logstash.conf,日志接收、过滤、处理类配置文件
##要严格注意格式
[root@iv-ydyqlal98gvr6ol8w9rt ~]# cd /data/logstash/pipeline
[root@iv-ydyqlal98gvr6ol8w9rt pipeline]# cp logstash.conf logstash.conf.bak
[root@iv-ydyqlal98gvr6ol8w9rt pipeline]# vim logstash.conf
input {
beats {
port => 5044
}
}
filter {
date {
match => [ "@timestamp", "yyyy-MM-dd HH:mm:ss Z" ]
target => "@timestamp"
}
json {
source => "message"
}
mutate {
remove_field => ["@version", "agent", "cloud", "host", "input", "log", "tags", "_index", "_source", "ecs", "event"]
}
}
output {
elasticsearch {
hosts => ["https://172.19.0.2:9200"]
index => "jituan-%{[system_type]}-%{[fields][system_module]}-%{+YYYY-MM-dd}"
ssl => true
ssl_certificate_verification => false
cacert => "/usr/share/logstash/config/certs/http_ca.crt"
ca_trusted_fingerprint => "4e25896dbc39bfb0678fd658b25c1a596f6202bf5e04d8dadd9862979dcc44e4"
user => "elastic"
password => "sKXqRsR5CoedDJY*zl3B"
}
}
##删除logstash容器
[root@iv-ydyqlal98gvr6ol8w9rt pipeline]# docker ps
[root@iv-ydyqlal98gvr6ol8w9rt pipeline]# docker stop logstash
[root@iv-ydyqlal98gvr6ol8w9rt pipeline]# docker rm logstash
##编写docker-compose文件
[root@iv-ydyqlal98gvr6ol8w9rt logstash]# vim docker-compose.yml
version: '3'
networks:
elastic:
external: true
services:
logstash:
image: logstash:8.4.3
container_name: logstash8.4.3
hostname: logstash
restart: always
logging:
driver: json-file
options:
max-size: 500m
max-file: 3
ports:
- 9600:9600
- 5044:5044
volumes:
- /data/logstash/config/:/usr/share/logstash/config/
- /data/logstash/pipeline/:/usr/share/logstash/pipeline/
networks:
- elastic
##启动容器
[root@iv-ydyqlal98gvr6ol8w9rt logstash]# docker-compose up -d --build
[root@iv-ydyqlal98gvr6ol8w9rt logstash]# docker ps
至此,elk核心组件已经部署完成,各组件部署完成,并启动后,使用docker ps检查下容器运行时间是否正常,有异常的容器,需要使用docker logs检查下报错信息。
四、应用接入
1. 安装filebeat
因源端来源不一,不建议使用容器部署filebeat
##下载安装
[root@iv-ydyqlal98gvr6ol8w9rt ~]# curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.17.1-x86_64.rpm
[root@iv-ydyqlal98gvr6ol8w9rt ~]# rpm -iUvh filebeat-7.17.1-x86_64.rpm
##修改配置文件
[root@iv-ydyqlal98gvr6ol8w9rt ~]# cd /etc/filebeat/
[root@iv-ydyqlal98gvr6ol8w9rt ~]# cp filebeat.yml filebeat.yml.bak
[root@iv-ydyqlal98gvr6ol8w9rt ~]# >filebeat.yml
[root@iv-ydyqlal98gvr6ol8w9rt ~]# vim filebeat.yml
fields:
system_type: "test-node"
fields_under_root: true
filebeat.inputs:
- type: log
access:
enabled: true
paths:
- /usr/weaver/ecology/log/ecology
close_rename: true
tail_files: true
multiline.pattern: '^\d{4}-\d{2}-\d{2}'
multiline.negate: true
multiline.match: "after"
fields:
system_module: "ecology"
- type: log
access:
enabled: true
paths:
- /usr/weaver/ecology/log/integration/integration.log
close_rename: true
tail_files: true
multiline.pattern: '^\d{4}-\d{2}-\d{2}'
multiline.negate: true
multiline.match: "after"
fields:
system_module: "integration"
filebeat.config:
modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
reload.period: 10s
setup.ilm.enabled: false
output.logstash:
enabled: true
hosts: ["10.11.4.2:5044"]
logging.to_files: true
close_older: 30m
force_close_files: false
close_inactive: 1m
close_timeout: 3h
clean_inactive: 72h
ignore_older: 70h
max_procs: 1
queue.mem.events: 256
queue.mem.flush.min_events: 128
##注意,上述将system_type做为了一个全局配置,如果改成非全局模式,对应的logstash配置文件中也要修改,位置为logstash.conf,中的output中的index信息
##启动filebeat
[root@iv-ydyqlal98gvr6ol8w9rt ~]# systemctl restart filebeat.service
[root@iv-ydyqlal98gvr6ol8w9rt ~]# systemctl status filebeat.service
2. kibana检查
登陆kibana的页面,在索引管理页面内,可以看到已经接入过来的索引信息

五、总结
单节点模式,部署快捷,能快速投入使用,但也存在很多风险,并不建议大规模生产环境使用,主要问题有:
1. 单点风险:一旦某个组件崩溃,整个环境将无法使用,因此生产实践中,logstash和es都是多节点集群模式;
2. 消息丢失:当前的ELFK架构,并不具备消息保持的功能,一旦elk环境异常,在恢复异常的这段时间内,所有的推送过来的日志将都会丢失,这在生产实践中是不能容忍的,因此生产实践中,往往会再接入一层消息中间件,比如kafka集群,这样即便elk异常,也能确保日志数据不会丢失。
更多推荐
所有评论(0)