k8s搭建evk日志系统

截止本文时间,elasticsearch 最新版已经是 8.1 版本,但是粗略看了下 8.1 版本的文档,好像比 7.x 要麻烦些,然而 7.x 一直用着感觉挺好,所以先不研究 8.x 版本了,本文的 elasticsearch 和 kibana 均使用 7.17.2 版本

一、部署 elasticsearch 集群

众所周知,elasticsearch 默认没有开启权限认证,而 kibana 的登录认证功能也是使用的 elasticsearch 本身的权限,所以默认搭建好的 kibana 是公开的,谁都可以直接访问所有内容。而要开启权限认证,集群节点之间就必须要使用证书通信,除非采用单节点模式。

1. 创建 es 集群证书

开启权限认证后的 es 集群节点之间通信需要证书加密,在正式部署开始之前,需要准备好证书文件,elasticsearch 本身自带证书生成工具,所以启动一个 elasticsearch 的 docker 镜像进去创建证书。

# 运行docker容器交互模式
docker run -it docker.elastic.co/elasticsearch/elasticsearch:7.17.2 /bin/bash

# 创建CA证书(一路回车)
# CA(Certificate Authority),即证书颁发机构,用来对CE证书进行签名。也就是说要创建CE证书,就要有一张自己的CA证书。
/usr/share/elasticsearch/bin/elasticsearch-certutil ca

# 创建CE证书(一路回车)
# CE(Certificate),CE证书每个节点保留一份。
/usr/share/elasticsearch/bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12

证书文件创建好了,现在要把证书文件从 docker 容器中复制出来。先保持之前的容器继续运行,打开一个新的终端后执行下面的步骤。

# 查找之前容器的信息
docker ps | grep elasticsearch
...
4e257187c487   docker.elastic.co/elasticsearch/elasticsearch:7.17.2   "/bin/tini -- /usr/l…"   32 minutes ago   Up 32 minutes   9200/tcp, 9300/tcp   sweet_agnesi
...

# 将证书文件复制到本机当前目录下,4e257187c487是之前容器的ID
docker cp 4e257187c487:/usr/share/elasticsearch/elastic-stack-ca.p12 .
docker cp 4e257187c487:/usr/share/elasticsearch/elastic-certificates.p12 .

你也许已经注意到了,在生成 CE 证书的时候,并没有将证书与特定主机 IP 绑定,也就是说这张 CE 证书 elastic-certificates.p12 在 Elasticsearch 集群中具有通用性,那么我们只需要将这张证书传到所有节点指定目录下就行了。 证书文件请自己做好备份,如果设置了密钥,也一并备份保管好。

2. 将证书添加到 k8s

# 可以一次性添加多个文件,这里把CA证书一并添加进去了
kubectl create secret generic elastic-certificates --from-file=elastic-certificates.p12 --from-file=elastic-stack-ca.p12 -n qixiasdk

3. k8s 部署 elasticsearch 集群

重点说一下,每个节点需要将证书文件以 subPath 的方式挂载到/usr/share/elasticsearch/config/目录下,别的目录不行。 elasticsearch 的配置项全部以环境变量的方式进行配置,关于用户权限和证书的配置项有以下几个。 实际使用时应该只需要 CE 证书就可以了,CA 证书只是用来颁发 CE 证书用的。

xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: /etc/elasticsearch/config/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: /etc/elasticsearch/config/elastic-certificates.p12

4. 创建用户

elasticsearch 集群部署运行成功后,需要进入容器内部创建用户,随便进入集群中的一个节点就行。

# 方式一:生成随机密码
bin/elasticsearch-setup-passwords auto
# 方式二:手动设置密码
bin/elasticsearch-setup-passwords interactive

一般使用随机密码就行了,运行指令后,会输出一批用户名和密码,复制下来保存好即可

Changed password for user apm_system
PASSWORD apm_system = EzZYAHCef9A625N1kTbR

Changed password for user kibana_system
PASSWORD kibana_system = ZB0AjMvYBcHdzEaiRePK

Changed password for user kibana
PASSWORD kibana = ZB0AjMvYBcHdzEaiRePK

Changed password for user logstash_system
PASSWORD logstash_system = 1UnQsTlN7EVvMip42xdY

Changed password for user beats_system
PASSWORD beats_system = jLGnIy89prbXiahbDgbO

Changed password for user remote_monitoring_user
PASSWORD remote_monitoring_user = VzIJXFzsdsqNfw7YEI4k

Changed password for user elastic
PASSWORD elastic = mLXl8tGNPhYfsmyxgNiK

5. 重装、迁移和备份

生产环境中难免会遇到重装 es 集群或迁移服务器,如果只是简单加载以前的 data 数据会发现无法设置 es 账号密码,因为有个隐藏的[.security-7]索引里面记录了有关安全方面的设置,7 是代表 es 的大版本号。 这时候需要先停用 es 安全设置,删掉这个索引,再打开安全设置,才能设置密码。

首先编辑配置文件或环境变量关掉安全开关,应用 k8s 配置文件,等待 StatefulSet 挨个重启

xpack.security.enabled: false
xpack.security.transport.ssl.enabled: false

全部重启后随便进入一个容器,在集群中删除索引

# es默认账号elastic,默认密码changeme
curl -XDELETE -u elastic:changeme http://localhost:9200/.security-7

然后启用上面的两个安全开关,应用 k8s 配置文件,等待 StatefulSet 挨个重启,之后就可以设置密码了。

由于账号比较多,而我们实际使用的账号一般只有 elastic 和 kibana_system 两个,那可以先用命令行工具全部生成随机密码,然后使用新生成的 elastic 账号密码来修改 kibana_system 的密码。

# 生成随机密码,从中找到elastic的新密码
bin/elasticsearch-setup-passwords auto

# 修改kibana_system的密码
curl -u elastic:8EjWIe3aMnMQqF5Muumf \
  -XPUT "http://localhost:9200/_xpack/security/user/kibana_system/_password?pretty" \
  -H 'Content-Type: application/json' \
  -d '{"password": "ZB0AjMvYBcHdzEaiRePK"}'

最后登录 kibana 里面去管理其他用户的账号密码就好了。

6. 附可能用到的其他指令

# k8s拷贝证书到本机
kubectl cp qixiasdk/elasticsearch-node-0:/usr/share/elasticsearch/elastic-certificates.p12 ./elastic-certificates.p12
kubectl cp qixiasdk/elasticsearch-node-0:/usr/share/elasticsearch/elastic-stack-ca.p12 ./elastic-stack-ca.p12

# linux校验文件完整性
md5sum elastic-certificates.p12
md5sum elastic-stack-ca.p12

# mac校验文件完整性
md5 elastic-certificates.p12
md5 elastic-stack-ca.p12

# 测试ES账号密码是否正确(运行指令后会要求输入密码)
curl -u kibana_system 'http://localhost:9200/_xpack/security/_authenticate?pretty'

# 批量删除已停止运行的容器(-a和-q列出所有容器的ID,rm不加-f参数不会强制删除正在运行的容器)
docker rm $(docker ps -a -q)