Prometheus高可用Thanos学习(1)-sidercar和query

最近工作中的主要任务都是在业务的高可用上,由于项目中使用到了Promethues,所以也花了一些时间研究了一下Promethues的高可用方案。发现也没有blog告诉怎么去deploy一个Thanos的集群,所以本文也会给出deploy的方法和源文件(本人也是一边试用一边总结,如果理解有错,请帮忙矫正)

由于Promethues本身仅是一个采样系统,如果做成master-slave模式,存在切换开销,并且增加系统的复杂性。因此官方给出的高可用建议方案如下图,使用多个对等的Promethues,对所有的DataSource均进行采样。这里的Service是K8S的Service,所以理论上访问该Service会随机地访问后端的两个Promethues。

Prometheus HA

上面方案中,当其中一个Promethues pod中断时,K8S会将流量仅导向另外一个pod。但是pod中断期间,其无法获取数据,因此当中断的pod恢复之后,在存储端,需要进行sync。可是,何时sync,怎么sync是一个比较复杂的问题,就算能解决这两个问题,实际生产环境中进行文件sync,本身也会存在各式各样的风险。

所以Thanos就没有使用存储端Sync的方法来保证数据的一致性,而是采用才query端对查询到的数据进行合并。下面会简单介绍一下Thanos的原理。

1. Thanos基本原理

基于官方的介绍,我将Thanos的架构简化,仅保存最基本的,我所关心的部分如下, 主要包含3部分:

  1. Thanos Query. 主要是对从Promethues Pod采集来的数据进行merge,提供查询接口给客户端(官方文档上暂时没看到merge的原理,这篇总结之后需要花些时间看源码学习一下);
  2. Thanos SideCar. 将Promethues container的数据进行封装,以提供接口给Thanos Query(实际上SideCar还能提供更多用处,但是这里暂时我们仅关心数据查询,后面再进一步研究,暂时不要图多);
  3. Prometheus Container. 采集数据,通过Remote Read API提供接口给Thanos SideCar
Thanos.png

2. Thanos部署

学习一样新工具,部署和使用是必不可少的,暂时我也没看到网上有现成的thanos部署方法。通过修改官网的demo文件,这里我成功的部署了sidecar和query, 能够实现一个最basic的Promethues高可用集群。你可以直接下载我的源文件部署一个thanos的实验环境。

2.1 Prometheus和SideCar

由于涉及的yaml文件比较多,这里我只是截取最重要的部分解释一下, 首先我们创建一个replicas为2的statefulset, 每个pod里面包含一个PromethuesSideCar容器。

---
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
  name: prometheus
  labels:
    app: prometheus
spec:
  serviceName: "prometheus"
  replicas: 2
  selector:
    matchLabels:
      app: prometheus
  template:
    metadata:
      labels:
        app: prometheus
        # We will use this label to put all StoreAPis
        # under the same headless service for
        # SRV lookup: thanos-store-api.default.svc
        thanos-store-api: "true"
    spec:
      securityContext:
        runAsUser: 1000
        fsGroup: 2000
        runAsNonRoot: true
      serviceAccountName: prometheus
      containers:
      - name: prometheus
        image: quay.io/prometheus/prometheus:v2.6.1
        args:
          - --config.file=/etc/prometheus-shared/prometheus.yaml
          - --storage.tsdb.path=/var/prometheus
          - --web.enable-lifecycle
          # TODO: Make retention shorter once all old blocks will be uploaded (!)
          - --storage.tsdb.retention=2w
          # Disable compaction.
          - --storage.tsdb.min-block-duration=2h
          - --storage.tsdb.max-block-duration=2h
          - --web.enable-admin-api
        ports:
          - name: http-prometheus
            containerPort: 9090
        volumeMounts:
          - name: config-shared
            mountPath: /etc/prometheus-shared
          - name: rules
            mountPath: /etc/prometheus/rules
          - name: prometheus
            mountPath: /var/prometheus
      - name: thanos
        image: improbable/thanos:v0.3.0
        args:
          - sidecar
          - --log.level=debug
          - --tsdb.path=/var/prometheus
          - --prometheus.url=http://localhost:9090
          - --cluster.disable
          - --reloader.config-file=/etc/prometheus/prometheus.yaml.tmpl
          - --reloader.config-envsubst-file=/etc/prometheus-shared/prometheus.yaml
        env:
          - name: POD_NAME
            valueFrom:
              fieldRef:
                fieldPath: metadata.name
        ports:
          - name: http-sidecar
            containerPort: 10902
          - name: grpc
            containerPort: 10901

上面可以看到SideCar使用的是10901这个port暴露服务,因此为了让Query能够访问SideCar, 这里我们需要暴露两个Service:

---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: prometheus
  name: sidecar-0
spec:
  ports:
    - port: 10901
      protocol: TCP
      targetPort: grpc
      name: grpc
      nodePort: 30901
  selector:
    statefulset.kubernetes.io/pod-name: prometheus-0
  type: NodePort
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: prometheus
  name: sidecar-1
spec:
  ports:
    - port: 10901
      protocol: TCP
      targetPort: grpc
      name: grpc
      nodePort: 30902
  selector:
    statefulset.kubernetes.io/pod-name: prometheus-1
  type: NodePort

2.2 Query

有了Prometheus的pod,现在我们就可以部署Query的Pod啦, 这里的192.168.56.101是我的实验环境的IP,所以需要您改成自己的IP,3090130902就是之前部署的SideCar的Service:

      containers:
      - name: thanos
        image: improbable/thanos:v0.3.0
        args:
        - query
        - --log.level=debug
        - --query.replica-label=replica
        - --cluster.disable
        # Discover local store APIs using DNS SRV.
        - --store=dnssrv+thanos-store-gateway.default.svc
        # Get remote store APIs by IP:Port.
        - --store=192.168.56.101:30901
        - --store=192.168.56.101:30902

部署完毕之后,我们就可以去访问Query的Service啦,这里我创建的是一个30903的nodePort用来暴露服务, 所以访问该端口192.168.56.101:30903就能看到Thanos的界面啦。这里,我没有勾上deduplication,所以thanos不会帮我合并,所以能够看到prometheus-0prometheus-1的数据。

nomerge.png

如果勾上deduplication,结果会根据replica这个label进行合并(简单看了一下源码,如果两个pod都有数据,query会取timestamp更小的结果):

merge.png

小结

这篇blog简单介绍了thanos,学习的顺序应当是先使用,感受一下,再仔细研究。Thanos另外还有Rule, Compact, Bucket几个重要的模块,后面有时间会再整理一下。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容