原文地址
前言
Elasticsearch 8.0
之后,默认版本的构建有些许不同,这里记录下我个人习惯方式构建的处理具体操作。首先我们选择Docker
镜像构建,方便统一配置和管理,其次我们选择Elasticsearch
+Kibana
+JavaClient
的基本结构,再者除Kibanan
外我们不将Elasticsearch
的容器接口直接对外开放,使用Nginx
代理,并只能由指定IP
地址的机器服务才可以访问,故访问不需要鉴权
构建
目前最新版本是8.9.0
,本文就以此版本为例,目前8.9版本官方文档我认为还是有一些不完善的地方。最典型的问题是,虽然文档在开头指出了
Starting in Elasticsearch 8.0, security is enabled by default. With security enabled, Elastic Stack security features require TLS encryption for the transport networking layer, or your cluster will fail to start.
但是,其实还是有不少地方的命令并没有添加证书--cacert http_ca.crt
,而且也没有相关提示。API
需要使用账号密码的认证也是同样的,很多地方没有添加也没有说明
容器部署
这里给出一般性的单实例的容器部署的docker-compose.yml
version: '3'
services:
elasticsearch:
image: 'docker.elastic.co/elasticsearch/elasticsearch:8.9.0'
restart: always
container_name: 'es'
hostname: 'es'
ports:
- '9200:9200'
volumes:
- esdata:/usr/share/elasticsearch/data
environment:
- 'discovery.type=single-node'
networks:
- elastic
kibana:
image: 'docker.elastic.co/kibana/kibana:8.9.0'
restart: always
container_name: 'kib'
hostname: 'kib'
ports:
- '5601:5601'
volumes:
- kibanadata:/usr/share/kibana/data
- kibanaconfig:/usr/share/kibana/config
networks:
- elastic
networks:
elastic:
name: elastic
volumes:
esdata:
driver: local
name: 'esdata'
kibanaconfig:
driver: local
name: 'kibanaconfig'
kibanadata:
driver: local
name: 'kibanadata'
可以通过ES_JAVA_OPTS
等选项指定JVM
的相关参数。有关于多实例的构建或者更加完善的生产构建,参考官方提供的compose.yml文件
记录信息
构建完成后,我们通过docker logs --tail 100 -f es
获取默认用户elastic
的密码,如果顺利的话,这里是可以直接拿到密码的以及各种其他的token
啥的,但是如果你没有看到,并且日志也没有报错异常退出的话。那么就需要我们手动生成一下了
使用docker exec -it es /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic
执行容器内脚本重置密码,此时即可获得账号elastic
以及刚才终端给予的密码,然后执行docker exec -it es /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token --scope kibana
获取kibana
的token
,最后执行docker cp es:/usr/share/elasticsearch/config/certs/http_ca.crt .
获取TLS
证书到当前文件夹
那么此时我们有了Elasticsearch
的超级管理员账号密码,以及调用其API
所需的证书,和其针对kibana
的token
调用测试
正常情况我们根据文档部署完elastic
,我们是不能直接根据文档调用到API
的,起码在8.9.0
之后不行,除非在配置中去掉鉴权验证
比如官方文档给到的添加文档到索引示例,
curl -X POST "localhost:9200/customer/_doc/1?pretty" -H 'Content-Type: application/json' -d'
{
"firstname": "Jennifer",
"lastname": "Walters"
}
'
这里缺少两个东西,一个是TLS
证书,一个是用户账号密码。如果希望能调用,我们需要将curl
改为
curl --cacert http_ca.crt -X POST "https://username:passwd@localhost:9200/customer/_doc/1?pretty" -H 'Content-Type: application/json' -d'
{
"firstname": "Jennifer",
"lastname": "Walters"
}
'
这里增加的三个参数http_cart.crt
、username
、passwd
都在上节中已经获得
此时我们就能得到正确返回
{
"_index": "customer",
"_id": "1",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 0,
"_primary_term": 1
}
配置nginx(可选)
这里我是为了兼顾测试环境,以及在生产环境上,该机器只能被指定机器调用所以才可以这么设计,如果小伙伴们的前提条件有所差异需要谨慎使用
下面列出nginx.conf
文件
#使用用户,需要和systemctl的启动用户保持一致,不建议使用root,这里方便起见了
user root;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
#重定向
server {
server_name kib.your_domin.com;
rewrite ^/(.*)$ https://kib.your_domin.com/$1 permanent;
}
server {
server_name elastic.your_domin.com;
rewrite ^/(.*)$ https://elastic.your_domin.com/$1 permanent;
}
# Settings for a TLS enabled server.
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name kib.your_domin.com;
ssl_certificate "/dir/kib_bundle.crt";
ssl_certificate_key "/dir/kib.key";
#else config ...
location / {
proxy_pass http://localhost:5601;
}
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
#只放行指定ip的请求
allow 8.8.8.8
deny all
#
server_name elastic.your_domin.com;
ssl_certificate "/dir/elastic_bundle.crt";
ssl_certificate_key "/dir/elastic.key";
#else config ...
location / {
proxy_pass https://localhost:9200;
proxy_ssl_trusted_certificate /dir/http_ca.crt;
proxy_set_header Authorization "Basic dXNlcm5hbWU6cGFzc3dk";
}
}
}
其他都好理解,这里说明一下dXNlcm5hbWU6cGFzc3dk
是什么。我们前面提到,要想无阻碍地curl
到elastic
需要账号密码和证书,现在证书可以使用proxy_ssl_trusted_certificate
指定,账号密码就需要使用请求头来进行指定了,一般的处理方式是将username:passwd
通过Base64
加密后传入proxy_set_header Authorization "Basic $1";
表达式即可。dXNlcm5hbWU6cGFzc3dk
就是username:passwd
的加密
初始化kibana
现在我们通过之前指定的地址端口进入kibana
,首先需要输入token
,这个在前文记录信息一节中也已经获得了
然后需要输入verification code
,我们打开日志docker logs -f kib
即可获得,如果你在日志中没有找到,那么只需要通过命令docker exec -it kib /usr/share/kibana/bin/kibana-verification-code
生成即可。如果提示成功但是你并没有在终端看到,通过>>
重定向到文件内,即可获取
登录
到这里Elasticsearch
的基本配置就完成了,你可以通过kibana
访问,也可以在指定IP
地址的机器通过接口无鉴权地访问