Docker Compose 运行 Elastic Stack 8.X

材料准备 如题,使用Docker Compose 运行Elastic Stack 8.X,五个月前还在前司做7.9版本的ELK迁移,如今已经是前司了,当时总共不到20TB,最近问前同事数据量已经到40TB了,而且根据她发我的截图来看,三千多个索引,副本分片却只有两千多,不操心了,事不关己高高挂起,反正现在负责ELK的是新来的陌生人。今天看已经发到8.10版本了,来装一个感受下新特性。 官方Docker Compose 官方安装指引文档 额外操作参考博客 version: "2.2" services: setup: image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION} volumes: - certs:/usr/share/elasticsearch/config/certs user: "0" command: > bash -c ' if [ x${ELASTIC_PASSWORD} == x ]; then echo "Set the ELASTIC_PASSWORD environment variable in the .env file"; exit 1; elif [ x${KIBANA_PASSWORD} == x ]; then echo "Set the KIBANA_PASSWORD environment variable in the .env file"; exit 1; fi; if [ ! -f config/certs/ca.zip ]; then echo "Creating CA"; bin/elasticsearch-certutil ca --silent --pem -out config/certs/ca.zip; unzip config/certs/ca.zip -d config/certs; fi; if [ ! -f config/certs/certs.zip ]; then echo "Creating certs"; echo -ne \ "instances:\n"\ " - name: es01\n"\ " dns:\n"\ " - es01\n"\ " - localhost\n"\ " ip:\n"\ " - 127.0.0.1\n"\ " - name: es02\n"\ " dns:\n"\ " - es02\n"\ " - localhost\n"\ " ip:\n"\ " - 127.0.0.1\n"\ " - name: es03\n"\ " dns:\n"\ " - es03\n"\ " - localhost\n"\ " ip:\n"\ " - 127.0.0.1\n"\ > config/certs/instances.yml; bin/elasticsearch-certutil cert --silent --pem -out config/certs/certs.zip --in config/certs/instances.yml --ca-cert config/certs/ca/ca.crt --ca-key config/certs/ca/ca.key; unzip config/certs/certs.zip -d config/certs; fi; echo "Setting file permissions" chown -R root:root config/certs; find . -type d -exec chmod 750 \{\} \;; find . -type f -exec chmod 640 \{\} \;; echo "Waiting for Elasticsearch availability"; until curl -s --cacert config/certs/ca/ca.crt https://es01:9200 | grep -q "missing authentication credentials"; do sleep 30; done; echo "Setting kibana_system password"; until curl -s -X POST --cacert config/certs/ca/ca.crt -u "elastic:${ELASTIC_PASSWORD}" -H "Content-Type: application/json" https://es01:9200/_security/user/kibana_system/_password -d "{\"password\":\"${KIBANA_PASSWORD}\"}" | grep -q "^{}"; do sleep 10; done; echo "All done!"; ' healthcheck: test: ["CMD-SHELL", "[ -f config/certs/es01/es01.crt ]"] interval: 1s timeout: 5s retries: 120 es01: depends_on: setup: condition: service_healthy image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION} volumes: - certs:/usr/share/elasticsearch/config/certs - esdata01:/usr/share/elasticsearch/data ports: - ${ES_PORT}:9200 environment: - node.name=es01 - cluster.name=${CLUSTER_NAME} - cluster.initial_master_nodes=es01,es02,es03 - discovery.seed_hosts=es02,es03 - ELASTIC_PASSWORD=${ELASTIC_PASSWORD} - bootstrap.memory_lock=true - xpack.security.enabled=true - xpack.security.http.ssl.enabled=true - xpack.security.http.ssl.key=certs/es01/es01.key - xpack.security.http.ssl.certificate=certs/es01/es01.crt - xpack.security.http.ssl.certificate_authorities=certs/ca/ca.crt - xpack.security.transport.ssl.enabled=true - xpack.security.transport.ssl.key=certs/es01/es01.key - xpack.security.transport.ssl.certificate=certs/es01/es01.crt - xpack.security.transport.ssl.certificate_authorities=certs/ca/ca.crt - xpack.security.transport.ssl.verification_mode=certificate - xpack.license.self_generated.type=${LICENSE} mem_limit: ${MEM_LIMIT} ulimits: memlock: soft: -1 hard: -1 healthcheck: test: [ "CMD-SHELL", "curl -s --cacert config/certs/ca/ca.crt https://localhost:9200 | grep -q 'missing authentication credentials'", ] interval: 10s timeout: 10s retries: 120 es02: depends_on: - es01 image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION} volumes: - certs:/usr/share/elasticsearch/config/certs - esdata02:/usr/share/elasticsearch/data environment: - node.name=es02 - cluster.name=${CLUSTER_NAME} - cluster.initial_master_nodes=es01,es02,es03 - discovery.seed_hosts=es01,es03 - bootstrap.memory_lock=true - xpack.security.enabled=true - xpack.security.http.ssl.enabled=true - xpack.security.http.ssl.key=certs/es02/es02.key - xpack.security.http.ssl.certificate=certs/es02/es02.crt - xpack.security.http.ssl.certificate_authorities=certs/ca/ca.crt - xpack.security.transport.ssl.enabled=true - xpack.security.transport.ssl.key=certs/es02/es02.key - xpack.security.transport.ssl.certificate=certs/es02/es02.crt - xpack.security.transport.ssl.certificate_authorities=certs/ca/ca.crt - xpack.security.transport.ssl.verification_mode=certificate - xpack.license.self_generated.type=${LICENSE} mem_limit: ${MEM_LIMIT} ulimits: memlock: soft: -1 hard: -1 healthcheck: test: [ "CMD-SHELL", "curl -s --cacert config/certs/ca/ca.crt https://localhost:9200 | grep -q 'missing authentication credentials'", ] interval: 10s timeout: 10s retries: 120 es03: depends_on: - es02 image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION} volumes: - certs:/usr/share/elasticsearch/config/certs - esdata03:/usr/share/elasticsearch/data environment: - node.name=es03 - cluster.name=${CLUSTER_NAME} - cluster.initial_master_nodes=es01,es02,es03 - discovery.seed_hosts=es01,es02 - bootstrap.memory_lock=true - xpack.security.enabled=true - xpack.security.http.ssl.enabled=true - xpack.security.http.ssl.key=certs/es03/es03.key - xpack.security.http.ssl.certificate=certs/es03/es03.crt - xpack.security.http.ssl.certificate_authorities=certs/ca/ca.crt - xpack.security.transport.ssl.enabled=true - xpack.security.transport.ssl.key=certs/es03/es03.key - xpack.security.transport.ssl.certificate=certs/es03/es03.crt - xpack.security.transport.ssl.certificate_authorities=certs/ca/ca.crt - xpack.security.transport.ssl.verification_mode=certificate - xpack.license.self_generated.type=${LICENSE} mem_limit: ${MEM_LIMIT} ulimits: memlock: soft: -1 hard: -1 healthcheck: test: [ "CMD-SHELL", "curl -s --cacert config/certs/ca/ca.crt https://localhost:9200 | grep -q 'missing authentication credentials'", ] interval: 10s timeout: 10s retries: 120 kibana: depends_on: es01: condition: service_healthy es02: condition: service_healthy es03: condition: service_healthy image: docker.elastic.co/kibana/kibana:${STACK_VERSION} volumes: - certs:/usr/share/kibana/config/certs - kibanadata:/usr/share/kibana/data ports: - ${KIBANA_PORT}:5601 environment: - SERVERNAME=kibana - ELASTICSEARCH_HOSTS=https://es01:9200 - ELASTICSEARCH_USERNAME=kibana_system - ELASTICSEARCH_PASSWORD=${KIBANA_PASSWORD} - ELASTICSEARCH_SSL_CERTIFICATEAUTHORITIES=config/certs/ca/ca.crt mem_limit: ${MEM_LIMIT} healthcheck: test: [ "CMD-SHELL", "curl -s -I http://localhost:5601 | grep -q 'HTTP/1.1 302 Found'", ] interval: 10s timeout: 10s retries: 120 volumes: certs: driver: local esdata01: driver: local esdata02: driver: local esdata03: driver: local kibanadata: driver: local 步骤分析 来欣赏下官方文档里面都干了些啥吧 创建了一个卷用来存储各种证书 判断ElasticSear...

