背景:在一个宿主机上,通过使用 docker 启动多套 kibana-elasticsearch 监控不同的远程 ES 集群。每一套 kibana-elasticsearch 是通过 docker compose 启动的,负责监控指定的 ES 集群;所以多套 kibana-elasticsearch 之间要使用不同的宿主机端口,以便远程被监控的 ES 集群发送监控数据到对应的一套 kibana-elasticsearch。
查询:grep vm.max_map_count /etc/sysctl.conf
,如果没有该值
sudo vim /etc/sysctl.conf : 添加 vm.max_map_count=262144
sudo sysctl -p : 使上述配置生效
sudo sysctl -w vm.max_map_count=262144
https://docs.docker-cn.com/engine/installation/linux/docker-ce/centos/#%E4%BD%BF%E7%94%A8%E9%95%9C%E5%83%8F%E4%BB%93%E5%BA%93%E8%BF%9B%E8%A1%8C%E5%AE%89%E8%A3%85
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum makecache fast
sudo yum install docker-ce-18.06.1.ce-3.el7
sudo systemctl start docker // 启动 docker daemon
https://github.com/docker/compose/releases
sudo curl -L https://github.com/docker/compose/releases/download/1.23.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo /usr/local/bin/docker-compose --version
使用 docker compose 同时启动 kibana 和 elasticsearch,需要使用 3 个配置文件,即 docker-compose.yml、elasticsearch.yml、kibana.yml。
内容如下(假设为 weixin es 集群配置监控):
version: '2.2'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:6.4.3
container_name: es-weixin // use "es-weixin"
environment:
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- /data/elasticsearch/esdata-weixin:/usr/share/elasticsearch/data // use /data/esdata-weixin to store monitor data,如果是 azure vm,先看第八部分
- ./elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
ports:
- 9202:9200 // 宿主机 9202 端口号映射到 docker container 端口 9200,其他节点可使用 9202 访问此 es 实例
- 9302:9300 // 宿主机 9302 端口号映射到 docker container 端口 9300
networks:
- esnet-weixin
kibana:
image: docker.elastic.co/kibana/kibana:6.4.3
container_name: kibana-weixin // use "kibana-weixin"
ports:
- 5602:5601 // 宿主机 5602 端口号映射到 docker container 端口 5601,其他节点可使用 5602 访问此 kibana 实例
volumes:
- ./kibana.yml:/usr/share/kibana/config/kibana.yml
networks:
- esnet-weixin
volumes:
esdata-weixin:
driver: local
networks:
esnet-weixin:
driver: bridge
内容如下:
cluster.name: weixin-cluster-monitoring-es // 注意换掉名字
node.name: node-for-weixin // 注意换掉名字,也可以不配置
network.host: 0.0.0.0
discovery.zen.minimum_master_nodes: 1
discovery.type: single-node
bootstrap.memory_lock: true
xpack.monitoring.enabled: false
xpack.security.enabled: false
内容如下:
server.name: weixin-kibana
server.host: 0.0.0.0
elasticsearch.url: http://x.x.x.x:9202 (x.x.x.x 为宿主机的 IP,尽量使用内网 IP;注意此处端口号就是之前配置的映射到9200的宿主机端口号9202)
此处有重要的额外设置:我们宿主机是 Azure 的虚拟机,需要在 portal 上配置该虚拟机的端口 9202、5602 可访问。
执行 sudo /usr/local/bin/docker-compose up 2>&1 | sed 's/\x1B\[[0-9;]*[JKmsu]//g' | tee -a log
log 为日志文件,sed 是去掉输出信息中的 color code(在vim 中显示为乱码)。
启动成功后,在浏览器中输入 x.x.x.x:5602 即可访问 kibana
ES 集群每个节点的配置文件修改sudo vim /etc/elasticsearch/elasticsearch.yml
,添加如下配置
xpack.monitoring.collection.enabled: true
xpack.security.enabled: false
xpack.monitoring.exporters:
test-remote:
type: http
host: ["http://x.x.x.x:9202","http://y.y.y.y:9202"] // host 一个或多个; 这里 ip 要看具体情况来决定是用内网 IP 还是外网 IP,只要保证集群中每个节点都能访问这个 IP 就行。
ES 集群的版本只要高于6.3,默认安装 x-pack,且开启 security,license 也是basic 版本。所以我们无需更改 license,也无需安装 x-pack,但是需要禁用 recurity(xpack.security.enabled: false),并开启监控数据的收集(xpack.monitoring.collection.enabled: true);另外,需要将收集到的监控数据发送到另一个 es 集群(test-remote)。
sudo -i service elasticsearch restart
,此时观察 ES 集群的状态(GET _cluster/health
),等变为 green 再配置下一个节点。点击 x.x.x.x:5602 的 kibana -> Monitoring,应该可以看到 Monitered ES 集群的监控信息。
Azure vm 的系统盘很小,不够存储 es 监控数据,就需要另外挂载一个数据盘。
https://docs.microsoft.com/en-us/azure/virtual-machines/linux/attach-disk-portal
sudo fdisk /dev/sdc
sudo mkfs -t ext4 /dev/sdc1
sudo mkdir /data
sudo mount /dev/sdc1 /data
sudo -i blkid
sudo vi /etc/fstab
mkdir -p /data/elasticsearch/esdata-weixin
注意该目录的权限,如果 owner 是合适的,在启动 docker es 的时候不会报错,但是如果存在权限问题,启动 docker es 会报错。如果报错,可以尝试改动目录的 owner 或者 读写权限,比如改成 777(存在安全隐患):
sudo chmod 777 /data/elasticsearch/esdata-weixin:防止 docker 没有权限写