构建单实例的Elasticsearch服务

原文地址

原文链接

前言

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获取kibanatoken,最后执行docker cp es:/usr/share/elasticsearch/config/certs/http_ca.crt .获取TLS证书到当前文件夹

那么此时我们有了Elasticsearch的超级管理员账号密码,以及调用其API所需的证书,和其针对kibanatoken

调用测试

正常情况我们根据文档部署完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.crtusernamepasswd都在上节中已经获得

此时我们就能得到正确返回

{
  "_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是什么。我们前面提到,要想无阻碍地curlelastic需要账号密码和证书,现在证书可以使用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地址的机器通过接口无鉴权地访问

原文地址

原文链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值