打造云原生大型分布式监控系统(四): Kvass+Thanos 监控超大规模容器集群

概述

继上一篇 Thanos 部署与实践 发布半年多以后,随着技术的发展,本系列又迎来了一次更新。本文将介绍如何结合 Kvass 与 Thanos,来更好的实现大规模容器集群场景下的监控。git

有 Thanos 不够吗 ?

有同窗可能会问,Thanos 不就是为了解决 Prometheus 的分布式问题么,有了 Thanos 不就能够实现大规模的 Prometheus 监控了吗?为何还须要个 Kvass?
Thanos 解决了 Prometheus 的分布式存储与查询的问题,但没有解决 Prometheus 分布式采集的问题,若是采集的任务和数据过多,仍是会使 Prometheus 达到的瓶颈,不过对于这个问题,咱们在系列的第一篇 大规模场景下 Prometheus 的优化手段 中就讲了一些优化方法:github

  1. 从服务维度拆分采集任务到不一样 Prometheus 实例。
  2. 使用 Prometheus 自带的 hashmod 对采集任务作分片。

可是,这些优化方法仍是存在一些缺点:架构

  1. 配置繁琐,每一个 Prometheus 实例的采集配置都须要单独配。
  2. 须要提早对数据规模作预估才好配置。
  3. 不一样 Prometheus 实例采集任务不一样,负载极可能不太均衡,控制很差的话仍然可能存在部分实例负载太高的可能。
  4. 如需对 Prometheus 进行扩缩容,须要手动调整,没法作到自动扩缩容。

Kvass 就是为了解决这些问题而生,也是本文的重点。app

什么是 Kvass ?

Kvass 项目是腾讯云开源的轻量级 Prometheus 横向扩缩容方案,其巧妙的将服务发现与采集过程分离,并用 Sidecar 动态给 Prometheus 生成配置文件,从而达到无需手工配置就能实现不一样 Prometheus 采集不一样任务的效果,而且可以将采集任务进行负载均衡,以免部分 Prometheus 实例负载太高,即便负载高了也能够自动扩容,再配合 Thanos 的全局视图,就能够轻松构建只使用一份配置文件的超大规模集群监控系统。下面是 Kvass+Thanos 的架构图:负载均衡

img

更多关于 Kvass 的详细介绍,请参考 如何用 Prometheus 监控十万 container 的 Kubernetes 集群 ,文章中详细介绍了原理和使用效果。运维

部署实践

部署准备

首先下载 Kvass 的 repo 并进入 examples 目录:分布式

git clone https://github.com/tkestack/kvass.git
cd kvass/examples

在部署 Kvass 以前咱们须要有服务暴露指标以便采集,咱们提供了一个 metrics 数据生成器,能够指定生成必定数量的 series,在本例子中,咱们将部署 6 个 metrics 生成器副本,每一个会生成 10045 series,将其一键部署到集群:ide

kubectl create -f  metrics.yaml

部署 Kvass

接着咱们来部署 Kvass:优化

kubectl create -f kvass-rbac.yaml # Kvass 所需的 RBAC 配置
kubectl create -f config.yaml # Prometheus 配置文件
kubectl create -f coordinator.yaml # Kvass coordinator 部署配置

其中,config.yaml 的 Prometheus 配置文件,配了对刚才部署的 metrics 生成器的采集:lua

global:
  scrape_interval: 15s
  evaluation_interval: 15s
  external_labels:
    cluster: custom
scrape_configs:
- job_name: 'metrics-test'
  kubernetes_sd_configs:
    - role: pod
  relabel_configs:
  - source_labels: [__meta_kubernetes_pod_label_app_kubernetes_io_name]
    regex: metrics
    action: keep
  - source_labels: [__meta_kubernetes_pod_ip]
    action: replace
    regex: (.*)
    replacement: ${1}:9091
    target_label: __address__
  - source_labels:
    - __meta_kubernetes_pod_name
    target_label: pod

coordinator.yaml 咱们给 Coordinator 的启动参数中设置每一个分片的最大 head series 数目不超过 30000:

--shard.max-series=30000

而后部署 Prometheus 实例(包含 Thanos Sidecar 与 Kvass Sidecar),一开始能够只须要单个副本:

kubectl create -f prometheus-rep-0.yaml
若是须要将数据存储到对象存储,请参考上一篇 Thanos 部署与实践 对 Thanos Sidecar 的配置进行修改。

部署 thanos-query

为了获得全局数据,咱们须要部署一个 thanos-query:

kubectl create -f thanos-query.yaml

根据上述计算,监控目标总计 6 个 target, 60270 series,根据咱们设置每一个分片不能超过 30000 series,则预期须要 3 个分片。咱们发现,Coordinator 成功将 StatefulSet 的副本数改为了 3。

$ kubectl get pods
NAME                                READY   STATUS    RESTARTS   AGE
kvass-coordinator-c68f445f6-g9q5z   2/2     Running   0          64s
metrics-5876dccf65-5cncw            1/1     Running   0          75s
metrics-5876dccf65-6tw4b            1/1     Running   0          75s
metrics-5876dccf65-dzj2c            1/1     Running   0          75s
metrics-5876dccf65-gz9qd            1/1     Running   0          75s
metrics-5876dccf65-r25db            1/1     Running   0          75s
metrics-5876dccf65-tdqd7            1/1     Running   0          75s
prometheus-rep-0-0                  3/3     Running   0          54s
prometheus-rep-0-1                  3/3     Running   0          45s
prometheus-rep-0-2                  3/3     Running   0          45s
thanos-query-69b9cb857-d2b45        1/1     Running   0          49s

咱们再经过 thanos-query 来查看全局数据,发现数据是完整的(其中 metrics0 为指标生成器生成的指标名):

img

img

若是须要用 Grafana 面板查看监控数据,能够添加 thanos-query 地址做为 Prometheus 数据源: http://thanos-query.default.svc.cluster.local:9090

小结

本文介绍了如何结合 Kvass 与 Thanos 来实现超大规模容器集群的监控,若是你使用了腾讯云容器服务,能够直接使用运维中心下的 云原生监控 服务,此服务就是基于 Kvass 构建的产品。

【腾讯云原生】云说新品、云研新术、云游新活、云赏资讯,扫码关注同名公众号,及时获取更多干货!!
相关文章
相关标签/搜索