从现在开始Thanos

本篇文章是2019年Kubernetes2 Advent Calendar的第十天文章。

首先

我想在这篇文章中描述一下CNCF的Sandbox项目Thanos的开源软件(截至2019年12月10日)。
我将从Thanos的概述开始,一直写到在Kubernetes集群上运行它的方法。

※ 塔诺斯本身并不依赖Kubernetes,因此可以在非Kubernetes环境下使用。

唐納斯指的是

Thanos是为了提供长期保存数据和高可用性的Prometheus而开发的开放源代码软件。它可以对多个Prometheus执行PromQL查询,从而可以集中管理在多个Kubernetes集群中运行的Prometheus。另外,Thanos的配置使用对象存储作为数据保存的后端,通过将每个Prometheus的指标数据保存到对象存储中,可以实现指标的长期保存。

灭霸的架构

arch.jpg

边车

首先,我们来看一下作为Prometheus的Sidecar运行的Thanos Sidecar。
Thanos Sidecar作为一个代理,通过gRPC的StoreAPI提供Prometheus数据给Querier使用。

Thanos_Sidecar.png
Thanos_backup.png

商店网关

Thanos_Gateway.png

压缩机

扫描对象存储,对旧数据进行压缩、压缩,生成调整大小的数据副本,以加快查询执行速度。

统治者

Thanos_Ruler.png

搭建环境

了解了Thanos的概要后,我们来实际进行环境配置。
这次我们将在本地电脑上搭建Kubernetes,并在其中部署Prometheus和Thanos。
笔者的电脑操作系统是macOS catalina。我们将使用kind来搭建Kubernetes集群。

我们使用了Thanos的Helm chart,该Helm chart在Thanos的文档中被介绍为Community Helm charts,用于将Thanos部署到Kubernetes集群中。

对象存储使用Google Cloud Storage。
作为对象存储的选择,还有Amazon S3和OpenStack Swift等其他选项,如果选择其他对象存储,请参考下方文档进行设置。
https://thanos.io/storage.md/

构建Kubernetes集群

首先,您可以使用Homebrew安装kind。

$ brew install kind

完成安装后,将创建一个集群。
按照以下方式配置kind的config文件,将集群配置为一个控制节点和一个工作节点。

kind: Cluster
apiVersion: kind.sigs.k8s.io/v1alpha3
nodes:
- role: control-plane
- role: worker

让我们实际创建一个集群。

$ kind create cluster --config kind-config.yaml

等待一会儿,Kubernetes集群将会被创建,然后我们会切换上下文。

$ kubectl config use-context kind-kind
$ kubectl config current-context
kind-kind

灭霸的部署

由于使用Helm进行部署,首先需要进行Helm安装。

$ brew install helm

接下来,我们将创建一个用于将Prometheus数据保存到对象存储的服务账户。
服务账户的策略将根据以下内容分配存储对象的创建者和存储对象的查看者。
参考链接:https://thanos.io/storage.md/#gcs-policies

创建服务帐户后,请按照以下格式生成密钥并将其配置到对象存储的config文件中。

type: GCS
config:
  bucket: "thanos"
  service_account: |-
    {
      "type": "service_account",
      "project_id": "project",
      "private_key_id": "abcdefghijklmnopqrstuvwxyz12345678906666",
      "private_key": "-----BEGIN PRIVATE KEY-----\...\n-----END PRIVATE KEY-----\n",
      "client_email": "project@thanos.iam.gserviceaccount.com",
      "client_id": "123456789012345678901",
      "auth_uri": "https://accounts.google.com/o/oauth2/auth",
      "token_uri": "https://oauth2.googleapis.com/token",
      "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
      "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/thanos%40gitpods.iam.gserviceaccount.com"
    }

请参考以下链接了解如何使用内联服务帐户:https://thanos.io/storage.md/#using-inline-a-service-account

创建一个命名空间进行Thanos的部署。

$ git clone https://github.com/banzaicloud/banzai-charts.git
$ cd banzaicloud/banzai-charts/thanos

$ helm repo add banzaicloud-stable https://kubernetes-charts.banzaicloud.com
$ helm install thanos banzaicloud-stable/thanos --namespace thanos -f values.yaml --set-file objstoreFile=object-store.yaml

Thanos已经部署完成。
接下来将部署Prometheus。使用prometheus-operator进行Prometheus的部署。
由于存在Helm Chart,我们将使用该Chart来进行部署。

要使用Thanos,需要在Prometheus上部署Sidecar。您可以通过在prometheus-operator中添加以下配置来部署Thanos Sidecar作为Prometheus Sidecar。

prometheus:
  prometheusSpec:
    thanos:
      image: quay.io/thanos/thanos:v0.8.1
      version: v0.8.1
      objectStorageConfig:
        name: thanos
        key: object-store.yaml

保存上述内容为名为thanos-sidecar.yaml的文件后,使用Helm部署Prometheus。

$ helm install prometheus stable/prometheus-operator --namespace thanos -f thanos-sidecar.yaml

我将检查Pod的列表,并确保所有Pod都处于Running状态。

$ kubectl get pods -n thanos
NAME                                                     READY   STATUS    RESTARTS   AGE
alertmanager-prometheus-prometheus-oper-alertmanager-0   2/2     Running   0          19h
prometheus-grafana-6bd876879f-hf8sb                      2/2     Running   0          19h
prometheus-kube-state-metrics-766476f899-5kshh           1/1     Running   0          19h
prometheus-prometheus-node-exporter-vkfg8                1/1     Running   0          19h
prometheus-prometheus-oper-operator-5bd8d4db69-62j8m     2/2     Running   0          19h
prometheus-prometheus-prometheus-oper-prometheus-0       4/4     Running   1          19h
thanos-bucket-574dcc6585-mb8jl                           1/1     Running   0          19h
thanos-compact-7fbf995746-rgp9t                          1/1     Running   0          19h
thanos-query-f754c67c9-5n6fm                             1/1     Running   0          19h
thanos-store-0-6d967bc966-m22fk                          1/1     Running   0          19h

使用kubectl port-forward命令来查看Prometheus的用户界面。

$ kubectl port-forward svc/prometheus-prometheus-oper-prometheus 9090
Forwarding from 127.0.0.1:9090 -> 9090
Forwarding from [::1]:9090 -> 9090

在另一个终端中执行以下命令,然后在浏览器中确认用户界面。

$ open http://localhost:9090
スクリーンショット 2019-12-08 16.12.31.png

接下来我们来看看Thanos Query。

$ kubectl port-forward svc/thanos-query-http 10902
Forwarding from 127.0.0.1:10902 -> 10902
Forwarding from [::1]:10902 -> 10902

$ open http://localhost:10902
スクリーンショット 2019-12-08 16.15.02.png

您可以使用Thanos Bucket Viewer查看已上载到对象存储桶中的数据。

$ kubectl port-forward svc/thanos-bucket 8080 
Forwarding from 127.0.0.1:8080 -> 8080
Forwarding from [::1]:8080 -> 8080

$ open http://localhost:8080

每2小时,Prometheus会生成TSDB块,而Thanos Sidecar会将其上传到对象存储中。因此,要在Thanos Bucket Viewer中显示数据需要一些时间。

スクリーンショット 2019-12-08 19.56.16.png

总结

我在查阅Thanos的概述信息。
如果需要将Prometheus进行扩展并实现统一管理,并且希望数据持久化,考虑使用Thanos可能是一个不错的选择。

在使用Prometheus时,与其单独运行,我更关心在生产环境等运营时,由于组件数量会大幅增加,会带来多少额外的工作量。

广告
将在 10 秒后关闭
bannerAds