创建: 2023-09-28 | 字数: 2279字 | 时长: 5分钟

记一次Prometheus的离奇经历

前情提要 书接上回,为了获取客户的Prometheus的监控数据,我写了个脚本用来通过API获取监控数据,然后转换成Open metric格式以方便,传输和导入,代码如下。 import datetime import subprocess import requests import sys """ http://localhost:9090 """ prometheus_url = input("请输入Prometheus链接: ") username = input("请输入用户名: 如无认证,请回车跳过") password = input("请输入密码: 如无认证,请回车跳过") print("下面的两个变量只需填写一个或者不填使用默认值") step = input("请输入每两个数据点间隔(单位秒,建议为5的倍数): ") hours = input("请输入往前查询的小时数(单位小时,建议不填): ") auth = None metric_param = "e" # 将查询出所有带有elasticsearch的指标 if username != "" and password != "": auth = (username, password) # 检查用户输入是否为数字 def is_number(value): try: int(value) return True except ValueError: return False # 如果用户同时设置了hours和step,按用户的输入值查询 if hours != "" and step != "": hours = int(hours) step = int(step) print("将查询过去{}小时的数据,步长为{}秒".format(hours, step)) else: # 如果用户没有输入hours和step,使用默认值 if hours == "" and step == "": print("将使用默认值查询") hours = 30 step = 10 elif hours != "": hours = int(hours) # 根据用户输入的hours计算step step = int(60 * 60 / (11000 / hours)) + 1 print("将查询过去{}小时的数据,步长为{}秒".format(hours, step)) elif step != "": step = int(step) # 根据用户输入的step计算hours hours = int(11000 / (60 / step) / 60) print("将查询过去{}小时的数据,步长为{}秒".format(hours, step)) else: print("输入的小时数和步长必须为有效的数字。") sys.exit(1) end_time = datetime.datetime.now().strftime("%Y-%m-%dT%H:%M:%SZ") query_time = datetime.datetime.now() - datetime.timedelta(hours=hours) start_time = query_time.strftime("%Y-%m-%dT%H:%M:%SZ") series = requests.get('{}/api/v1/label/__name__/values'.format(prometheus_url), auth=auth) if series.status_code != 200: print("查询失败,请检查{}/api/v1/label/__...

