Thanos 通识
Posted on July 27, 2023 (Last modified on June 19, 2024) • 4 min read • 1,974 wordsthanos 的一些测试
从 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 模式。其区别可参考 1 和 2 。根据自己的情况选择了 sidecar 模式。为了快速实验,本地使用了 单台虚拟机上跑了 pod nfs, 然后 minio 使用了 nfs 的 storageClass 。kube-prometheus 及 grafana 也使用了 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
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 文件配置 。
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 过程(略)。
## 在 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
使用上面 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。
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