ELK采集k8s日志总结(一) ElasticSearch 部署

2,669 阅读8分钟

概述

日志处理作为系统基础设施的一环,有着举足轻重的作用,一般常用ELK作为日志处理平台。ELK是ElasticSearch、Logstash、Kibana的简称,这三者是核心套件,但是随着功能的迭代和组件的更替,也出现了ELKF,其中的F指的是filebeat,也可以在ELK中加入Kafka组件,以满足复杂场景的需求,所以我们通常说的ELK泛指与之相关的各种组件

为什么要做日志采集?

当我们的系统不是很复杂的时候,假设是单机架构的系统,以一个spring boot项目为例,我们可以通过logback做日志切割,把整个服务运行过程中的日志记录到文件中,方便后续排查问题。但是这样也有很多问题,

1. 比如日志在服务器上,而开发人员才需要看日志,一般都是运维做服务器管理的,所以有些小伙伴会开发日志下载功能,方便开发人员查看。不过日志都是实时产生的,通过下载文件查看日志的做法并不具备实时性

2. 当上到分布式系统的时候,一个业务的完成流程可能由多个服务参与,日志文件也是散落在各个服务器上的,需要把日志统一到一起才方便排查问题

ELK就提供了这样的解决方案,整体的思路是通过Logstash把日志采集后,统一发到ElasticSearch,ElasticSearch是一个高效的搜索引擎,然后我们通过官方提供的Kibana UI组件,去获取ElasticSearch中的数据

下面我们来搭建一套ELK环境,全部采用Docker部署,之后采集k8s容器的日志到ES中,通过logstash处理日志,在kibana页面上查看日志。对核心点做一些总结。

资源规划

ES集群 > 3台 logstash 1台(可以和kibana共用一台)

由于通过Docker部署的,jvm参数会在容器启动的时候固定(虽然可以通过非常规手段来调整,但是一般不建议这么做),所以我们要提前规划好资源

建议每日日志在1亿左右规模的系统,由于数据量不大,用3个节点即可,每台配置4C 8G,硬盘100G

有一个非常重要的配置就是es jvm最大堆不要超过内存的一半(官方建议即使物理机内存达到128GB,也不要设置为64GB,最大设置到32GB)

建议就是ES独立部署,该机器没有其它服务抢占资源。logstash也独立部署,如果服务器资源足够,可以和kibana部署到一起

提前安装好Docker服务

ElasticSearch 部署

通过官方镜像来部署,ElasticSearch可以很容易扩容,通过集群的能力提高系统对数据的处理能力,我们部署3台节点

各个版本的镜像地址说明,参考 ELK官方 docker 镜像地址: https://www.docker.elastic.co/

服务器配置

docker pull elasticsearch:7.5.0 拉取镜像

# 创建目录
mkdir -p /data/es/data
mkdir -p /data/es/config
# 给目录授权
chmod -R 777 /data/es
# 修改配置,防止启动容器时,报错m.max_map_count[65530] likely too low。
vim /etc/sysctl.conf
# 添加
vm.max_map_count=262144 
# 启用配置:
sysctl -p

yaml配置文件和服务启动

每个节点都创建配置文件: cd /data/es/config vim es.yml

对应每个节点修改 节点名称 node.name,网关地址 network.publish_host,其它配置各个节点相同,安全验证的配置一开始要先注释掉

执行启动命令,根据实际情况调整堆大小和文件映射

docker run -e ES_JAVA_OPTS="-Xms8g -Xmx8g" -d -p 9200:9200 -p 9300:9300 -v /data/es/config/es.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /data/es/data:/usr/share/elasticsearch/data --name es elasticsearch:7.5.0 --restart=always

集群正常启动后,可以查看统计信息:

curl -XGET 'http://10.90.x.x:9200/_cluster/stats?pretty'

#集群名称
cluster.name: es-cluster
#节点名称
node.name: node-a
#是不是有资格竞选主节点
node.master: true
#是否存储数据
node.data: true
#最大集群节点数
node.max_local_storage_nodes: 10
#网关地址
network.host: 0.0.0.0
network.publish_host: 10.90.x.x
#端口
http.port: 9200
#内部节点之间沟通端口
transport.tcp.port: 9300
http.cors.enabled: true
http.cors.allow-origin: "*"
#es7.x 之后新增的配置,写入候选主节点的设备地址,在开启服务后可以被选为主节点
discovery.seed_hosts: ["10.90.x.x:9300","10.90.x.x:9300","10.90.x.x:9300"]
#es7.x 之后新增的配置,初始化一个新的集群时需要此配置来选举master,这样可以在集群启动后自己决定谁是master
cluster.initial_master_nodes: ["node-a"]
#数据存储路径
path.data: /usr/share/elasticsearch/data
#日志存储路径
path.logs: /usr/share/elasticsearch/data/logs

# 优化配置

# request cache, 默认无限制
indices.fielddata.cache.size: 30%
# 40%
# indices.breaker.fielddata.limit: 40%

# query cache,默认10%,限制为10% 属于查询缓存
# indices.queries.cache.size: 10%

# common space,默认70%
# indices.breaker.total.limit: 70%

