云原生之深入解析Thanos在EKS多集群架构上存储多个集群Prometheus

一、前言

  • 随着 HiredScore 的产品和客户群越来越大,已经开始向 Kubernetes 过渡并迅速采用它,它是我们重要的障碍之一,也可能是最大的监控基础设施。我们在使用 Prometheus / Grafana 堆栈进行监控方面有一些经验,了解到希望创建一个更好、高可用性和弹性的基础架构,具有可行且具有成本效益的数据保留,此外,它还允许 HiredScore 的高速增长做好准备。
  • CNCF 推广了多种基础设施,可以解决这些监控痛点,并实现具有高可用性、数据保留和成本效益的监控。
  • 要求:
    • 单点可观察性将聚合来自任何区域的所有集群的所有数据;
    • Prometheus 的高可用性和弹性基础架构;
    • 我们所有应用程序数据的数据保留;
    • 经济高效的解决方案。
  • 最终选择 Bitnami 的 Kube-Prometheus 解决方案和 Thanos-io 的 Kube-Thanos 解决方案,该解决方案效果很好,并成功满足了所有需求。现在来认识一下 players:
    • Prometheus — 是用于事件监控和警报的免费软件应用程序,它在使用 HTTP 拉取模型构建的时间序列数据库中记录实时指标,具有灵活的查询和实时警报;
    • Thanos — 一个基于 Prometheus 组件的开源 CNCF 沙盒项目,用于创建全球规模的高可用性监控系统,它通过几个简单的步骤无缝地扩展了 Prometheus。

二、工作原理

  • 正如下图所示,每个 EKS 集群在同一个名称空间中拥有两个 Prometheus pods,它们通过抓取集群行为来监视它们。每个 Prometheus pods 在专用 PVC 中保存最后几个小时,在规定的保留时间后,数据通过 Thanos sidecar 发送到 S3 桶。通过这种方式,可以在少量本地存储上节省成本,并将其他所有存储都集中在一个地方(S3):

在这里插入图片描述

  • 为了显示来自 k8s 集群的 Grafana 数据,创建一个专用集群,负责使用连接到 thanos-sidecar 容器的 GRPC 直接从每个集群收集所有实时(最近约 2 小时)数据(暴露默认情况下在端口 10901 上)并从 S3 存储桶(配置存储)中获取远程数据。
  • 实现细节:
    • 第一阶段是在每个集群中实现 kube-prometheus 和 Thanos sidecar。
    • 第二阶段是在“聚合”集群中实现 kube-thanos,它将负责从集群中收集所有集群的实时数据,并从发送到 S3 存储桶(ObjectStore)的保留数据中收集数据。

三、具体实现

① 第一阶段

  • 在这里,关注如何在我们要监控的每个集群中部署和配置 Prometheus 以及 Thanos sidecar,在每个集群中创建一个名为 monitoring 的命名空间:
kubectl create ns monitoring
  • 创建一个存储类以使 Prometheus 能够持久化日期:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: prometheus-storage-class
provisioner: kubernetes.io/aws-ebs
parameters:
  type: gp3
reclaimPolicy: Retain
allowVolumeExpansion: true
volumeBindingMode: Immediate

kubectl apply -f prometheus-storage-class.yaml -n monitoring
  • 安装 kube-prometheus:
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
  • 将要配置的相关值复制到本地文件夹中,需要在值中应用的一些更改。
  • 第 1 步:
    • 使 Prometheus 高可用:设置 Prometheus Replica Count— 所需的 Prometheus 副本数(超过 2 个):
## @param prometheus.replicaCount Number of Prometheus replicas desired
  ##
  replicaCount: 2
  • 第 2 步:定义 pod 资源限制 Prometheus 资源-定义它以避免 Prometheus 消耗所有服务资源:
resources:
  requests:
    cpu: 512m
    memory: 3072Mi
  limits:
    cpu: 512m
    memory: 4096Mi 
  • 第 3 步:启用 Thanos Sidecar 创建:
thanos:
  ## @param prometheus.thanos.create Create a Thanos sidecar container
  ##
  create: true
  • 第 4 步:
    • 将 Thanos sidecar 服务类型从更改 ClusterIP 为 LoadBalancer- 它将创建一个 AWS 经典负载均衡器端点,该端点将在 GRPC 端口 10901 中公开 sidecar,然后可以使用此端点通过 route53 将其路由到某个 DNS 名称 thanos-prometheus-(cluster_name)。在自己的集群中公开 Thanos 端点 prometheus.thanos.service:
