返璞归真--从零开始建设k8s监控之thanos-sidecar(七)
前言
本文详细讨论一下thanos-sidecar
环境准备
| 组件 | 版本 |
|---|---|
| 操作系统 | Ubuntu 22.04.4 LTS |
| docker | 24.0.7 |
| thanos | 0.36.1 |
thanos概述
thanos主要有4个组件
- receive:独立部署,提供了数据写入的api,prometheus通过这个api把数据推送到receive的对象存储
- sidecar:与prometheus部署在一起,成为prometheus的sidecar,负责把prometheus本地的数据上传至对象存储当中
- query:独立部署,是一个兼容了prometheus的查询组件,汇总了来自不同来源的查询结果,并且可以从Sidecar和Store中读取数据
- store:独立部署,提供了对象数据存储功能,并且提供相关的api,query通过该api查询历史数据
sidecar模式
Sidecar 与prometheus绑定在一起,负责处理与其绑定的prometheus各种监控数据的处理

1. k8s安装sidecar
1.1 改造prometheus configmap
加入重要的external label
apiVersion: v1
kind: ConfigMap
metadata:
name: prometheus-cm
labels:
name: prometheus-cm
namespace: prometheus
data:
prometheus.yml: |-
global:
scrape_interval: 5s
evaluation_interval: 5s
# 新增外部标签
external_labels:
cluster: "prometheus-k8s"
# 新增结束
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: "prometheus-kube-state-metrics"
static_configs:
- targets: ["kube-state-metrics.kube-system:8080"]
1.2 改造prometheus deployment
加入thanos sidecar
apiVersion: apps/v1
kind: Deployment
metadata:
name: prometheus-deploy
namespace: prometheus
labels:
app: prometheus
spec:
replicas: 1
selector:
matchLabels:
app: prometheus
template:
metadata:
labels:
app: prometheus
spec:
containers:
- name: prometheus
image: registry.cn-beijing.aliyuncs.com/wilsonchai/prometheus:v2.54.1
args:
- "--storage.tsdb.retention.time=12h"
- "--config.file=/etc/prometheus/prometheus.yml"
- "--storage.tsdb.path=/prometheus/"
- "--storage.tsdb.min-block-duration=30m"
- "--storage.tsdb.max-block-duration=30m"
- --web.enable-lifecycle
ports:
- containerPort: 9090
resources:
requests:
cpu: 500m
memory: 500M
limits:
cpu: 1
memory: 1Gi
volumeMounts:
- name: prometheus-config
mountPath: /etc/prometheus/
- name: prometheus-data
mountPath: /prometheus
# 新增thanos-sidecar
- name: thanos
image: registry.cn-beijing.aliyuncs.com/wilsonchai/thanos:0.36.1
args:
- "sidecar"
- "--prometheus.url=http://localhost:9090"
- "--tsdb.path=/prometheus"
volumeMounts:
- name: prometheus-data
mountPath: /prometheus
# 新增结束
volumes:
- name: prometheus-config
configMap:
defaultMode: 420
name: prometheus-cm
- emptyDir: {}
name: prometheus-data
1.3 新增thanos的service
apiVersion: v1
kind: Service
metadata:
name: thanos-sidecar-service
namespace: prometheus
spec:
ports:
- name: thanos-sidecar-port
port: 10901
protocol: TCP
targetPort: 10901
selector:
app: prometheus
type: NodePort
照葫芦画瓢,改造另一个prometheus,专门采集node监控数据的
2. 部署thanos-query
docker run -d --net=host \
--name thanos-query \
registry.cn-beijing.aliyuncs.com/wilsonchai/thanos:0.36.1 \
query \
--http-address "0.0.0.0:39090" \
--grpc-address "0.0.0.0:39091" \
--store "192.168.49.2:30139" \
--store "192.168.49.2:31165"
需要注意一下192.168.49.2:30139与192.168.49.2:31165,这里ip是thanos-sidecar所在pod的node ip,端口则是映射出来的nodeport
打开thanos-query页面检查

3. 部署对象存储minio