# request agg data,默认60%
# indices.breaker.request.limit: 1%

# 写线程数设置,如果报错相关异常,可以调整这个值,默认注释
thread_pool.write.queue_size: 1000

# 启用安全验证,第一次安装的时候要注释掉
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.license.self_generated.type: basic
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: /usr/share/elasticsearch/data/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: /usr/share/elasticsearch/data/elastic-certificates.p12

# 启用监控数据配置,这样在kibana中才能查看到集群监控数据,默认注释
xpack.monitoring.collection.enabled: true
## 监控数据存储时长,标准版配置这个参数没有效果
xpack.monitoring.history.duration: 1d

其它配置

# 每个节点上允许存在的分片数量,假设现在需要在节点上存在3个分片,而设置2个就会报错
index.routing.allocation.total_shards_per_node: 2

# 分片和副本配置,下面是默认值(一般通过模板配置来做,比如匹配上的索引应用此模板的设置,可以在模板中设置索引的分片和副本数)
index.number_of_shards: 5
index.number_of_replicas: 1

到此服务就部署完成了,为了安全可以添加安全认证,这样es就不是裸奔的了

配置安全认证

进入容器,执行命令,需要输入两次密码,这里两次都输入一样的

1. bin/elasticsearch-certutil ca

会让输入一个文件名 我们输入 elastic-stack-ca.p12 之后会让输入密码,输入完成执行完毕

2. bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12

拿刚才创建的文件执行命令

类似刚才上面的步骤,先输入密码验证(elastic-stack-ca.p12), 输入一个文件名 elastic-certificates.p12 再输入一个密码,完成

此时得到两个文件

elastic-certificates.p12
elastic-stack-ca.p12

3. 再执行两个命令,需要输入2中输入的密码

bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password bin/elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password

密码会被保存到config目录下的elasticsearch.keystore文件中,这个文件如果被删除了,在执行上面的两个命令的时候会提示你创建

4. 把elastic-certificates.p12文件,elasticsearch.keystore拷贝出

elasticsearch.keystore文件复制到各个容器中,elastic-certificates.p12映射到主机目录(各个容器也要复制过去),待会配置要用到

scp -r elastic-certificates.p12 root@10.90.x.x:/data/es/data

docker cp /data/es/data/elasticsearch.keystore es-cluster:/usr/share/elasticsearch/config/ docker cp /data/es/data/elasticsearch.keystore es:/usr/share/elasticsearch/config/

5. 修改配置文件,elastic-certificates.p12 赋权777

xpack.security.enabled: true xpack.security.transport.ssl.enabled: true xpack.license.self_generated.type: basic xpack.security.transport.ssl.verification_mode: certificate xpack.security.transport.ssl.keystore.path: /usr/share/elasticsearch/data/elastic-certificates.p12 xpack.security.transport.ssl.truststore.path: /usr/share/elasticsearch/data/elastic-certificates.p12

此时,elastic-certificates.p12每个es都有了,并且赋权777,在配置文件中引用 elasticsearch.keystore也被拷贝到各个es,但是没有映射出来

下一步重启各个es

6. 初始化密码

es重启完成后,再次访问需要密码了

进入主节点的容器内,去初始化密码

bin/elasticsearch-setup-passwords interactive 需要初始化6个账户的密码,以后就用这些账户登录,当然为了方便你可以把密码设置成一样的

然后重启各个es(这里只需要去主节点初始化密码就行了)

7. kibana 配置密码

由于添加了安全认证,kibana需要配置才能连接es

elasticsearch.username: "kibana" elasticsearch.password: "之前为kibana帐户创建的密码"

修改配置文件,重启

这里要用 elastic 账户登录,用kibana账户会报403

8. 小结

证书可以复用的,这样就不必每次安装新的集群就去创建证书 总共是3个文件

elastic-certificates.p12
elastic-stack-ca.p12
elasticsearch.keystore

其中elastic-stack-ca.p12只在创建证书的容器中才存在,密码总共需要输入2次,原则上2次应该用2个密码,不过这个密码只在创建证书的时候需要,如果嫌麻烦就统一用一个也行

ES 插件离线安装

一般在es部署完成后,会安装一些插件,比如中文分词插件

插件离线安装,主要是要用文件资源路径,然后高版本不一定是用plugin命令,在bin命令下可以自己尝试命令

中文分词插件地址:https://github.com/medcl/elasticsearch-analysis-ik/

在容器中执行命令 ./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.5.0/elasticsearch-analysis-ik-7.5.0.zip

但是可能需要离线安装,把文件cp到容器中,通过命令指定文件,注意路径file:///

bin/plugin install file:///usr/local/elasticsearch/elasticsearch-head-master.zip

安装成功后,重启容器

如何查看ES安装的插件

关于这点有疑问,可能高版本自带的插件就不展示出来了,只能展示自己安装的(猜测),ES是有自带一部分插件的

http://esip地址/_cat/plugins

http://xxx:9200/_cat/plugins

三台都安装了中文分词器后,页面反馈如下

node-1 analysis-ik 7.5.0
node-2 analysis-ik 7.5.0
node-3 analysis-ik 7.5.0