service:
  type: LoadBalancer
  port: 10901
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-internal: "true"
    • 现在,在创建 CLB 之后,需要在 kube-thanos 清单中实现它。
  • 第 5 步:
    • 禁用压缩并定义保留,这是通过 Thanos sidecar 上传数据的一个非常重要的步骤,为了使用 Thanos 边车上传,这两个值必须相等 --storage.tsdb.min-block-duration,–storage.tsdb.max-block-duration 默认情况下,它们设置为 2 小时,Prometheus 的保留时间建议不低于 min block duration 的 3 倍,即 6 小时:
retention: 12h

disableCompaction: true 
  • 第 6 步:
    • 启用配置密钥,通过启用对象存储配置,可以将数据写入 S3 或任何其他受支持的 BlockDevice,以确保长期数据的持久性:
## @param prometheus.thanos.objectStorageConfig Support mounting a Secret for the objectStorageConfig of the sideCar container.
objectStorageConfig:
  secretName: thanos-objstore-config
  secretKey: thanos.yaml
    • 虽然源文件 thanos-storage-config.yaml 必须采用这种形式:
type: s3
config:
  bucket: thanos-store #S3 bucket name
  endpoint: s3.<region>.amazonaws.com #S3 Regional endpoint
  access_key: <aws-account-id>
  secret_key: <aws-account-secret>
    • 值得一提的是,目前只能使用单个 S3 存储桶(ObjectStore) 使用以下命令创建密钥:
kubectl -n monitoring create secret generic thanos-objstore-config --from-file=thanos.yaml=thanos-storage-config.yaml
  • 第 7 步:
    • 现在可以使用相关自定义来安装/升级 helm chart:
helm install kube-prometheus -f values.yaml bitnami/kube-prometheus -n monitoring
// 或者
helm upgrade kube-prometheus -f values.yaml bitnami/kube-prometheus -n monitoring
  • 现在应该已经运行带有 Thanos sidecar 容器的 Prometheus pod,一方面通过 GRPC 将抓取的数据发送到清单,另一方面,相同的 sidecar 发送(大约 2 小时后)数据到 S3 存储桶(配置存储)。

② 第二阶段

  • 我们专注于如何在主要的可观察性集群上部署和配置 Thanos,如前所述,它将负责在第一阶段部署的所有集群中收集所有数据。为此,使用 kube-thanos manifests,可以发现,只需要实现查询和存储部分。
  • 第 1 步:
    • 安装和自定义 kube-thanos:在主可观察性集群中,创建一个名为 thanos 的命名空间:
kubectl create ns thanos
    • 可以选择克隆 kube-thanos 存储库并使用清单文件夹或自己编译 kube-thanos 清单,最后一个不需要复制整个存储库,只需要清单文件。
  • 第 2 步:
    • 在通过第一阶段后,将负责 thanos-query-deployment.yaml 从第一阶段开始与其他集群之间的通信。为此,需要添加以下内容:
- --store=dnssrv+_grpc._tcp.thanos-prometheus-<cluster_name>.<domain_name>:10901
    • 进入 args,在上面公开和定义的 Thanos sidecar GRPC 端点部分:
- args:
    - query
    - --grpc-address=0.0.0.0:10901
    - --http-address=0.0.0.0:9090
    - --log.level=info
    - --log.format=logfmt
    - --query.replica-label=prometheus_replica
    - --query.replica-label=rule_replica
    - --store=dnssrv+_grpc._tcp.thanos-store.thanos.svc.cluster.local:10901
    - --store=dnssrv+_grpc._tcp.thanos-receive-ingestor-default.thanos.svc.cluster.local:10901
    - --store=dnssrv+_grpc._tcp.thanos-prometheus-<cluster_name>.<domain_name>:10901
    - --query.auto-downsampling
  • 第 3 步:
    • 现在处理 thanos-store 与配置要从第一阶段发送到的数据的 S3 存储桶(ObjectStore)之间的通信。因此,正如在第一步中所做的那样,我们需要配置一个名称,该名称在注入环境 thanos-store-statefulSet.yaml 的一部分中请求到 Thanos 存储 pod:
env:
  - name: OBJSTORE_CONFIG
    valueFrom:
      secretKeyRef:
        key: thanos.yaml
        name: thanos-objectstorage
    • 然后可以重用第一阶段的相同源文件并为 thanos-storethanos-storage-config.yaml 创建一个秘密:
