使用Prometheus和Thanos进行高可用性Kubernetes监控

背景介绍
对Prometheus高可用性的需求提升
现在很明显,Kubernetes是容器编排方面的老大,但对于k8s的监控是任何基础架构的重要方面,我们应该确保监控设置具有高可用性和高度可扩展性,以适应不断增长的基础架构的需求,尤其是在使用Kubernetes的情况下。

因此,今天,我们将部署群集化的Prometheus设置,该设置不仅可以抵抗节点故障,而且还可以确保适当的数据归档以备将来参考。我们的设置也具有很大的可扩展性,以至于我们可以在同一监控范围内跨越多个Kubernetes集群。

目前现状

大多数Prometheus部署都使用持久性Pod,而Prometheus使用联合设置进行扩展。但是,并非所有数据都可以使用联合机制进行聚合,在添加其他服务器时,通常需要一种机制来管理Prometheus配置。

解决方案

Thanos旨在解决上述问题。在Thanos的帮助下,我们不仅可以增加Prometheus实例并在它们之间消除重复数据,还可以将数据归档在云存储或S3等长期存储中。

实战
Thanos架构

Thanos由以下组件组成:

Thanos Sidecar:这是沿着Prometheus运行的主要组件。它读取并存储对象存储中的数据。此外,它管理Prometheus的配置和生命周期。为了区分每个Prometheus实例,Sidecar组件将外部标签注入Prometheus配置中。该组件能够在Prometheus服务器的PromQL界面上运行查询。 Sidecar组件还侦听Thanos gRPC协议,并在gRPC和REST之间转换查询。
Thanos Store:此组件在对象存储桶中的历史数据之上实现Store API。它主要充当API网关,因此不需要大量的本地磁盘空间。它在启动时加入Thanos集群,并公布它可以访问的数据。它会保留有关本地磁盘上所有远程块的少量信息,并使它与存储桶保持同步。通常,在重新启动时可以安全地删除此数据,但会增加启动时间。
Thanos查询:查询组件侦听HTTP,并将查询转换为Thanos gRPC格式。它汇总了来自不同来源的查询结果,并且可以从Sidecar和Store中读取数据。在高可用性设置中,它甚至可以对结果进行重复数据删除。
HA组的运行时重复数据删除

Prometheus是有状态的,不允许复制其数据库。这意味着通过运行多个Prometheus副本来提高高可用性并不是很容易使用。简单的负载平衡将不起作用,例如,在发生某些崩溃后,副本可能已启动,但是查询此类副本将导致其关闭期间的间隙很小。有第二个副本可能正在启动,但又可能在另一个时刻关闭(例如滚动重启),因此这些副本之上的负载平衡将无法正常工作。

相反,Thanos Querier从两个副本中提取数据,并对这些信号进行重复数据删除,从而对Querier使用者透明地填补了空白。
Thanos Compact:Thanos的压缩器组件采用Prometheus 2.0存储引擎的压缩过程来阻止存储在对象存储中的数据。通常,它在语义上不是并发安全的,必须针对存储桶以单例方式部署。
它还负责数据的下采样-40小时后执行5m的下采样,而10天后执行1h的下采样。
Thanos Ruler:它基本上与Prometheus的规则具有相同的作用。唯一的区别是它可以与Thanos组件进行通信。

为了完全理解本教程,需要以下内容:

1、Kubernetes的工作知识和使用Kubectl
2、运行中的Kubernetes集群至少有3个节点
3、实现Ingress Controller和Ingress对象(出于演示目的,正在使用Nginx Ingress Controller),这不是强制性的,但强烈建议这样做以减少创建的外部端点的数量。
4、创建供Thanos组件用来访问对象存储的凭证
5、创建2个存储桶,并将其命名为prometheus-long-term和thanos-ruler
6、创建一个角色为“存储对象管理员”的服务帐户
7、将密钥文件下载为JSON凭证,并将其命名为thanos-gcs-credentials.json
8、使用凭据创建kubernetessecret ,

 

部署各种组件
部署Prometheus Services帐户,Clusterrole和Clusterrolebinding

上面的清单创建了Prometheus所需的监视名称空间和服务帐户,clusterrole和clusterrolebinding。

部署Prometheus配置configmap

上面的Configmap创建Prometheus配置文件模板。 Thanos sidecar组件将读取此配置文件模板,并将生成实际的配置文件,而该配置文件又将由在同一容器中运行的Prometheus容器使用。 在配置文件中添加external_labels部分非常重要,这样Querier才能基于此重复数据删除。

