Elastic:创建Elasticsearch集群并为它们配置TLS安全通信

在之前的文章中“如何在一个机器上同时模拟多个node”,我们介绍了如何在同一个机器中运行同一个Elasticsearch的安装,并创建一个多node的Elasticsearch集群。我们也在“Elastic:用Docker部署Elastic栈”文章中介绍了如何使用docker技术来创建多个node的Elasticsearch集群。在实际的应用中,我们可能需要在不同的机器中部署Elasticsearch,并让它们一起连起来组成集群。Elasticsearch其中一个重要的特点就是它的可拓展性。在今天的文章中,我们来讲述一下:

  • 部署多个节点的集群
  • 为集群之前提供安全的通信

前提条件

在今天的实验中,我使用了两个不同的机器来做我们的练习:

如上图所示,我有两台机器,其中的一个是MacOS,其IP地址是192.168.0.100。另外一台机器安装的是Ubuntu OS 20.04版本。它的IP地址是192.168.0.102。

安装

如果你还不知道如何安装Elasticsearch和Kibana的话,请参阅我之前的文章“Elastic:菜鸟上手指南”。我们分别在上面的两个机器上安装Elasticsearch及Kibana。在运行我们的Elasticsearch之前,我们先要做配置。特别是Ubuntu的这个Node。如果没有配置就直接运行,那么就会造成一个错误的信息:

Error while clustering nodes from different host/machines

也就是说之前它自己运行起来了,并创建了自己的cluster。让后我们让它去加入另外一个node去组成一个集群的话,就会出现上面的错误。

另外一个我在运行Ubuntu OS上的Elasticsearch时,我发现有这样的一个错误信息:

max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

上面的错误信息应该很明显,我们需要使用如下的命令来进行修正:

sudo sysctl -w vm.max_map_count=262144

为了能够正确地运行,我们针对这个两个机器分别做配置。

配置host名称

我们分别到MacOS及Ubuntu电脑的/etc/hosts文件里加入如下的两句:

192.168.0.100	mac
192.168.0.102	ubuntu

我们必须保证我们的这两个电脑在同一个局域网中。一旦配置成功,我们可以在MacOS的电脑中,输入如下的命令:

$ ping ubuntu
PING ubuntu (192.168.0.102): 56 data bytes
64 bytes from 192.168.0.102: icmp_seq=0 ttl=64 time=0.593 ms
64 bytes from 192.168.0.102: icmp_seq=1 ttl=64 time=0.930 ms
64 bytes from 192.168.0.102: icmp_seq=2 ttl=64 time=0.832 ms

很显然,我们在MacOS的电脑中可以看到Ubuntu电脑。同样的我们也可以在Ubuntu电脑中ping到MacOS的电脑。

Elasticsearch配置

根据文章中的介绍,在我们平时的开发中,我们很多时候是使用开发模式,也就是我们把Elasticsearch绑定于自己机器的localhost。显然在production模式下这个是不适用的。要加入集群,Elasticsearch节点必须可以通过transport通信到达。 要通过non-loopback地址加入群集,节点必须将传输绑定到non-loopback地址,并且不能使用single-node discovery。 因此,如果Elasticsearch节点无法通过non-loopback地址与另一台机器形成集群,则认为该节点处于开发模式,如果它可以通过non loopback地址加入集群,则该节点处于生产模式。

请注意,可以通过http.host和transport.host独立配置HTTP和传输。 这对于将单个节点配置为可通过HTTP进行访问以进行测试(而不触发生产模式)很有用。

Elasticsearch 配置 - MacOS

我们使用自己喜欢的编辑器打开在Elasticsearch安装目录下的config/elasticsearch.yml文件

cluster.name: elasticsearch
node.name: node2
network.host: _site_
discovery.seed_hosts: ["mac"]
cluster.initial_master_nodes: ["node2"]

在这里,我们取一个叫做elasticsearch的集群。该node的名称为node2。我们把network.host设置为_site_则表明elasticsearch将绑定于电脑所在的本地地址上。针对我们的情况就是192.168.0.100。在上面我们也配置了discover.seed_hosts 为 "mac"。请参照上一节“配置host名称”中的介绍。它会解析出来192.168.0.100。我们设置cluster.initial_master_nodes为和node.name一样的配置。请参阅Elastic的官方文档

Elasticsearch 配置 - Ubuntu OS

按照同样的方法,我们对Ubuntu OS中Elasticsearch的config/elasticsearch.yml文件进行如下的配置:

cluster.name: elasticsearch
node.name: node1
network.host: _site_
discovery.seed_hosts: ["mac"]
cluster.initial_master_nodes: ["node1"]

特别指出的是,我们在这里设置discovery.seed_hosts为“mac”。

Kibana 配置

