当前位置: 首页 > 科技观察

一文读懂Thanos多集群监控

时间:2023-03-12 22:59:56 科技观察

在本文中,我们将探讨Prometheus监控堆栈的局限性,以及为什么迁移到基于Thanos的堆栈可以改善指标保留并降低总体基础设施成本。用于此演示的内容可从以下链接获得,并根据各自的许可提交。https://github.com/particuleio/teks/tree/main/terragrunt/live/thanoshttps://github.com/particuleio/terraform-kubernetes-addons/tree/main/modules/awsKubernetesPrometheus技术栈部署Kubernetes时为我们的客户提供基础设施,在每个集群上部署监控堆栈是标准做法。这个堆栈通常由几个组件组成:Prometheus:收集指标AlertManager:根据指标查询向各种提供者发送警报Grafana:可视化豪华仪表板简化的架构如下:想从增长中获取指标。多个Grafana在此设置中,每个集群都有自己的Grafana和自己的一组仪表板,维护起来可能很麻烦。存储指标数据很昂贵Prometheus将指标数据存储在磁盘上,您必须在存储空间和指标保留时间之间做出选择。如果您想长期存储数据并在云提供商上运行,如果您存储数TB的数据,块存储可能会很昂贵。此外,在生产环境中,Prometheus通常以复制或分片或两者同时运行,这可以使存储需求增加三倍甚至四倍。解决方案多个Grafana数据源可以将Prometheus端点暴露在外部网络上,并将它们作为数据源添加到单个Grafana中。为了安全起见,您只需在Prometheus外部端点上使用TLS或TLS和基本身份验证。这种方案的缺点是不能基于不同的数据源进行计算。PrometheusfederationPrometheusfederation允许从Prometheus抓取到Prometheus,当您不抓取大量指标数据时,此解决方案效果很好。在规模上,如果您所有的Prometheus目标的提取持续时间都长于提取间隔,您可能会遇到一些严重的问题。PrometheusRemoteWrite虽然remotewrite是一种解决方案(也是由Thanosreceiver实现的),但我们不会在本文中讨论“PushMetrics”部分。您可以在此处阅读有关推送指标的优缺点[1]。当不信任多个集群或租户时(例如将Prometheus构建为服务时),建议将指标作为最后的手段。无论如何,这可能是未来文章的主题,但我们将在这里专注于抓取。Thanos,它来了Thanos是一个“具有长期存储能力的开源、高可用的Prometheus系统”。许多知名公司都在使用Thanos,同时也是CNCF孵化项目的一部分。Thanos的一个关键特性是它允许“无限”存储。几乎每个云提供商都通过使用S3等对象存储来提供对象存储。如果在本地运行,对象存储可以由rook或minio等解决方案提供。它是如何工作的?Thanos和Prometheus齐头并进,从Prometheus开始并升级到Thanos是很常见的。Thanos被分成几个组件,每个组件都有一个目标(每个服务都应该如此:)),并且这些组件通过gRPC进行通信。ThanosSidecarThanos与Prometheus(带有Sidecar)一起运行,并每2小时将Prometheus指标输出到对象存储。这使得Prometheus几乎是无状态的。Prometheus仍然在内存中保留2小时的指标,因此在发生中断时,您仍然可能会丢失2小时的指标(这个问题应该由您的Prometheus设置处理,使用HA/splitslice,而不是Thanos)。与Prometheusoperator和KubePrometheusstack一起,可以轻松部署Thanossidecar。该组件充当Thanos查询的存储。Thanos存储Thanos存储充当网关,将查询转换为远程对象存储。它还可以在本地存储上缓存一些信息。基本上,此组件允许您查询对象存储的指标。该组件充当Thanos查询的存储。ThanosCompactorThanosCompactor是一个单例(不可扩展),负责压缩和减少存储在对象存储中的指标。随着时间的推移,下采样正在放宽指标的粒度。例如,您可能希望将指标保留2或3年,但不需要像昨天的指标那样多的数据点。这就是压缩器的用武之地,它节省了对象存储的字节数,从而节省了成本。ThanosQueryThanosQuery是Thanos的主要组件,它是将PromQL查询发送到的中心点。Thanos查询公开了一个与Prometheus兼容的端点。然后它将查询分派给所有“商店”。请记住,Store可以是提供指标的任何其他Thanos组件。Thanos查询可以将查询发送到另一个Thanos查询(它们可以堆叠)。ThanosStoreThanosSidecarThanosQuery还负责对来自不同Stores或Prometheus的相同指标进行去重。例如,如果您在Prometheus中有一个也在对象存储中的指标,ThanosQuery可以删除该指标的重复数据。在PrometheusHA设置的情况下,重复数据删除也基于Prometheus副本和分片。ThanosQueryFrontend顾名思义,ThanosQueryFrontend是ThanosQuery的前端,旨在将大型查询拆分为多个较小的查询并缓存查询结果(在内存或memcached中)。还有其他组件,例如在远程写入的情况下接收Thanos,但这仍然不是本文的主题。多集群架构有多种方法可以将这些组件部署到多个Kubernetes集群中,根据用例,有些方法比其他方法更好,我们不能在这里详细介绍。我们的示例在AWS上运行,使用tEKS[2]部署了2个集群,我们的一体化解决方案在AWS上部署了一个生产就绪的EKS集群:一个观察者集群[3]一个被观察的集群[4]我们的部署使用官方的kube-prometheus-stack和bitnamithanos图表。一切都在我们的terraform-kubernetes-addons存储库中策划。Thanosdemo文件夹中的目录结构如下:││├──?kubeconfig│││└──?terragrunt.hcl││├──?eks-addons││└└──?terragrunt.hcl││└──??terragrunt.hcl││└──?terragrunt.hcl│└──?region_values.yaml└──?eu-west-3├──?clusters│└──?observee│├──?cluster_values.yaml│├──?eks││├──?kubeconfig││└──?terragrunt.hcl│├──?eks-addons││└──?terragrunt.hcl│└──?vpc│└──?terragrunt.hcl└──?region_values.yaml这允许DRY(Don'tRepeatYourself)基础设施,并且可以轻松扩展AWS账户、区域和集群的数量。观察者集群观察者集群是我们的主集群,我们将从中查询其他集群:Prometheus正在运行:Grafana启用Thanossidecar上传到特定的bucketstrueextra_values=<<-EXTRA_VALUESgrafana:deploymentStrategy:type:Recreateingress:enabled:trueannotations:kubernetes.io/ingress.class:nginxcert-manager.io/cluster:grsencrypt-aft:"lets{local.default_domain_suffix}tls:-secretName:grafana.${local.default_domain_suffix}hosts:-grafana.${local.default_domain_suffix}persistence:enabled:truestorageClassName:ebs-scaccessModes:-ReadWriteOncesize:1Giprometheus:prometheusSpec:replicas:1retentionSize:2:"10GB"ruleSelectorNilUsesHelmValues:falseserviceMonitorSelectorNilUsesHelmValues:falseserviceMonitorSelectorNilUsesHelmValues:falseSelectorValues:falsestorageSpec:volumeClaimTemplate:spec:storageClassName:ebs-scaccessModes:["ReadWriteOnce"]reso来源:requests:storage:10GiEXTRA_VALUES为观察者集群生成CA证书:这个CA将被进入sidecar的被观察集群信任为Thanos查询器组件生成TLS证书,它将查询被观察集群Thanos组件部署:所有Thanos组件部署完成查询前端,作为Grafana存储网关的数据源端点用于查询观察者桶查询将在存储网关和其他查询器上执行查询部署额外的Thanos组件:配置有TLS的Thanos查询器查询每个观察到的集群thanos-tls-querier={"observee"={enabled=truedefault_global_requests=truedefault_global_limits=falsestores=["thanos-sidecar.${local.default_domain_suffix}:443"]}}thanos-storegateway={"observee"={enabled=truedefault_global_requests=truedefault_global_limits=falsebucket="thanos-store-pio-thanos-observee"region="eu-west-3"}观察到的集群观察到的集群是一个Kubernetes集群r具有最小的Prometheus/Thanos安装,将被观察到的集群查询Prometheusoperator正在运行:Thanos端正在上传到watcher特定的bucket。Thanossidecar使用经过TLS客户端身份验证的入口对象发布,并信任观察者集群CAkube-prometheus-stack={enabled=trueallowed_cidrs=dependency.vpc。outputs.private_subnets_cidr_blocksthanos_sidecar_enabled=truethanos_bucket_force_destroy=trueextra_values=<<-EXTRA_VALUESgrafana:enabled:falseprometheus:thanosIngress:enabled:trueingressClassName:nginxannotations:cert-manager.io/cluster-issuer:"letsencrypt"nginx.ingress.kubernetes.ioredirect:ssl“真”nginx.ingress.kubernetes.io/backend-protocol:“GRPC”nginx.ingress.kubernetes.io/auth-tls-verify-client:“on”nginx.ingress.kubernetes.io/auth-tls-secret:"monitoring/thanos-ca"hosts:-thanos-sidecar.${local.default_domain_suffix}paths:-/tls:-secretName:thanos-sidecar.${local.default_domain_suffix}hosts:-thanos-sidecar.${local.default_domain_suffix}prometheusSpec:replicas:1retention:2dretentionSize:"6GB"ruleSelectorNilUsesHelmValues:falseserviceMonitorSelectorNilUsesHelmValues:falsepodMonitorSelectorNilUsesHelmValues:falsestorageSpec:volumeClaimTemplate:spec:storageClassName:ebs-scaccessModes:["ReadWriteOnce"]resources:requests:storage:10GiEXTRA_VALUESThanos组件部署:Thanos压缩器来管理这个特定集群的下采样thanos={enabled=truebucket_force_destroy=truetrusted_ca_content=dependency.thanos-ca.outputs.thanos_caextra_values=<<-EXTRA_VALUEScompactor:retentionResolution5m:90dquery:enabled:falsequeryFrontend:enabled:falsestoregateway:enabled:falseEXTRA_VALUES}Goingalittledeeperletscheckwhatisrunningonthecluster关于观察员,我们有:kubectl-nmonitoringgetpodsNAMEREADYSTATUSRESTARTSAGEalertmanager-kube-prometheus-stack-alertmanager-02/2Running0120mkube-prometheus-stack-grafana-c8768466b-rd8wm2/2Running0120mkube-prometheus-stack-kube-state-metrics-5cf575d8f8-x59rd1/1Running0120mkube-prometheus-stack-operator-6856b9bb58-hdrb21/1Running0119mkube-prometheus-stack-prometheus-node-exporter-8hvmv1/1Running0117mkube-prometheus-stack-prometheus-node-exporter-cwlfd1/1Running0120mkube-prometheus-stack-prometheus-exporter-rsss51/1Running0120mkube-prometheus-stack-prometheus-node-exporter-rzgr91/1Running0120mprometheus-kube-prometheus-stack-prometheus-03/3Running1120mthanos-compactor-74784bd59d-vmvps1/1Running0119mthanos-query-7c74db546c-d7bp81/1Running012mthanos-query-7c74db546c-ndnx21/1Running012mthanos-query-frontend-5cbcb65b57-5sx8z1/1Running0119mthanos-query-frontend-5cbcb65b57-qjhxg1/1Running0119mthanos-storegateway-01/1Running0119mthanos-storegateway-11/1Running0118mthanos-storegateway-observee-storegateway-01/1Running012mthanos-storegateway-observee-storegateway-11/1Running011mthanos-tls-querier-observee-query-dfb9f79f9-4str81/1Running029mthanos-tls-querier-observee-query-dfb9f79f9-mRunning2421/1nmonitoringgetingressNAMECLASSHOSTSADDRESSPORTSAGEkube-prometheus-stack-grafana<无>grafana.thanos.teks-tg.clusterfrak-dynamics.iok8s-ingressn-ingressn-afa0a48374-f507283b6cd101c5.elb.eu-west-1.amazonaws.com80,443123m-nmonitoringgetpodsNAMEREADYSTATUSRESTARTSAGEalertmanager-kube-prometheus-stack-alertmanager-02/2Running039mkube-prometheus-stack-kube-state-metrics-5cf575d8f8-ct2921/1Running039mkube-prometheus-stack-operator-6856b9bb58-4cngc1/1Running039mkube-prometheus-stack-prometheus-node-exporter-bs4wp1/1Running039mkube-prometheus-stack-prometheus-node-exporter-c57ss1/1Running039mkube-prometheus-stack-prometheus-node-exporter-cp5ch1/1Running039mkube-prometheus-stack-prometheus-node-exporter-tnqvq1/1Running039mkube-prometheus-stack-prometheus-node-exporter-z2p491/1Running039mkube-prometheus-stack-prometheus-node-exporter-zzqp71/1Running039mprometheus-kube-prometheus-stack-prometheus-03/3Running136f4dc1-compact/1Running038mkubectl-nmonitoringgetingressNAMECLASSHOTSADDRESSPORTSAGEkube-prometheus-stack-thanos-gatewaynginxthanos-sidecar.thanos.teks-tg.clusterfrak-dynamics.iok8s-ingressn-ingressn-95903f6102-d2ce9013ac068b9e.elb.eu-west-34.amazon0TLS查询器应该能够查询被观察集群的指标让我们看看它们的行为:k-nmonitoringlogs-fthanos-tls-querier-observee-query-687dd88ff5-nzpdhlevel=infots=2021-02-23T15:37:35.692346206Zcaller=storeset.go:387component=storesetmsg="addingnewstoreAPItoquerystoreset"address=thanos-sidecar.thanos.teks-tg.clusterfrak-dynamics.io:443extLset="{cluster=\"pio-thanos-observee\",prometheus=\"monitoring/kube-prometheus-stack-prometheus\",prometheus_replica=\"prometheus-kube-prometheus-stack-prometheus-0\"}"所以这个查询器pod可以查询我的其他集群,如果我们检查网络我们可以看到存储:kubectl-nmonitoringport-forwardthanos-tls-querier-observee-query-687dd88ff5-nzpdh10902很棒,但我只有一个商店,还记得我们说过查询器可以堆叠在一起吗?在我们的观察者集群中,我们有标准的http查询器,可以查询模式图中的其他组件。kubectl-nmonitoringport-forwardthanos-query-7c74db546c-d7bp810902在这里我们可以看到所有的存储都已经添加到我们的中央查询器中:观察者聚合本地Thanos存储网关(一个用于远程观察者集群,一个用于远程观察者集群)对于本地observerclusters)一个本地TLS查询器,可以查询观察到的sidecars在Grafana中可视化最后,我们可以转到Grafana看看默认的Kubernetes仪表板如何与多个集群兼容。总结Thanos是一个非常复杂的系统,有很多活动部件,我们没有深入研究特定的自定义配置,因为这会花费太多时间。我们在tEKS存储库中提供了一个相当完整的AWS实现,它抽象出了很多复杂性(主要是mTLS部分)并允许进行大量定制。您还可以将terraform-kubernetes-addons模块用作独立组件。我们计划在未来支持其他云提供商。如有Github上任何项目的问题,请随时联系我们。根据您的基础架构和需求,有许多可能适合您的Thanos实现。如果您想更深入地了解Thanos,可以查看他们的官方kube-thanos存储库,以及他们对跨集群通信的建议[5]。当然,我们很乐意帮助您设置云原生监控堆栈,请随时通过contact@particule.io与我们联系:)您也可以每天通过CNCF/KubernetesSlack频道联系我们。