Thanos 通识

Posted on July 27, 2023 (Last modified on June 19, 2024) • 4 min read • 1,974 words
Share via
 
 
 
 
 
 

thanos 的一些测试

Thanos 通识
Photo by C. G. on Unsplash

一、通识  

从 docker-compose prometheus 单节点,辅助多节点 app exporter 的监控方案。在到 kube-prometheus ( kubectl apply ) , kube-prometheus-stack( helm install )。自己使用上述方案对应的具体环境和业务是不同的,旧有方案能满足单台或者单 kubernetes 集群环境下的监控需求。

当有多台 kubernetes 集群的时候,上述的方案,可能就有点不太够了。虽然 prometheus 集群或联邦可以套用上述的部署方案,但是如何解决 HA ? 监控、告警数据重复等等一系列的问题堆起来的时候,在沿用之前的思路,就会特别复杂。有没有比较简单可靠的开源方案那,于是就想测试体验下 thanos。

thanos 官方推荐部署方式中自己选择了三方社区的 bitnami-thanos 部署方案。thanos 细说起来还挺复杂的,有指标收集的 sidecar 和 recevier 模式。其区别可参考 12 。根据自己的情况选择了 sidecar 模式。为了快速实验,本地使用了 单台虚拟机上跑了 pod nfs, 然后 minio 使用了 nfs 的 storageClass 。kube-prometheusgrafana 也使用了 bitnami 的 helm 部署方案。

实验环境 信息 备注
IP 10.66.253.248 kubernetes 单点环境, 6 核 16Gi 内存
k8s 版本 v1.23.1
helm 版本 v3.6.3
containerd 容器 v1.4.11
storageClass Name nfs-client

默认 namespace 全部在 monitoring 下,需要部署 minio, kube-prometheus, thanos, grafana

示意架构图

二、部署  

2.1 minio  

helm repo add c7n https://openchart.choerodon.com.cn/choerodon/c7n/
helm repo update
helm pull c7n/minio --version 5.0.9
tar -xf  minio-5.0.9.tgz
cd minio

基于内容修改 tgz 压缩包内的部分 values.yaml 文件配置 。

    1. storageClass: “nfs-client”
    1. replicas: 16 —-> replicas: 4
    1. minio-console ingress ,为了快速部署,没有修改
    1. accessKey 也可以修改指定,没有修改
helm package ./
helm install minio minio-5.0.9.tgz --namespace=monitoring

部署完的小提示:

***
export MC_HOST_minio-local=http://$(kubectl get secret --namespace monitoring minio -o jsonpath="{.data.rootUser}" | base64 --decode):
$(kubectl get secret --namespace monitoring minio -o jsonpath="{.data.rootPassword}" | base64 --decode)@localhost:9000
****
mc ls minio-local

可以根据当前的密码信息登录 minio console web, 也可以使用 minio 默认的登录信息: console/console123 如果你设置使用 nodeport 访问 svc minio-console ,可忽略如下的 minio-console ingress 的设置部分。

ingress minio-console 设置

## minio-console ingress ssl 
openssl genpkey -out ssl.key -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -aes-256-cbc
openssl rsa -in ssl.key -out ssl.key 
openssl req -new -x509 -days 3650 -key ssl.key -out ssl.crt -subj "/C=GB/L=Chengdu/O=NSFOCUS/CN=www.minio-console.example"

## 创建 minio-console ingress tls 证书
kubectl create secret tls chart-example-tls --cert=ssl.crt --key=ssl.key -n monitoring

kubectl edit ingress -n monitoring minio-console
## 修改 ingress 的配置,删除默认 minio console 如下两行配置:
-kubernetes.io/ingress.allow-http: "false"
-nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"

登录 minio 检查过程,及创建 bucket thanos,创建 accessKey 过程(略)。

2.2 kube-prometheus 部署  

## 在 minio 创建好后,可自行创建名为 thanos 的存储桶 bucket 
## 并在存储桶的用户下创建读写权限,需要创建 accesskey 来给 thanos 使用。
## 举例: 测试环境创建了如下的有  readwrite 权限的 accessKey、secret
accesskey: 9PM45Ca5P****kPKQ2K2
secretkey: X10ac6dcu1Zpw0j*******zlBnkdZ4

创建一个 thanos-storage-minio.yaml 文件,配置如下:

type: s3
config:
  bucket: thanos
  endpoint: minio.monitoring.svc.cluster.local:9000
  access_key: 9PM45Ca5P****kPKQ2K2
  secret_key: X10ac6dcu1Zpw0j*******zlBnkdZ4
  insecure: true
  signature_version2: false

创建 prometheus thanos sidecar 需要的 object 存储信息。

## thanos 默认使用的 bucket secret 名字为 thanos-objstore-secret, 
## 为了在同主机上区分secret,prometheus sidecar secret 使用 thanos-objectstorage。
kubectl create secret generic thanos-objectstorage --from-file=thanos.yaml=./thanos-storage-minio.yaml --namespace=monitoring
helm repo add https://charts.bitnami.com/bitnami  
helm repo update
helm pull bitnami/kube-prometheus
tar -xf kube-prometheus-8.14.2.tgz
cd kube-prometheus