3.1 部署方式同receive
3.2 新增sidecar configmap
首先准备bucket.yml,由于thanos-sidecar在k8s里面,所以做成configmap
apiVersion: v1
kind: ConfigMap
metadata:
name: bucket-cm
labels:
name: bucket-cm
namespace: prometheus
data:
bucket.yml: |-
type: S3
config:
bucket: "wilson-test"
endpoint: "10.22.11.156:9090"
access_key: "zzUrkBzyqcCDXySsMLlS"
secret_key: "nWCcztESnxnUZIKSKsELGEFdg6l6fjzhtqkARJB8"
insecure: true
3.3 改造thanos-sidecar
apiVersion: apps/v1
kind: Deployment
metadata:
name: prometheus-deploy
namespace: prometheus
labels:
app: prometheus
spec:
replicas: 1
selector:
matchLabels:
app: prometheus
template:
metadata:
labels:
app: prometheus
spec:
containers:
- name: prometheus
image: registry.cn-beijing.aliyuncs.com/wilsonchai/prometheus:v2.54.1
args:
- "--storage.tsdb.retention.time=12h"
- "--config.file=/etc/prometheus/prometheus.yml"
- "--storage.tsdb.path=/prometheus/"
- "--storage.tsdb.min-block-duration=30m"
- "--storage.tsdb.max-block-duration=30m"
- --web.enable-lifecycle
ports:
- containerPort: 9090
resources:
requests:
cpu: 500m
memory: 500M
limits:
cpu: 1
memory: 1Gi
volumeMounts:
- name: prometheus-config
mountPath: /etc/prometheus/
- name: prometheus-data
mountPath: /prometheus
- name: thanos
image: registry.cn-beijing.aliyuncs.com/wilsonchai/thanos:0.36.1
args:
- "sidecar"
- "--prometheus.url=http://localhost:9090"
- "--tsdb.path=/prometheus"
- "--objstore.config-file=/etc/thanos/bucket.yml"
volumeMounts:
- name: prometheus-data
mountPath: /prometheus
- name: bucket-config
mountPath: /etc/thanos/
volumes:
- name: prometheus-config
configMap:
defaultMode: 420
name: prometheus-cm
- name: bucket-config
configMap:
defaultMode: 420
name: bucket-cm
- emptyDir: {}
name: prometheus-data
由于上传对象存储的时间是30m,所以我们先继续下面的步骤,一会回头过来再回来检查minio中是否有文件上传
4. 部署thanos-store

部署方式同receive
调整thanos-query的配置,新增thanos-store的地址
docker run -d --net=host \
--name thanos-query \
registry.cn-beijing.aliyuncs.com/wilsonchai/thanos:0.36.1 \
query \
--http-address "0.0.0.0:39090" \
--grpc-address "0.0.0.0:39091" \
--store "192.168.49.2:30139" \
--store "192.168.49.2:31165" \
--store "10.22.11.156:10901"
添加完毕后,检查thanos-query的web页面