kubectl -n thanos create secret generic thanos-objectstorage --from-file=thanos.yaml=thanos-storage-config.yaml
  • 第 4 步:
    • 安装清单:
kubectl apply -f manifests -n thanos
    • 现在,应该关闭循环,Thanos 通过 thanos-query 部署从其他集群接收实时数据,并通过 thanos-store-statefulSet 保留来自 S3 存储桶(ObjectStore)的数据:

在这里插入图片描述

四、结论

  • Thanos 让我们改变了对 Prometheus 高度可用、耐用和经济高效的看法,在许多 Kubernetes 集群上实施 Thanos 和 Prometheus 需要付出很多努力,但如果关心确保高可用的 Prometheus,这是值得的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/259619.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何用 CleanMyMac 来保护 Mac 隐私

大家早上好&#xff0c;中午好&#xff0c;下午好&#xff0c;晚上好。 在我们使用MacBook上的自带浏览器-Safari&#xff08;或者一些其他浏览器&#xff09;进行网页浏览的时候&#xff0c;往往会留下一些痕迹。如果这些痕迹涉及一些敏感数据信息的话&#xff0c;那么我们肯…

1_js基本简介数据类型变量的使用

1. 编程语言简介 1.1 计算机编程语言 计算机编程语言是程序设计的最重要的工具&#xff0c;它是指计算机能够接受和处理的、具有一定语法规则的语言。从计算机诞生&#xff0c;计算机语言经历了机器语言、汇编语言和高级语言几个阶段。 高级语言&#xff1a;JavaScript&#x…

Flink Table API 与 SQL 编程整理

Flink API总共分为4层这里主要整理Table API的使用 Table API是流处理和批处理通用的关系型API&#xff0c;Table API可以基于流输入或者批输入来运行而不需要进行任何修改。Table API是SQL语言的超集并专门为Apache Flink设计的&#xff0c;Table API是Scala和Java语言集成式…

Android Studio: 解决Gradle sync failed 错误

文章目录 1. 前言2. 错误情况3. 解决办法3.1 获取gradle下载地址3.2 获取gradle存放目录3.3 替换并删除临时文件3.4 触发Try Again 4. 执行成功 1. 前言 今天调试项目&#xff0c;发现新装的AS&#xff0c;在下载gradle的过程中&#xff0c;一直显示连接失败&#xff0c;Gradl…

【MyBatis学习笔记】MyBatis基础学习

MyBatis基础 MyBatis简介MyBatis特性MyBatis下载和其他持久化层技术对比 核心配置文件详解默认的类型别名 搭建MyBatis开发环境创建maven工程创建MyBatis的核心配置文件创建mapper接口创建MyBatis的映射文件通过junit测试功能加入log4j日志功能 MyBatis获取参数值的两种方式&am…

欧美电商平台Depop如何入驻?

对标美国二手闲鱼平台Mercia,PoshMark、东南亚Etsy&#xff0c;Depop是英国的一个面向创意人群的二手时尚市场&#xff0c;类似于Instagram&#xff0c;但更专注于买卖二手服装、配饰和艺术品。 有研究显示,由于购物预算减少,高达65%的受访者表示乐意在圣诞节购买或收到二手礼…

【⭐️大厂干货】阿里程序员私藏提效IntelliJ IDEA插件大放送️ ~

️ ❗文末有&#x1f308;&#x1f95a;&#xff08;彩蛋&#xff09; 要问对后端程序员最重要的软件是哪个&#xff1f;IntelliJ IDEA说第二&#xff0c;估计没有其他软件可以称第一。在工作过程中我发现对于这么重要的软件&#xff0c;有些开发同学竟然把它“打扮”的甚是简…

AI日报:信用公司转型人工智能的长采访...或许能给你一些启发

欢迎订阅专栏 《AI日报》 获取人工智能邻域最新资讯 文章目录 总览什么是FICOFICO的转型如何转型人工智能平台功能 构建人工智能平台中遇到的问题关于生成式人工智能银行客户的反馈内部情况 一些社会问题 总览 FICO软件执行副总裁Stephanie Covert加入人工智能商业播客&#x…

MongoDB的原子操作findAndModify和findOneAndUpdate

本文主要介绍MongoDB的原子操作findAndModify和findOneAndUpdate。 目录 MongoDB的原子操作一、findAndModify二、findOneAndUpdate MongoDB的原子操作 MongoDB的原子操作指的是在单个操作中对数据库的数据进行读取和修改&#xff0c;并确保操作是原子的&#xff0c;即要么完全…