创建: 2023-09-25 | 字数: 5507字 | 时长: 11分钟

获取客户 Prometheus 监控数据

业务背景 在排查问题时,想通过Grafana看板查看用户的监控,只能靠拍照,效率低,质量一般,设计一个方案能够方便的将问题出现前24小时的监控数据拿到,在本地导入,就能够在本地Grafana方便的查看。Prometheus 本身只提供了API查询的功能并没有导出数据功能,自带的Promtool也只提供验证规则文件和配置文件,调试等。 参考文章 Analyzing Prometheus data with external tools Prometheus backfilling 方案一:使用API导出转换成CSV 使用API查询,将查询到的数据转换成CSV,刚好Grafana有插件能够将CSV作为数据源,经过实验后并不是特别顺利,能够读取到CSV,但没有成功绘制出图像。 总结 经过实验后并不是特别顺利,能够读取到CSV但没有成功绘制出图像,看板中部分查询语句中包含看板变量,CSV数据源无法实现看板变量。 方案二:拷贝Prometheus数据文件 Prometheus 按照两个小时为一个时间窗口,将两小时内产生的数据存储在一个块(Block)中。每个块都是一个单独的目录,里面含该时间窗口内的所有样本数据(chunks),元数据文件(meta.json)以及索引文件(index)。其中索引文件会将指标名称和标签索引到样板数据的时间序列中。此期间如果通过 API 删除时间序列,删除记录会保存在单独的逻辑文件 tombstone 当中。 Prometheus 为了防止丢失暂存在内存中的还未被写入磁盘的监控数据,引入了WAL机制。WAL被分割成默认大小为128M的文件段(segment),之前版本默认大小是256M,文件段以数字命名,长度为8位的整形。WAL的写入单位是页(page),每页的大小为32KB,所以每个段大小必须是页的大小的整数倍。如果WAL一次性写入的页数超过一个段的空闲页数,就会创建一个新的文件段来保存这些页,从而确保一次性写入的页不会跨段存储。这些数据暂时没有持久化,TSDB通过WAL将数据保存到磁盘上(保存的数据没有压缩,占用内存较大),当出现宕机,启动多协程读取WAL...

创建: 2023-09-08 | 字数: 9674字 | 时长: 20分钟

