下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

快速上手Thanos:高可用的 Prometheus

作者:匿名     来源: 云计算点击数:973发布时间: 2022-06-08 21:52:01

标签: Thanos集群Prometheus

  在本文中,我将介绍使用Thanos在EKS多集群架构上存储多个集群的Prometheus指标的思考过程和经验教训。

  在一个成千上万的服务和应用程序部署在多个基础设施中的世界中,在高可用性环境中进行监控已成为每个开发过程的重要组成部分。

  在本文中,我将介绍使用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 的命名空间:

  复制

  1. kubectl create ns monitoring1.

  创建一个存储类以使 Prometheus 能够持久化日期

  复制

  1. apiVersion: storage.k8s.io/v1

  2. kind: StorageClass

  3. metadata:

  4. name: prometheus-storage-class

  5. provisioner: kubernetes.io/aws-ebs

  6. parameters:

  7. type: gp3

  8. reclaimPolicy: Retain

  9. allowVolumeExpansion: true

  10. volumeBindingMode: Immediate1.2.3.4.5.6.7.8.9.10.

  复制

  1. kubectl apply -f prometheus-storage-class.yaml -n monitoring1.

  安装 kube-prometheus:

  复制

  1. helm repo add bitnami https://charts.bitnami.com/bitnami

  2. helm repo update1.2.

  将要配置的相关值复制到本地文件夹中。需要在值中应用的一些更改:

  第1步:使 Prometheus 高可用:设置Prometheus Replica Count— 所需的Prometheus副本数(超过2个)

  https://github.com/bitnami/charts/blob/master/bitnami/kube-prometheus/values.yaml

  https://github.com/bitnami/charts/blob/46afe376ae87a5af32504bc230a25d9c7e4522e2/bitnami/kube-prometheus/values.yaml#L760

  复制

  1. ## @param prometheus.replicaCount Number of Prometheus replicas desired

  2. ##

  3. replicaCount: 21.2.3.

  第2步:定义 pod 资源限制Prometheus 资源-定义它以避免Prometheus消耗所有服务资源。

  复制

  1. resources:

  2.  requests:

  3.  cpu: 512m

  4.  memory: 3072Mi

  5.  limits:

  6.  cpu: 512m

  7.  memory: 4096Mi1.2.3.4.5.6.7.

  第 3 步:启用 Thanos Sidecar 创建

  复制

  1. thanos:

  2. ## @param prometheus.thanos.create Create a Thanos sidecar container

  3. ##

  4. create: true1.2.3.4.

  第4步:将Thanos sidecar 服务类型从更改ClusterIP为LoadBalancer- 它将创建一个AWS经典负载均衡器端点,该端点将在GRPC端口 ( 10901) 中公开 sidecar,然后我们可以使用此端点通过 route53 将其路由到某个 DNS 名称thanos-prometheus-(cluster_name)。在您自己的集群中公开 Thanos 端点prometheus.thanos.service:

  https://github.com/bitnami/charts/blob/46afe376ae87a5af32504bc230a25d9c7e4522e2/bitnami/kube-prometheus/values.yaml#L1034

  复制

  1. service:

  2. type: LoadBalancer

  3. port: 10901

  4. annotations:

  5. service.beta.kubernetes.io/aws-load-balancer-internal: "true"1.2.3.4.5.

  现在,在创建 CLB 之后,我们需要在kube-thanos清单中实现它。我们稍后会在第二阶段讨论。

  第 5 步:禁用压缩并定义保留——这是通过 Thanos sidecar 上传数据的一个非常重要的步骤:

  https://prometheus.io/docs/prometheus/latest/storage/#operational-aspects

  为了使用 Thanos 边车上传,这两个值必须相等--storage.tsdb.min-block-duration,--storage.tsdb.max-block-duration默认情况下,它们设置为2小时。Prometheus 的保留时间建议不低于 min block duration 的3倍,即6小时。可以在此处找到其他说明:

  https://thanos.io/tip/components/sidecar.md/

  复制

  1. retention: 12h

  2.

  3. disableCompaction: true

  第 6 步:启用配置密钥——通过启用对象存储配置,我们可以将数据写入 S3 或任何其他受支持的BlockDevice。以确保我们长期数据的持久性。

  复制

  1. ## @param prometheus.thanos.objectStorageConfig Support mounting a Secret for the objectStorageConfig of the sideCar container.

  2. objectStorageConfig:

  3. secretName: thanos-objstore-config

  4. secretKey: thanos.yaml1.2.3.4.

  虽然源文件thanos-storage-config.yaml必须采用这种形式,

  复制

  1. type: s3

  2. config:

  3. bucket: thanos-store #S3 bucket name

  4. endpoint: s3..amazonaws.com #S3 Regional endpoint

  5. access_key:

  6. secret_key: 1.2.3.4.5.6.

  值得一提的是,目前我们只能使用单个 S3 存储桶(ObjectStore) 使用以下命令创建密钥:

  复制

  1. kubectl -n monitoring create secret generic thanos-objstore-config --from-file=thanos.yaml=thanos-storage-config.yaml1.

  第 7 步:现在我们可以使用我们的相关自定义来安装/升级 helm chart。

  复制

  1. helm install kube-prometheus -f values.yaml bitnami/kube-prometheus -n monitoring1.

  或者

  复制

  1. helm upgrade kube-prometheus -f values.yaml bitnami/kube-prometheus -n monitoring1.

  如果你做到了这里,你现在应该已经运行带有 Thanos sidecar 容器的 Prometheus pod,一方面通过GRPC将抓取的数据发送到清单,另一方面,相同的 sidecar 发送(大约 2 小时后)数据到S3存储桶(配置存储)。恭喜!

  第二阶段

  我们专注于如何在主要的可观察性集群上部署和配置 Thanos 。如前所述,它将负责从我们在第一阶段部署的所有集群中收集所有数据。

  为此,我们使用kube-thanos manifests。我们发现,就我们的目的而言,我们只需要实现查询和存储部分。

  第1步:安装和自定义kube-thanos:在主可观察性集群中 创建一个名为thanos的命名空间:

  复制

  1. kubectl create ns thanos1.

  您可以选择克隆kube-thanos存储库并使用清单文件夹或自己编译kube-thanos清单。最后一个不需要您复制整个存储库,只需要清单文件。

  第2步:在您通过第一阶段后,我们将负责thanos-query-deployment.yaml从第一阶段开始与其他集群之间的通信。为此,我们需要添加以下内容:

  复制

  1. - --store=dnssrv+_grpc._tcp.thanos-prometheus-.:109011.

  进入args我们在上面公开和定义的Thanos sidecar GRPC端点部分(步骤 4)。

  复制

  1. - args:

  2. - query

  3. - --grpc-address=0.0.0.0:10901

  4. - --http-address=0.0.0.0:9090

  5. - --log.level=info

  6. - --log.format=logfmt

  7. - --query.replica-label=prometheus_replica

  8. - --query.replica-label=rule_replica

  9. - --store=dnssrv+_grpc._tcp.thanos-store.thanos.svc.cluster.local:10901

  10. - --store=dnssrv+_grpc._tcp.thanos-receive-ingestor-default.thanos.svc.cluster.local:10901

  11. - --store=dnssrv+_grpc._tcp.thanos-prometheus-.:10901

  12. - --query.auto-downsampling1.2.3.4.5.6.7.8.9.10.11.12.

  第 3 步:现在,我们将处理thanos-store与我们配置要从第一阶段发送到的数据的S3存储桶(ObjectStore)之间的通信。因此,正如我们在第一步中所做的那样,我们需要配置一个名称,该名称在注入环境thanos-store-statefulSet.yaml的一部分中请求到 Thanos 存储 pod:

  复制

  1. env:

  2. - name: OBJSTORE_CONFIG

  3. valueFrom:

  4. secretKeyRef:

  5. key: thanos.yaml

  6. name: thanos-objectstorage1.2.3.4.5.6.

  然后我们可以重用第一阶段的相同源文件并为thanos-storethanos-storage-config.yaml创建一个秘密:

  复制

  1. kubectl -n thanos create secret generic thanos-objectstorage --from-file=thanos.yaml=thanos-storage-config.yaml1.

  第4步:安装清单:

  复制

  1. kubectl apply -f manifests -n thanos1.

  现在,应该关闭循环。Thanos 通过thanos-query部署从其他集群接收实时数据,并通过thanos-store-statefulSet保留来自 S3 存储桶(ObjectStore)的数据。

  结论

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

  来源: 进击云原生

    >>>>>>点击进入计算专题

赞(12)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程