linux实现shell脚本监控磁盘内存达到阈值时清理catalina.out日志

想在服务器上写一个shell脚本&#xff0c;在磁盘使用率达到80%时&#xff0c;自动清理掉一些没有用的日志文件&#xff0c;根据这个想法&#xff0c;在生产环境上写了一个以下脚本&#xff0c;按照该流程&#xff0c;可实现在linux环境做一个定时任务来执行shell脚本&#xff0…

Pixel Nerf代码阅读

Input&#xff1a; 图像的 分辨率是 300*400&#xff1b; 每个场景里面有 49张 Training 的图像。 SB&#xff1a; scene batch 场景的个数&#xff1b; 4 NV&#xff1a; number input &#xff0c;每个场景的视角&#xff0c;也就是图像的数量&#xff1b; 49 每条光线首先…

JS逆向实战——开发者工具检测

说明&#xff1a;仅供学习使用&#xff0c;请勿用于非法用途&#xff0c;若有侵权&#xff0c;请联系博主删除 作者&#xff1a;zhu6201976 一、背景 在JS逆向领域&#xff0c;Chrome开发者工具是核心&#xff0c;抓包、调试、看调用栈等都离不开它。可以说&#xff0c;逆向人…

blast安装及简单使用

一、安装blast 1.Ubuntu环境 # 下载blast wget https://ftp.ncbi.nlm.nih.gov/blast/executables/blast/2.9.0/ncbi-blast-2.9.0-x64-linux.tar.gz # 解压blast压缩包 tar -xzvf ncbi-blast-2.9.0-x64-linux.tar.gz # 测试 ./bin/blastp -h 这里就代表安装成功了&#xff0c;…

Android 架构 - 组件化

一、概念 组件化是对单个功能进行开发&#xff0c;使得功能可以复用。将多个功能组合起来就是一个业务模块&#xff0c;因此去除了模块间的耦合&#xff0c;使得按业务划分的模块成了可单独运行的业务组件。&#xff08;一定程度上的独立&#xff0c;还是依附于整个项目中&…

如何免费搭建私人电影网站(三)

接上一篇文章&#xff1a; 网站模版上传到空间后就进行安装网站了操作如下图&#xff1a; 打开链接地址&#xff1a; 输入前面设置好的FTP密码 进入安装界面 点同意后下一步 需要填入数据库的账号和密码 返回虚拟主机界面进行设置 如下图点初始化 修改数据库的密码 然后…

Android Canvas状态save与restore,Kotlin

Android Canvas状态save与restore&#xff0c;Kotlin private fun f1() {val bitmap BitmapFactory.decodeResource(resources, R.mipmap.pic).copy(Bitmap.Config.ARGB_8888, true)val canvas Canvas(bitmap)val paint Paint(Paint.ANTI_ALIAS_FLAG)paint.color Color.RED…

hyper-v ubuntu2204指定静态ip地址

虚拟机静态IP设置 虚拟机每次重新启动&#xff0c;都会动态分配IP&#xff0c;这导致我们无法使用一个固定的ip连接到虚拟机内部。解决该问题的最直接有效的办法就是给虚拟机绑定2张网卡&#xff0c;一张用于连接外网、一张用于连接内网。 init 0 关机&#xff0c;也可以从管…

C语言—每日选择题—Day57

指针相关博客 打响指针的第一枪&#xff1a;指针家族-CSDN博客 深入理解&#xff1a;指针变量的解引用 与 加法运算-CSDN博客 第一题 1. 下面程序段&#xff08;&#xff09; char *str[] {"ABC", "DEF", "GHI"}; puts(str[1]); A&#xff1a;A…

day49_代码生成器EasyCode

IDEA安装插件 easycode插件 使用 修改模板 因为默认模板有些不适用自己项目,所以需要修改,以下是我的模板json文件 生成了Controller,Service,Dao,Entity没有前后端交互的R,需要自己导入 在磁盘新建一个EasyCodeConfig.json,将以下代码赋值粘贴进去, 然后在idea的easycode插…

中央空调冷却塔循环水全自动加药装置PH电导率设备工作原理动画

一&#xff1a;全自动加药装置【概述】 随着在给水、排水处理过程中&#xff0c;常常投加各类化学药剂作为阻垢、杀菌灭藻、混凝、絮凝用&#xff0c;以达到净化水的目的。这些药剂有固体颗粒、液体&#xff0c;在投加过程中必须溶解、稀释及按配比定量投加方能取得最佳效果&am…