5. pod权限调整
万事俱备,回头去看看minio是否有文件上传,打开之后空空如也,怎么回事,去看一下thanos-sidecar的日志
kubectl -n prometheus logs prometheus-deploy-6f8c5549b9-rqqk6 -c thanos
...
ts=2024-10-30T06:03:23.704299583Z caller=sidecar.go:410 level=warn err="upload 01JBDQNT0RZH4GFCFC564RWZT7: hard link block: hard link file chunks/000001: link /prometheus/01JBDQNT0RZH4GFCFC564RWZT7/chunks/000001 /prometheus/thanos/upload/01JBDQNT0RZH4GFCFC564RWZT7/chunks/000001: operation not permitted" uploaded=0
怎么回事?没有权限,冷静分析一下thanos-sidecar的上传逻辑
- 首先数据文件是由prometheus产生的,thanos-sidecar上传文件应该直接使用prometheus产生的数据文件,这样是最简便的策略,不需要把文件复制到自己的目录,带来额外的磁盘消耗,
- 由于1个pod当中有2个container,带来的问题就是启动进程的用户与组是不一样的,再加上prometheus与thanos-sidecar使用同一个目录
/prometheus,2个pod分别在该目录下创建的子目录或文件权限不一致,到此初步判断是 因为2个pod不同的启动用户导致权限有问题 - 登录到prometheus的pod之后进入
/prometheus证实
/prometheus $ ls -lrt
total 44
-rw-r--r-- 1 nobody nobody 20001 Oct 30 02:46 queries.active
-rw-r--r-- 1 nobody nobody 0 Oct 30 02:46 lock
-rw-r--r-- 1 1001 root 37 Oct 30 03:31 thanos.shipper.json
drwxr-xr-x 3 nobody nobody 4096 Oct 30 03:31 01JBDQNT0RZH4GFCFC564RWZT7
- 再加上日志,源文件是在
/prometheus下,而thanos-sidecar会在/prometheus/thanos/下对源文件创建硬链接,先检查一下源文件
/prometheus/01JBDQNT0RZH4GFCFC564RWZT7/chunks $ ls -lrt
total 96
-rw-r--r-- 1 nobody nobody 88911 Oct 30 03:31 000001
- 源文件没有组的写权限,垂死病中惊坐起!创建硬链接是需要写权限的,快速验证一下
id
uid=1000(wilson) gid=1000(wilson) groups=1000(wilson)
touch /tmp/test
sudo chown root.root /tmp/test
sudo chmod 644 /tmp/test
ln /tmp/test /tmp/ttttt
ln: failed to create hard link '/tmp/ttttt' => '/tmp/test': Operation not permitted
到此为止,问题已经比较明朗了,1个pod的2个container,使用了不同的启动用户,创建出来的文件是不同用户的权限,同时他们共享了同一个目录,而prometheus创建的数据文件是644的权限,没有三方写权限。而thanos-sidecar需要把prometheus创建的数据文件创建硬链接到自己的目录,由于没有写权限,创建硬链接失败
解决方案有很多种,这里给出最简单的一种,因为是部署在k8s中的1个pod,只需要指定同一个启动用户去启动不同container即可
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: prometheus
name: prometheus-deploy
namespace: prometheus
spec:
...
template:
...
spec:
securityContext:
runAsUser: 555
containers:
...
加入securityContext,并且随便指定一个用户id,这里我随便指定了一个555,重启之后再登录prometheus查看

