项目场景:

项目场景:在Linux系统下,使用容器单点部署安装elasticsearch和kibana,并给es设置安全验证。


安装步骤:

1.1创建网络

因为我们还需要部署kibana容器,因此要让es和kibana容器互联。这里先创建一个网络

# 创建一个网络:es-net
[root@localhost]# docker network create es-net

# 查看本机的网络
[root@localhost]# docker network ls

# 删除一个网络:es-net
[root@localhost]# docker network rm es-net

1.2加载elasticsearch和kibana镜像

docker pull [OPTIONS] <仓库名>:<标签>
  • 仓库名:仓库名的格式一般为<用户名>/<软件名>。对于Docker Hub,如果不指定用户名,则默认为library,即官方镜像;
  • 标签:标签是区分镜像不同版本的一个重要参数,<仓库名>:<标签>会唯一确定一个镜像。默认为latest。
[root@localhost]# docker pull elasticsearch:7.17.4
[root@localhost]# docker pull kibana:7.17.4

1.3创建es容器并挂载数据卷

1.3.1准备好要挂载到docker里面的目录和文件

[root@localhost]# mkdir -p /var/lib/docker/volumes/es-data/_data
[root@localhost]# mkdir -p /var/lib/docker/volumes/es-plugins
[root@localhost]# mkdir -p /var/lib/docker/volumes/es-config
[root@localhost]# mkdir -p /var/lib/docker/volumes/kibana-config

[root@es-config]# touch elasticsearch.yml
[root@kibana-config]# touch kibana.yml

1.3.2挂载注意事项:

1.需要保证要挂载的目录有读写权限,包括要挂载的配置文件。如果没有则用chmod 777命令
2.如果要挂载配置文件,则需要提前把配置文件内容写好,不能为空,否则可能会影响es和kibana运行。
3.如果只挂载到配置文件目录,不准备配置文件,会导致创建容器后没有配置文件。报错

elasticsearch.yml文件默认内容:

cluster.name: "docker-cluster"
network.host: 0.0.0.0

kibana.yml文件默认内容:

server.host: "0.0.0.0"
server.shutdownTimeout: "5s"
elasticsearch.hosts: [ "http://elasticsearch:9200" ]
monitoring.ui.container.elasticsearch.enabled: true

1.3.3启动容器

[root@localhost]# docker run -d \
 --name es7.17.4 -p 9200:9200 -p 9300:9300 \
 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx128m" \
 -v /var/lib/docker/volumes/es-data/_data:/usr/share/elasticsearch/data \
 -v  /var/lib/docker/volumes/es-plugins:/usr/share/elasticsearch/plugins \
 -v  /var/lib/docker/volumes/es-config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
 --privileged \
 --network es-net \
  elasticsearch:7.17.4

命令解释:

  • -e “cluster.name=es-docker-cluster”:设置集群名称
  • -e “http.host=0.0.0.0”:监听的地址,可以外网访问
  • -e “ES_JAVA_OPTS=-Xms512m -Xmx512m”:内存大小
  • -e “discovery.type=single-node”:非集群模式
  • -v /var/lib/docker/volumes/es-data/_data:挂载逻辑卷,绑定es的数据目录
  • -v /var/lib/docker/volumes/es-config/elasticsearch.yml:挂载逻辑卷,绑定es的配置文件
  • -v /var/lib/docker/volumes/es-plugins:挂载逻辑卷,绑定es的插件目录
  • –privileged:授予逻辑卷访问权
  • –network es-net :加入一个名为es-net的网络中
  • -p 9200:9200:端口映射配置

1.4创建kibana容器

[root@localhost]# docker run -d \
--name kibana17 \
-e ELASTICSEARCH_HOSTS=http://es7.17.4:9200 \  #es7.17.4是上面es容器的容器名
--network=es-net \
-p 5601:5601  \
kibana:7.17.4

1.5开启es安全验证

# 进入到容器当中
[root@localhost]# docker exec -it 容器id/名字 /bin/bash
# cd到config目录下修改elasticsearch.yml

在yml文件中添加以下内容:

# 这俩是跨域配置
http.cors.enabled: true
http.cors.allow-origin: "*"
# 开启X-pack设置密码
http.cors.allow-headers: Authorization
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true

将es容器重启:

[root@localhost]# docker restart 容器id/名字

再次进入到容器中,cd到bin目录

[root@21650b6ea0f2 elasticsearch]# cd bin/
# 以交互的方式设置用户名和密码(记住自己设置的密码)
[root@21650b6ea0f2 elasticsearch]# ./elasticsearch-setup-passwords interactive

如果成功会出现这样的效果:

[root@21650b6ea0f2 elasticsearch]# bin/elasticsearch-setup-passwords interactive
Initiating the setup of passwords for reserved users elastic,apm_system,kibana,logstash_system,beats_system,remote_monitoring_user.
You will be prompted to enter passwords as the process progresses.
Please confirm that you would like to continue [y/N]y
Enter password for [elastic]: 
Reenter password for [elastic]: 
Enter password for [apm_system]: 
Reenter password for [apm_system]: 
Enter password for [kibana]: 
Reenter password for [kibana]: 
Enter password for [logstash_system]: 
Reenter password for [logstash_system]: 
Enter password for [beats_system]: 
Reenter password for [beats_system]: 
Enter password for [remote_monitoring_user]: 
Reenter password for [remote_monitoring_user]: 
Changed password for user [apm_system]
Changed password for user [kibana]
Changed password for user [logstash_system]
Changed password for user [beats_system]
Changed password for user [remote_monitoring_user]
Changed password for user [elastic]

如果失败,可能会出现这种结果:(反正我失败了)

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 /usr/share/elasticsearch/config/elasticsearch.keystore

解决办法:创建一个新的临时用户,然后赋予这个用户超级管理员角色

#进入容器
[root@localhost]# docker exec -it 容器名/id /bin/bash
#cd到bin目录
[root@467d3709b7db elasticsearch]# cd bin/
# 创建用户,并赋予权限
[root@467d3709b7db elasticsearch]# ./elasticsearch-users useradd tempchen -r superuser
Enter new password: 
Retype new password: 
# 退出容器

这个时候你访问9200那个连接应该会让你输入账号密码了

es remote cluster 认证 es验证_elasticsearch


但是访问kibana的5601应该会报错:missing authentication credentials for REST request

这时需要进入kibana容器,对其配置文件进行修改(用户密码和es设置的账户密码相对应):

server.name: kibana
server.host: "0"
elasticsearch.hosts: [ "http://192.168.89.138:9200" ]
elasticsearch.username: "elastic" # 主要是这行
elasticsearch.password: "elastic" # 和这行
server.port: 5601
elasticsearch.requestTimeout: 90000

如果进入kibana容器没有vim命令,可以进行以下操作:

[root@localhost]# docker exec -it 容器名/id /bin/bash
[root@467d3709b7db kibana]# apt-get update
[root@467d3709b7db kibana]# apt-get install vim

但是只从apt-get命令可能会报没有权限错误,可以这样解决:

# 进入容器时使用这个命令
[root@localhost]# docker exec -u 0 -it 容器名/id /bin/bash
# 再次执行apt-get那个命令就好了

最后的效果:

es remote cluster 认证 es验证_elasticsearch_02