折腾博客的意义

WordPress 没有像大城市里的Z时代青少年一样在初中高中就开始折腾各种网络安全,编程技术,折腾博客,我在大二时才有建一个网站的想法,买了阿里云的ECS,买了域名,装了宝塔,然后LNMP一键启动,WordPress无脑梭哈,还折腾了备案,但是除了写了几个测试的文章,后面续费云主机的动力都没有了,于是索性连域名也卖了,记得好像是十几块钱买的,还卖了9块钱。我的博客从网络世界消失了,对于我来说,我知道了原来网站是这么运行的,原来还有宝塔和WordPress这么牛逼的工具,原来备案TM的这么麻烦! Hexo 再后来技术上走向正规,经常查一些技术文章,看到别人写的博客,知道了Hexo,知道了Github Page,开始折腾静态博客,使用Hexo和使用人数最多的主题Next,再结合网络上的各种方案魔改,当时我想的就是“整挺好,以后就这样不换了”。Hexo是截止我写这篇文时用的最久的框架,相处久了,了解的多了,遇到麻烦的次数也就多了。 Vuepress 期间还折腾了文档站点,看到了别人的文档站点挺好的,我的一些文档也可以放进文档站点作为文档库啊,然后又开始了VuePress、Docusaurus,因为抱着一旦启用就不换的决心,每个方案都折腾了不少时间,最终我的Github仓库还残存着一个Docs的仓库,然后我发现文档这个东西就是个伪需求,就此作罢。 Hexo in Docker 一开始Hexo运行在Mac上,我不敢随便重置系统,后来对Docker的运用加深,开始折腾在Docker里运行Hexo,也还算顺利。Dockerfile存在Dropbox里,存在iCloud里,非常的安稳和踏实,但是后面的事告诉我事情没这么简单,Dockerfile中每次都拉取latest的node基础镜像,git clone也是每次都是最新的,导致版本不兼容时就会有报错,或者是警告,这个问题不是不能解决,指定版本就好了呀,是的。但我还是开始嫌弃Hexo了,甚至我都没有继续写下去的动...

创建: 2023-08-28 | 字数: 2029字 | 时长: 5分钟

Flask+Vue 前后端分离记录

如题,记录告警平台从原来的layui升级到Vue,并实现Flask+Vue前后端分离,记录前后端三种解决跨域的方式(有点像茴香豆的四种写法?没事,技多不压身) ...

创建: 2023-07-12 | 字数: 1177字 | 时长: 3分钟

分享一份值得分享的 SRE 面试题

如题,分享记录一份还不错的面试题,看面试题的目的不是为了记住题目然后去应试(也不可能人家题都不带换的),如果是这样的话就算过了,面试真正在工作中遇到挑战一脸懵逼,怕是离大礼包不远了,看面试题是为了知道自己的水平,了解哪些常见的问题,如果有不足的就要提升弥补。 ...

创建: 2023-07-11 | 字数: 2728字 | 时长: 6分钟

Kuboard-spray 图形化安装高可用的 Kubernetes

不管你有没有听说过Kuboard,它都是一个非常有名的K8s管理工具,官方描述的是Kuboard - Kubernetes 多集群管理界面,我这次想介绍的是Kuboard-spray ...

创建: 2023-07-07 | 字数: 770字 | 时长: 2分钟

记录在 K8s 中部署 Nginx 并修改主页

如题,记录在K8s中部署Nginx并修改主页 ...

创建: 2023-06-20 | 字数: 1434字 | 时长: 3分钟

K8s 中 Pod 的调试技巧

今天在逛大佬的博客时又学到好东西了,特此记录一下,关于K8s中Pod调试的奇技淫巧,虽然不一定能用到,但是值得记录 ...

创建: 2023-06-13 | 字数: 628字 | 时长: 2分钟

Kubernetes 和 Flask 的组合

众所周知Minikube有自带的dashboard,输入命令minikuke dashboard打开链接就能看到,某日突发奇想,加入公司内部需要一个自定义的kubernetes监控平台,以满足一些自定义的需求呢?比如,我想看到最近新建的100个pod,或者我想看最近的k8s集群的events,使用flask来开发一个平台满足自定义,是一个不错的选择。 ...

创建: 2023-05-14 | 字数: 589字 | 时长: 2分钟