问题解决
联系我
- 联系我,做深入的交流
![]()
至此,本文结束
在下才疏学浅,有撒汤漏水的,请各位不吝赐教...
返璞归真--从零开始建设k8s监控之thanos-sidecar(七)的更多相关文章
- 详细教程丨使用Prometheus和Thanos进行高可用K8S监控
本文转自Rancher Labs 介 绍 Prometheus高可用的必要性 在过去的几年里,Kubernetes的采用量增长了数倍.很明显,Kubernetes是容器编排的不二选择.与此同时,Pro ...
- [转帖]从零开始入门 K8s:应用编排与管理:Job & DaemonSet
从零开始入门 K8s:应用编排与管理:Job & DaemonSet https://www.infoq.cn/article/KceOuuS7somCYbfuykRG 陈显鹭 阅读数:193 ...
- 从零开始入门 K8s | Kubernetes 存储架构及插件使用
本文整理自<CNCF x Alibaba 云原生技术公开课>第 21 讲. 导读:容器存储是 Kubernetes 系统中提供数据持久化的基础组件,是实现有状态服务的重要保证.Kubern ...
- k8s监控api调用
k8s监控api调用 curl -s --cacert /etc/kubernetes/ssl/ca.pem -basic -u fengjian:fengjian --insecure -X GET ...
- 从零开始搭建前端监控系统(三)——实现控制iframe前进后退
前言 本系列文章旨在讲解如何从零开始搭建前端监控系统. 项目已经开源 项目地址: https://github.com/bombayjs/bombayjs (web sdk) https://gith ...
- [转帖]从零开始入门 K8s | 手把手带你理解 etcd
从零开始入门 K8s | 手把手带你理解 etcd https://zhuanlan.zhihu.com/p/96721097 导读:etcd 是用于共享配置和服务发现的分布式.一致性的 KV 存储系 ...
- Kubernetes_从零开始搭建k8s集群(亲测可用)
一.前言 本文讲述从零开始搭建k8s集群,均使用国内镜像,版本均统一,使用两个虚拟机,一个主节点,一个从节点,保证k8s一次搭建成功. 注意:Kubernetes,简称K8s,是用8代替名字中间的8个 ...
- 从零开始入门 K8s | 可观测性:监控与日志
作者 | 莫源 阿里巴巴技术专家 一.背景 监控和日志是大型分布式系统的重要基础设施,监控可以帮助开发者查看系统的运行状态,而日志可以协助问题的排查和诊断. 在 Kubernetes 中,监控和日志 ...
- prometheus和metrucs-server (k8s监控)
资源指标:metrucs-server 自定义指标:prometheus, k8s-prometheus-adapter(转换prometheus数据的格式) 新一代架构: 核心指标流水线:由kube ...
- 从零开始入门 K8s| 详解 Pod 及容器设计模式
作者|张磊 阿里云容器平台高级技术专家,CNCF 官方大使 一.为什么需要 Pod 容器的基本概念 我们知道 Pod 是 Kubernetes 项目里面一个非常重要的概念,也是非常重要的一个原子调度单 ...
随机推荐
- 【译】Visual Studio 2022 v17.14 现已正式发布!
我们很高兴地宣布 Visual Studio 2022 17.14 正式发布!此版本延续了我们的使命--为开发者提供更快.更智能且更高效的工具,以应对各种开发工作. 在这个版本中有很多开发者喜欢的东西 ...
- 最炫酷的企业 AI 助手来啦(含前端源码)!
最近越来越多的企业开始将 MaxKB 在他们企业当中的应用场景官宣了.有时候我们会疑问,这真的是 MaxKB 做的吗? MaxKB 你怎么还能动的? 案例一:医疗资源小助手开场白 效果展示: 源码: ...
- 使用Spring AOP 和自定义注解统一API返回值格式
摘要:统一接口返回值格式后,可以提高项目组前后端的产出比,降低沟通成本.因此,在借鉴前人处理方法的基础上,通过分析资料,探索建立了一套使用Spring AOP和自定义注解无侵入式地统一返回数据格式的方 ...
- mysql页中的行记录头部信息
mysql中具体的数据是存储在行中的,而行是存储在页中的.也就是说页是凌驾于行之上的. mysq一个页大小为16K,当然这个大小是可以通过修改配置文件来改变的. mysql页结构大致示意图: 当我们新 ...
- Svelte 5 在跨平台 AI 阅读助手中的实践:轻量化前端架构的极致性能优化
一.引言:为什么选择 Svelte 5 来构建 Saga Reader 的前端? 作为一个典型的前端开发者,去年在为公司调研Rust前端工具链.LLM应用开发技术体系的时候,对这类技术领域产生了浓厚的 ...
- xshell里面实现kafka一对一发送和接收消息测试
1.连接相关xshell,打开两个窗口一个给生产者用一个给消费者用 在生产者里输入:./kafka-console-producer.sh --broker-list localhost:9092 - ...
- MeterSphere V2.x 添加数据库驱动
MeterSphere V2.x 添加数据库驱动 背景 在使用 MeterSphere 进行接口测试时,会遇到一些接口场景,需要先查询数据库获取特定数据,再将查询结果作为请求参数传递给后续接口.然而, ...
- 利用DNSLOG测试Fastjson远程命令执行漏洞
由于内容比较简单,我直接贴图,怕我自己忘了. 测试Fastjson版本号:1.2.15 直接发送用burpsuite发送payload,将dataSourceName改成dnslog获取到的域名. p ...
- 那些年拿过的shell之adminer
扫敏感文件扫到一个adminer 第三次遇到了,先看版本4.2.5比较低可以利用mysql服务端读客户端文件漏洞(高版本修复了). 通过报错得到这个站是linux.虚拟主机.thinkphp3.绝对路 ...
- 插件报错:SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder“.解决方案
今天在用Maven搞一个工程,安装要求我添加了所有需要的依赖,可是一运行测试程序,就跳出这样一个大大的错误: SLF4J: Failed to load class "org.slf4j.i ...