修改 values.yaml 内容, 大致如下两处,可通过 grep 过滤关键字搜索修改,下面的修改全部基于此,不在赘述。

## kube-prometheus数据持久化挂载在 nfs-client 下
global:
  storageClass: "nfs-client"

## preometheus 开启 thanos sidecar
prometheus:
  thanos:
    create: true
    objectStorageConfig:
	   secretName: "thanos-objectstorage"
	   secretKey: thanos.yaml

如果是初次部署,需要先创建 kube-prometheus 内部的 crd 配置

kubectl create -f crds/*

不要使用 kubectl apply -f crds/*。 否则会有 Too long: must have at most 262144 bytes 的问题。

## 修改完成后,部署 kube-prometheus
helm package ./
helm install kube-prometheus kube-prometheus-8.14.2.tgz --namespace=monitoring

开启了 sidecar thanos 后,会出现 svc kube-prometheus-prometheus-thanos

root@agub20 ~* $ kubectl get svc -n monitoring |grep kube-prometheus
*******
kube-prometheus-prometheus-thanos    ClusterIP   None            <none>        10901/TCP                    22h

2.3 thanos  

使用上面 minio 创建的存储桶 bucket 名为 thanos 的 accesskey 及 secret。

## bitnami thanos 部署
## ruler,storegateway,compactor 默认是 enabled: flase 的状态,需要额外设置 true 打开。
## ruler 打开需要配置 config 才行;

helm pull bitnami/thanos
tar -xf thanos-12.8.3.tgz
cd thanos

配置 values.yaml, 从头往下先配置 storageClass 。

## 全局配置
## 推荐只用全局配置 sc, 只用配置一个地方就可以了,不用挨个配置,特殊情况除外。
global:
  storageClass: "nfs-client"

## 如果不想用全局配置,也可以在具体的 statefulset 的子配置目录下配置 sc ,比如以下举例:
compactor:
  persistence:
    storageClass: "nfs-client"

storegateway:
  persistence:
    storageClass: "nfs-client"

ruler:
  persistence:
    storageClass: "nfs-client"

在 values.ymal 中配置 storegateway

root@agub20 ~/helm3_cm_learning/thanos/3thanos_deploy/thanos $ grep objstoreConfig values.yaml -A 10
objstoreConfig: |-
  type: s3
  config:
    bucket: thanos
    endpoint: minio.monitoring.svc.cluster.local:9000
    access_key: 9PM45Ca5P****kPKQ2K2
    secret_key: X10ac6dcu1Zpw0j*******zlBnkdZ4
    insecure: true
    signature_version2: false

在 values.yaml 中配置简单的 ruler config 配置参考(举例):

ruler:
  enabled: true
  alertmanagers: ["http://alertmanager-operated.monitoring.svc.cluster.local:9093","http://kube-prometheus-alertmanager.monitoring.svc.culster.local:9093"]
  config: |-
    groups:
      - name: "metamonitoring"
        rules:
          - alert: "PrometheusDown"
            expr: absent(up{prometheus="monitoring/prometheus-operator"})

配置好 values.yaml 后部署 thanos

helm package ./ 
helm install thanos thanos-12.8.3.tgz --namespace=monitoring

检查

root@agub20 ~/$ kubectl get pods -n monitoring |grep thanos
thanos-compactor-546875ff4d-zhlcj                     1/1     Running   0              21h
thanos-query-6b7ff4545f-ch62s                         1/1     Running   0              22h
thanos-query-frontend-7fcbd57f58-76cr9                1/1     Running   0              22h
thanos-ruler-0                                        1/1     Running   0              21h
thanos-storegateway-0                                 1/1     Running   0              21h

可以自行使用 ingress 配置打开 thanos-query-frontend 访问。 由于临时调试,使用了 nodeport 访问 thanos-query-frontend。

2.4 grafana 部署  

helm search repo grafana|grep bitnami
helm pull bitnami/grafana --version 8.4.6
tar -xf grafana-8.4.6.tgz
cd grafana

修改内容添加 sc 持久化,还有很多可定义的配置比如 admin 密码, 根据需要自行探索。

global:
  storageClass: "nfs-client"
helm package ./
helm install bitnami-grafana grafana-8.4.6.tgz --namespace=monitoring

为了临时调试方便,部署好用使用了 nodeport 访问 grafana web 。grafana 添加 thanos 的数据源及 dashboard。

datasource - prometheus: http://thanos-query.monitoring.svc.cluster.local:9090

node-exporter full dashboard id: 1860
thanos dashboard id: 12937

thanos 官方的 multiple grafana dashboard json

三、参考  

多集群监控神器 Thanos - 基础读物
Thanos官方部署选项-自己选了 bitnami-thanos
thanos 实践 - 宝贵的实践经验
Thanos 部署与实践 - 只看头部的理论部分
thanos的两种数据收集模式sidecar和receiver


Comments

Follow me

I'm involved in Kubernetes coding and share developer memes.