部署Prometheus规则configmap
这将创建我们的警报规则,并将其转发给Alertmanager

 

部署Prometheus Stateful Set

重要的是要了解以下有关上面提供的清单:

Prometheus部署为具有3个副本的有状态集合,每个副本动态地配置其自己的持久卷。
Prometheus配置由Thanos sidecar容器使用我们在上面创建的模板文件生成。
Thanos处理数据压缩,因此我们需要设置–storage.tsdb.min-block-duration = 2h和–storage.tsdb.max-block-duration = 2h
Prometheus有状态集被标记为thanos-store-api:true,因此每个无头服务都会发现每个Pod,我们将在下一个中创建它。 Thanos Querier将使用此无头服务来查询所有Prometheus实例中的数据。我们还将相同的标签应用于Thanos Store和Thanos Ruler组件,以便Querier也会发现它们并将其用于查询指标。
使用GOOGLE_APPLICATION_CREDENTIALS环境变量提供了GCS存储桶凭据路径,并且配置文件是根据我们作为先决条件的一部分创建的secret安装到该文件的。
部署Prometheus服务

我们为有状态集中的每个Prometheus Pod创建了不同的服务,但这不是必需的。 这些仅用于调试目的。 上面已经解释了thanos-store-gateway无头服务的目的。 稍后我们将使用入口对象公开Prometheus服务。

部署Thanos Querier

这是Thanos部署的主要组成部分之一。 请注意以下几点:

1.容器参数–store = dnssrv + thanos-store-gateway:10901有助于发现应从中查询度量标准数据的所有组件。
2.thanos-querier服务提供了一个Web界面来运行PromQL查询。 它还可以选择在各个Prometheus群集之间重复数据删除。
3.这是我们提供Grafana作为所有仪表板的数据源的END POINT.

部署Thanos Store Gateway

他将创建存储组件,该组件负责从对象存储到查询者的度量。

部署Thanos Ruler

现在,如果在与我们的工作负载相同的名称空间中的交互式shell上启动,并尝试查看thanos-store-gateway解析到哪些所有pod,将看到类似以下的内容:

上面返回的IP对应于我们的Prometheus Pod,thanos-store和thanos-ruler。 可以验证为

部署Alertmanager

这将创建我们的alertmanager部署,该部署将根据Prometheus规则生成的所有警报。

部署Kubestate Metrics

需要使用Kubestate指标部署来中继一些重要的容器指标,这些指标不是kubelet本身公开的,因此不能直接用于Prometheus。

部署Node-Exporter Daemonset

Node-Exporter守护程序在每个节点上运行一个pod-exporter的容器,并公开节点相关的指标,这些指标可以被Prometheus实例提取。

部署Grafana

这将创建我们的Grafana部署和服务,并将使用我们的Ingress对象公开该服务。 我们应该将Thanos-Querier添加为Grafana部署的数据源。 操作如下:

单击添加数据源
集合名称:DS_PROMETHEUS
套装类型:普罗米修斯
设定网址:http:// thanos-querier:9090
保存并测试。 现在,可以构建自定义仪表板,也可以直接从grafana.net导入仪表板。 仪表盘#315和#1471是很好的开始。

部署 Ingress Object

这是的最后一块。 这将在Kubernetes集群之外公开我们所有的服务,并帮助我们访问它们。 确保将<yourdomain>替换为可以访问的域名,并且可以将Ingress-Controller的服务指向该域名。

现在,应该可以在http:// thanos-querier。<yourdomain> .com上访问Thanos Querier。 它看起来像这样:

确保选择重复数据删除。

如果单击“存储”,则可以看到thanos-store-gateway服务发现的所有活动endpoints

现在,将Thanos Querier添加为Grafana中的数据源,并开始创建仪表板

 

Kubernetes Cluster Monitoring Dashboard

 

Kubernetes Node Monitoring Dashboard

总结
将Thanos与Prometheus集成无疑提供了水平扩展Prometheus的能力,并且由于Thanos-Querier能够从其他查询器实例中提取指标,因此几乎可以跨整个集群提取指标,从而在单个仪表板上可视化它们。

我们还能够将度量标准数据存档在对象存储中,该对象存储为我们的监视系统提供了无限的存储空间,并提供了来自对象存储本身的度量。 此设置的大部分成本可归因于对象存储(S3或GCS)。 如果我们对它们应用适当的保留策略,则可以进一步减少。

但是,要实现所有这些,需要进行大量配置, 上面提供的清单已在生产环境中进行了测试。 如果有任何疑问,请随时联系。