由于我们使用了私用地址,我们需要对Kibana中的一些配置做一些修改,否认它访问不到我们的Elasticsearch。我们打开config/kibana.yml文件:

server.host: "192.168.0.100"
elasticsearch.hosts: ["http://192.168.0.100:9200"]

启动集群

我们按照如下的顺来启动集群:

  1. 在MacOS上的Elasticsearch
  2. 在Ubuntu OS上的Elasticsearch
  3. 在MacOS上的Kibana

我们可以在MacOS master node里看到如下的信息:

我们打开Kibana,然后,查看我们的集群:

GET _cat/nodes?v

上面显示我们有两个node的集群。其中master是node2。Hooray,我们终于有了第一个分布于不同机器的集群。

我们接下来来查看我们集群的健康状况:

GET _cluster/health

上面显示我们有两个data node。器状态是green的。

为node之间的通信加密

我们知道node之间的通信是通过Transport模块来进行的。它们之间的通信可以通过加密而得到更加安全的保护。为此,Elastic为这个transport配置了安全的设置。

Elasticsearch配置 - MacOS 

我们在Elasticsearch的安装目录中打入如下的命令来生产根证书:

./bin/elasticsearch-certutil cert

我们把生产的证书保存于config子目录中:

$ pwd
/Users/liuxg/elastic/elasticsearch-7.6.2
liuxg:elasticsearch-7.6.2 liuxg$ ls config/
elastic-certificates.p12 jvm.options              roles.yml
elasticsearch.keystore   log4j2.properties        users
elasticsearch.yml        role_mapping.yml         users_roles

从上面可以看出来,我们已经在config子目录下生成了一个可以使用的叫做elastic-certificates.p12的证书。接下来我们需要运用这个证书来配置我们的Elasticsearch。我们可以参阅官方文档。打开config/elasticsearch.yml文件,并把如下的配置加入到文件的后面:

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

我们重新启动Elasticsearch。由于我们已经启动了安全的设置,我们必须为Elasticsearch设置密码。我们可以参考我之前的文章“Elasticsearch:设置Elastic账户安全”。我们在另外一个terminal中输入如下的命令:

./bin/elasticsearch-setup-passwords interactive

你可以选择你自己喜欢的密码。针对我的情况,为了方便,我都设置为123456。

Elasticsearch配置 - Ubuntu OS

 我们必须把在MacOS上生产的证书拷入到Ubuntu OS中的Elasticsearch中。证书elastic-certificates.p12将被放入同样的位置config子目录中。我们可以按照如下的命令来进行拷贝:

scp ./config/elastic-certificates.p12 liuxg@ubuntu:/home/liuxg/elastic/elasticsearch-7.6.2/config

请注意上面的在ubuntu机器中的路径和你的安装路径应该不同。你需要做相应的修改。这样在Ubuntu机器上的文件显示为:

我们同样启动Elasticsearch。

在我们的MacOS机器上,我们可以看到:

node1已经成功地加入到集群里。

这时候,如果我们在Ubuntu OS的机器里尝试使用如下的命令来设置密码的话:

./bin/elasticsearch-setup-passwords interactive

它将会告诉我们如下的错误信息:

$ ./bin/elasticsearch-setup-passwords interactive
future versions of Elasticsearch will require Java 11; your Java version from [/usr/lib/jvm/java-8-openjdk-amd64/jre] does not meet this requirement

Failed to authenticate user 'elastic' against http://192.168.0.102:9200/_security/_authenticate?pretty
Possible causes include:
 * The password for the 'elastic' user has already been changed on this cluster
 * Your elasticsearch node is running against a different keystore
   This tool used the keystore at /home/liuxg/elastic/elasticsearch-7.6.2/config/elasticsearch.keystore

ERROR: Failed to verify bootstrap password

上面标明Ubuntu OS上的Elasticsearh的安全配置已经跟随MacOS上的Elasticsearch设置的密码。我们尝试使用如下的命令来访问这个Elasticsearch:

$ curl -u "elastic:123456" http://ubuntu:9200
{
  "name" : "node1",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "fylS-jtjRRSeJlTCW1UN8Q",
  "version" : {
    "number" : "7.6.2",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
    "build_date" : "2020-03-26T06:34:37.794943Z",
    "build_snapshot" : false,
    "lucene_version" : "8.4.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

显然我们的用户名及密码是成功的。

配置Kibana

由于我们已经加入了安全,我们需要对Kibana的配置config/kibana.yml重新进行修改:

elasticsearch.username: "kibana"
elasticsearch.password: "123456"

打开Kibana,我们重新查看一下我们的Elasticsearch集群的健康状况:

好了。经过这样的设置后,我们集群里的node之前的通信就变得更加安全了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章