在本文中,咱们将看到Prometheus监控技术栈的局限性,以及为什么挪动到基于Thanos的技术栈能够进步指标留存率并升高总体基础设施老本。
用于此演示的内容能够在上面链接中获取,并提交到他们各自的许可证。
- https://github.com/particulei...
- https://github.com/particulei...
Kubernetes普罗米修斯技术栈
在为咱们的客户部署Kubernetes基础设施时,在每个集群上部署监控技术栈是规范做法。这个堆栈通常由几个组件组成:
- Prometheus:收集度量规范
- 告警管理器:依据指标查问向各种提供者发送警报
- Grafana:可视化奢华仪表板
简化架构如下:
注意事项
这种架构有一些注意事项,当你想从其中获取指标的集群数量减少时,它的伸缩性以及可扩展性不太好。
多个Grafana
在这种设置中,每个集群都有本人的Grafana和本人的一组仪表板,保护起来很麻烦。
存储指标数据是低廉的
Prometheus将指标数据存储在磁盘上,你必须在存储空间和指标保留工夫之间做出抉择。如果你想长时间存储数据并在云提供商上运行,那么如果存储TB的数据,块存储的老本可能会很高。同样,在生产环境中,Prometheus常常应用复制或分片或两者同时运行,这可能会使存储需要减少两倍甚至四倍。
解决方案
多个Grafana数据源
能够在内部网络上公开Prometheus的端点,并将它们作为数据源增加到单个Grafana中。你只须要在Prometheus内部端点上应用TLS或TLS和根本认证来实现安全性。此解决方案的毛病是不能基于不同的数据源进行计算。
Prometheus联邦
Prometheus联邦容许从Prometheus中抓取Prometheus,当你不抓取很多指标数据时,这个解决方案能够很好地工作。在规模上,如果你所有的Prometheus指标的抓取持续时间都比抓取距离长,可能会遇到一些重大的问题。
Prometheus近程写
尽管近程写入是一种解决方案(也由Thanos receiver实现),但咱们将不在本文中探讨“推送指标”局部。你能够在这里[1]浏览对于推送指标的利弊。倡议在不信赖多个集群或租户的状况下(例如在将Prometheus构建为服务提供时),将指标作为最初的伎俩。无论如何,这可能是当前文章的主题,但咱们将在这里集中探讨抓取。
Thanos,它来了
Thanos是一个“开源的,高可用的Prometheus零碎,具备长期存储能力”。很多出名公司都在应用Thanos,也是CNCF孵化我的项目的一部分。
Thanos的一个次要特点就是容许“有限”存储空间。通过应用对象存储(比方S3),简直每个云提供商都提供对象存储。如果在前提环境下运行,对象存储能够通过rook或minio这样的解决方案提供。
它是如何工作的?
Thanos和Prometheus并肩作战,从Prometheus开始降级到Thanos是很常见的。
Thanos被分成几个组件,每个组件都有一个指标(每个服务都应该这样:)),组件之间通过gRPC进行通信。
Thanos Sidecar
Thanos和Prometheus一起运行(有一个边车),每2小时向一个对象存储库输入Prometheus指标。这使得Prometheus简直是无状态的。Prometheus依然在内存中保留着2个小时的度量值,所以在产生宕机的状况下,你可能依然会失落2个小时的度量值(这个问题应该由你的Prometheus设置来解决,应用HA/分片,而不是Thanos)。
Thanos sidecar与Prometheus运营者和Kube Prometheus栈一起,能够轻松部署。这个组件充当Thanos查问的存储。
Thanos存储
Thanos存储充当一个网关,将查问转换为近程对象存储。它还能够在本地存储器上缓存一些信息。基本上,这个组件容许你查问对象存储以获取指标。这个组件充当Thanos查问的存储。
Thanos Compactor
Thanos Compactor是一个单例(它是不可扩大的),它负责压缩和升高存储在对象存储中的指标。下采样是随着工夫的推移对指标力度的宽松。例如,你可能想将你的指标放弃2年或3年,但你不须要像昨天的指标那么少数据点。这就是压缩器的作用,它能够在对象存储上节俭资节,从而节省成本。
Thanos Query
Thanos查问是Thanos的次要组件,它是向其发送PromQL查问的中心点。Thanos查问裸露了一个与Prometheus兼容的端点。而后它将查问后果分派给所有的“stores”。记住,Store可能是任何其余提供指标的Thanos组件。Thanos查问能够发送查问到另一个Thanos查问(他们能够重叠)。
- Thanos Store
- Thanos Sidecar
- Thanos Query
还负责对来自不同Store或Prometheus的雷同指标进行反复数据删除。例如,如果你有一个度量值在Prometheus中,同时也在对象存储中,Thanos Query能够对该指标值进行反复数据删除。在Prometheus HA设置的状况下,反复数据删除也基于Prometheus正本和分片。
Thanos Query Frontend
正如它的名字所暗示的,Thanos查问前端是Thanos查问的前端,它的指标是将大型查问拆分为多个较小的查问,并缓存查问后果(在内存或memcached中)。
还有其余组件,比方在近程写的状况下接管Thanos,但这依然不是本文的主题。
多集群架构
有多种办法能够将这些组件部署到多个Kubernetes集群中,依据用例的不同,有些办法比其余办法更好,在这里咱们不能给出具体的介绍。
咱们的例子是在AWS上运行,应用tEKS[2]部署了2个集群,咱们的all in one解决方案将生产就绪的EKS集群部署在AWS上:
- 一个观察者集群[3]
- 一个察看集群[4]
咱们的部署应用了官网的kube-prometheus-stack和bitnami thanos图表。
一切都是在咱们的terraform-kubernetes-addons存储库中策动的。
Thanos demo文件夹中的目录构造如下:
.├── env_tags.yaml├── eu-west-1│ ├── clusters│ │ └── observer│ │ ├── eks│ │ │ ├── kubeconfig│ │ │ └── terragrunt.hcl│ │ ├── eks-addons│ │ │ └── terragrunt.hcl│ │ └── vpc│ │ └── 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 't Repeat Yourself)基础设施,并能够轻松地扩大AWS帐户、区域和集群的数量。
观察者集群
观察者集群是咱们的主集群,咱们将从它查问其余集群:
Prometheus正在运行:
- Grafana启用
- Thanos边车上传到特定的桶
kube-prometheus-stack = { enabled = true allowed_cidrs = dependency.vpc.outputs.private_subnets_cidr_blocks thanos_sidecar_enabled = true thanos_bucket_force_destroy = true extra_values = <<-EXTRA_VALUES grafana: deploymentStrategy: type: Recreate ingress: enabled: true annotations: kubernetes.io/ingress.class: nginx cert-manager.io/cluster-issuer: "letsencrypt" hosts: - grafana.${local.default_domain_suffix} tls: - secretName: grafana.${local.default_domain_suffix} hosts: - grafana.${local.default_domain_suffix} persistence: enabled: true storageClassName: ebs-sc accessModes: - ReadWriteOnce size: 1Gi prometheus: prometheusSpec: replicas: 1 retention: 2d retentionSize: "10GB" ruleSelectorNilUsesHelmValues: false serviceMonitorSelectorNilUsesHelmValues: false podMonitorSelectorNilUsesHelmValues: false storageSpec: volumeClaimTemplate: spec: storageClassName: ebs-sc accessModes: ["ReadWriteOnce"] resources: requests: storage: 10Gi EXTRA_VALUES
为观察者集群生成一个CA证书:
- 这个CA将被进入sidecar的被察看集群所信赖
- 为Thanos querier组件生成TLS证书,这些组件将查问被察看集群
Thanos组件部署:
- Thanos组件全副部署实现
- 查问前端,作为Grafana的数据源端点
- 存储网关用于查问察看零碎
- Query将对存储网关和其余查询器执行查问
部署的额定Thanos组件:
- 配置了TLS的Thanos查询器对每个被察看集群进行查问
thanos-tls-querier = { "observee" = { enabled = true default_global_requests = true default_global_limits = false stores = [ "thanos-sidecar.${local.default_domain_suffix}:443" ] }}thanos-storegateway = { "observee" = { enabled = true default_global_requests = true default_global_limits = false bucket = "thanos-store-pio-thanos-observee" region = "eu-west-3" }
被观测集群
被观测集群是Kubernetes集群,具备最小的Prometheus/Thanos装置,将被观测集群查问。
Prometheus operator正在运行:
- Thanos这边就是上传给观察者特定的桶
- Thanos边车与TLS客户端认证的入口对象一起公布,并信赖观察者集群CA
kube-prometheus-stack = { enabled = true allowed_cidrs = dependency.vpc.outputs.private_subnets_cidr_blocks thanos_sidecar_enabled = true thanos_bucket_force_destroy = true extra_values = <<-EXTRA_VALUES grafana: enabled: false prometheus: thanosIngress: enabled: true ingressClassName: nginx annotations: cert-manager.io/cluster-issuer: "letsencrypt" nginx.ingress.kubernetes.io/ssl-redirect: "true" 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: 1 retention: 2d retentionSize: "6GB" ruleSelectorNilUsesHelmValues: false serviceMonitorSelectorNilUsesHelmValues: false podMonitorSelectorNilUsesHelmValues: false storageSpec: volumeClaimTemplate: spec: storageClassName: ebs-sc accessModes: ["ReadWriteOnce"] resources: requests: storage: 10Gi EXTRA_VALUES
Thanos组件部署:
- Thanos压缩器来治理这个特定集群的下采样
thanos = { enabled = true bucket_force_destroy = true trusted_ca_content = dependency.thanos-ca.outputs.thanos_ca extra_values = <<-EXTRA_VALUES compactor: retentionResolution5m: 90d query: enabled: false queryFrontend: enabled: false storegateway: enabled: false EXTRA_VALUES}
再深刻一点
让咱们检查一下集群上正在运行什么。
对于观察员,咱们有:
kubectl -n monitoring get podsNAME READY STATUS RESTARTS AGEalertmanager-kube-prometheus-stack-alertmanager-0 2/2 Running 0 120mkube-prometheus-stack-grafana-c8768466b-rd8wm 2/2 Running 0 120mkube-prometheus-stack-kube-state-metrics-5cf575d8f8-x59rd 1/1 Running 0 120mkube-prometheus-stack-operator-6856b9bb58-hdrb2 1/1 Running 0 119mkube-prometheus-stack-prometheus-node-exporter-8hvmv 1/1 Running 0 117mkube-prometheus-stack-prometheus-node-exporter-cwlfd 1/1 Running 0 120mkube-prometheus-stack-prometheus-node-exporter-rsss5 1/1 Running 0 120mkube-prometheus-stack-prometheus-node-exporter-rzgr9 1/1 Running 0 120mprometheus-kube-prometheus-stack-prometheus-0 3/3 Running 1 120mthanos-compactor-74784bd59d-vmvps 1/1 Running 0 119mthanos-query-7c74db546c-d7bp8 1/1 Running 0 12mthanos-query-7c74db546c-ndnx2 1/1 Running 0 12mthanos-query-frontend-5cbcb65b57-5sx8z 1/1 Running 0 119mthanos-query-frontend-5cbcb65b57-qjhxg 1/1 Running 0 119mthanos-storegateway-0 1/1 Running 0 119mthanos-storegateway-1 1/1 Running 0 118mthanos-storegateway-observee-storegateway-0 1/1 Running 0 12mthanos-storegateway-observee-storegateway-1 1/1 Running 0 11mthanos-tls-querier-observee-query-dfb9f79f9-4str8 1/1 Running 0 29mthanos-tls-querier-observee-query-dfb9f79f9-xsq24 1/1 Running 0 29mkubectl -n monitoring get ingressNAME CLASS HOSTS ADDRESS PORTS AGEkube-prometheus-stack-grafana <none> grafana.thanos.teks-tg.clusterfrak-dynamics.io k8s-ingressn-ingressn-afa0a48374-f507283b6cd101c5.elb.eu-west-1.amazonaws.com 80, 443 123m
被观察者:
kubectl -n monitoring get podsNAME READY STATUS RESTARTS AGEalertmanager-kube-prometheus-stack-alertmanager-0 2/2 Running 0 39mkube-prometheus-stack-kube-state-metrics-5cf575d8f8-ct292 1/1 Running 0 39mkube-prometheus-stack-operator-6856b9bb58-4cngc 1/1 Running 0 39mkube-prometheus-stack-prometheus-node-exporter-bs4wp 1/1 Running 0 39mkube-prometheus-stack-prometheus-node-exporter-c57ss 1/1 Running 0 39mkube-prometheus-stack-prometheus-node-exporter-cp5ch 1/1 Running 0 39mkube-prometheus-stack-prometheus-node-exporter-tnqvq 1/1 Running 0 39mkube-prometheus-stack-prometheus-node-exporter-z2p49 1/1 Running 0 39mkube-prometheus-stack-prometheus-node-exporter-zzqp7 1/1 Running 0 39mprometheus-kube-prometheus-stack-prometheus-0 3/3 Running 1 39mthanos-compactor-7576dcbcfc-6pd4v 1/1 Running 0 38mkubectl -n monitoring get ingressNAME CLASS HOSTS ADDRESS PORTS AGEkube-prometheus-stack-thanos-gateway nginx thanos-sidecar.thanos.teks-tg.clusterfrak-dynamics.io k8s-ingressn-ingressn-95903f6102-d2ce9013ac068b9e.elb.eu-west-3.amazonaws.com 80, 443 40m
咱们的TLS查询器应该可能查问被观测集群的度量规范。
让咱们来看看它们的行为:
k -n monitoring logs -f thanos-tls-querier-observee-query-687dd88ff5-nzpdhlevel=info ts=2021-02-23T15:37:35.692346206Z caller=storeset.go:387 component=storeset msg="adding new storeAPI to query storeset" address=thanos-sidecar.thanos.teks-tg.clusterfrak-dynamics.io:443 extLset="{cluster=\"pio-thanos-observee\", prometheus=\"monitoring/kube-prometheus-stack-prometheus\", prometheus_replica=\"prometheus-kube-prometheus-stack-prometheus-0\"}"
所以这个查询器pods能够查问我的其余集群,如果咱们查看Web,咱们能够看到存储:
kubectl -n monitoring port-forward thanos-tls-querier-observee-query-687dd88ff5-nzpdh 10902
太棒了,然而我只有一个存储,还记得咱们说过查询器能够重叠在一起吗?在咱们的观察者集群中,咱们有规范的http查询器,它能够查问架构图中的其余组件。
kubectl -n monitoring port-forward thanos-query-7c74db546c-d7bp8 10902
这里咱们能够看到所有的存储曾经被增加到咱们的核心查询器:
- 观察者把本地Thanos汇集
- 咱们的存储网关(一个用于近程观测者集群,一个用于本地观测者集群)
- 本地TLS查询器,它能够查问被察看的sidecar
在Grafana可视化
最初,咱们能够返回Grafana,看看默认的Kubernetes仪表板是如何与多集群兼容的。
总结
Thanos是一个非常复杂的零碎,有很多挪动部件,咱们没有深入研究具体的自定义配置,因为它会破费太多的工夫。
咱们在tEKS存储库中提供了一个相当残缺的AWS实现,它形象了很多复杂性(次要是mTLS局部),并容许进行很多定制。你也能够应用terraform-kubernetes-addons模块作为独立的组件。咱们打算在将来反对其余云提供商。不要犹豫,通过Github上的任何一个我的项目的问题分割咱们。
依据你的基础设施和需要,有许多可能适宜你的Thanos实现。
如果你想深入研究Thanos,能够查看他们的官网kube-thanos存储库,以及他们对于跨集群通信的倡议。