前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >腾讯云TKE-搭建prometheus监控(一)

腾讯云TKE-搭建prometheus监控(一)

原创
作者头像
赵思晨
修改2020-10-24 15:23:06
3.4K1
修改2020-10-24 15:23:06
举报

业务在使用TKE容器服务过程中,需要对集群情况、节点情况、业务pod情况等进行监控。而当集群规模较大时,业务pod种类繁多,如何进行全面的监控一大痛点。prometheus的诞生很好的解决了这个问题。

本文基于prometheus,手把手教你如何在TKE上搭建全面的平台和业务监控,为业务保驾护航。

一、prometheus简介

Prometheus是由SoundCloud开发的开源监控报警系统和时序列数据库(TSDB)。Prometheus使用Go语言开发,是Google BorgMon监控系统的开源版本。

2016年由Google发起Linux基金会旗下的原生云基金会(Cloud Native Computing Foundation), 将Prometheus纳入其下第二大开源项目。

官网:https://prometheus.io/

Prometheus的特点:

  • 多维度数据模型。
  • 灵活的查询语言。
  • 不依赖分布式存储,单个服务器节点是自主的。
  • 通过基于HTTP的pull方式采集时序数据。
  • 可以通过中间网关进行时序列数据推送。
  • 通过服务发现或者静态配置来发现目标服务对象。
  • 支持多种多样的图表和界面展示,比如Grafana等。

Prometheus三大套件

  • Server 主要负责数据采集和存储,提供PromQL查询语言的支持。
  • Alertmanager 警告管理器,用来进行报警。
  • Push Gateway 支持临时性Job主动推送指标的中间网关。

二、在TKE上安装Prometheus

prometheus的server端安装,有几种方式:源码编译安装、二进制安装、docker安装。

本文采用docker即pod形式安装,这样可以通过service暴露到公网访问。也推荐生产环境采用pod形式安装。

1、在docker官网下载prometheus官方镜像:

代码语言:javascript
复制
docker pull prom/prometheus   

2、准备promtheus配置文件prometheus.yml

该文件可从官网下载,这里直接贴出:

代码语言:javascript
复制
global:
  scrape_interval:     15s # By default, scrape targets every 15 seconds.

  # Attach these labels to any time series or alerts when communicating with
  # external systems (federation, remote storage, Alertmanager).
  external_labels:
    monitor: 'codelab-monitor'

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'prometheus'

    # Override the global default and scrape targets from this job every 5 seconds.
    scrape_interval: 5s

    static_configs:
      - targets: ['localhost:9090']

后续的监控配置,都需要修改此文件。

该文件的字段解释如下:

global:是一些全文设置,而后面具体的job里可以重写这些配置,进行覆盖。

scrape_interval:抓取间隔,这里设置的是15秒抓取一次数据。

job_name:一个抓取任务的名字

static_configs:静态设置

targets:目标就是一个exporter的接口,通过这个接口,获取上报的监控数据。

3、把镜像加工后推送到腾讯云镜像仓库

prometheus需要该文件进行配置,那么怎么把这个文件传入到pod里呢?有两种方式:

a)写dockerfile,把配置文件ADD到镜像中。

dockerfile内容如下:

代码语言:javascript
复制
FROM prom/prometheus
ADD ./prometheus.yml /etc/prometheus/

然后生成镜像:

代码语言:javascript
复制
docker build -t ccr.ccs.tencentyun.com/xxx/my-prometheus:1.0 -f Dockerfile .

再push到镜像仓库即可。

b)把配置文件作为configmap,再把该cm挂载到pod的/etc/prometheus/目录下。

代码语言:javascript
复制
prometheus.cm.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: prometheus-config
  namespace: kube-system 
  labels:
    kubernetes.io/cluster-service: "true"
    addonmanager.kubernetes.io/mode: EnsureExists
data:
  # 存放prometheus配置文件
  prometheus.yml: |
    # 配置采集目标
    scrape_configs:
    - job_name: prometheus
      static_configs:
      - targets:
        # 采集自身
        - localhost:9090

此方式,只需要将下载的镜像重新tag为腾讯云镜像仓库名称即可直接push。cm的挂载在新建pod中。

该方式比较灵活,因此本文采用这种方式进行配置。

4、新建RBAC访问权限

rbac_prom.yaml

代码语言:javascript
复制
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: prometheus
rules:
- apiGroups: [""]
  resources:
  - nodes
  - pods
  - endpoints
  - services
  verbs: ["get", "list", "watch"]
- nonResourceURLs: ["/metrics"]
  verbs: ["get"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: prometheus
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: prometheus
subjects:
- kind: ServiceAccount
  name: prometheus
  namespace: grant-tcr-test
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: prometheus
  namespace: grant-tcr-test

通过RBC创建ClusterRole,ServiceAccount以及ClusterRoleBinding从而确保Promethues可以通过kubernetes API访问到全局资源信息

代码语言:javascript
复制
kubectl create -f rbac_prom.yaml

5、新建prometheus workload。

首先根据上个步骤的cm,创建configmap。

代码语言:javascript
复制
kubectl create -f prometheus-config.yaml

然后,在腾讯云TKE界面上,新建deployment类型的workload。选择之前上传的prometheus镜像。再挂载该configmap,挂载点选择/etc/prometheus/

先添加数据卷
先添加数据卷
添加数据卷的挂载点
添加数据卷的挂载点

要注意,prometheus的pod的servicecount要选择第三步创建的prometheus,不然无法访问k8s的资源。

等pod处于running状态,即可通过pod ip:9090访问prometheus的web ui了:

出现此界面,表示prometheus运行正常。

在框内输入:prometheus_target_interval_length_seconds,得到如下结果:

三、安装exporter并进行监控

这里以node exporter为例,以damonset的形式在每个node上都运行一个副本。node-exporter的yam如下:

代码语言:javascript
复制
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
name: node-exporter
spec:
template:
metadata:
  labels:
    app: node-exporter
  name: node-exporter
spec:
  containers:
  - image: prom/node-exporter:latest
    name: node-exporter
    ports:
    - containerPort: 9100
      hostPort: 9100
      name: scrape
  hostNetwork: true
  hostPID: true
  restartPolicy: Always

然后利用headless service,暴露damonset的9100端口。

service.yaml

代码语言:javascript
复制
apiVersion: v1
kind: Service
metadata:
annotations:
prometheus.io/scrape: 'true'
labels:
app: node-exporter
name: node-exporter
name: node-exporter
spec:
clusterIP: None
ports:
- name: scrape
port: 9100
protocol: TCP
selector:
app: node-exporter

在Service中定义标注prometheus.io/scrape: ‘true’,表明该Service需要被promethues发现并采集数据

启动完成后,在prometheus.yml文件里,加上node指标上报的job:

代码语言:javascript
复制
# my global config
global:
  scrape_interval:     15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

# Alertmanager configuration
alerting:
  alertmanagers:
  - static_configs:
    - targets:
       - 172.16.32.15:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  - 'prometheus.rules.yml'
  # - "first_rules.yml"
  # - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'prometheus'

    static_configs:
    - targets: ['localhost:9090']


  - job_name:       'node'

    # Override the global default and scrape targets from this job every 5 seconds.
    scrape_interval: 5s
    
    static_configs:
    - targets: ['172.16.32.15:9100','172.16.32.8:9100','172.16.32.16:9100']
      labels:
        group: 'production'

销毁重建prometheus的pod后,再打开prometheus的web ui,在target处可以发现新增了node监控,如下:

这表明,node exporter已经成功运行,并且成功和pronetheus的server连接上。

可以在查询处,输入node,会出现node系列的监控指标:

四、实现api server监控

在prometheus.yml中加上api server监控的job:

代码语言:javascript
复制
  - job_name: 'kubernetes-apiservers'
    scheme: https
    kubernetes_sd_configs:
    - role: endpoints

    tls_config:
      ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
    bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token

    relabel_configs:
    - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
      action: keep
      regex: default;kubernetes;https

参数解释如下:

scheme:http还是https协议,默认是http,api server采用https方式通信,因此这些要写成https

role:prometheus对于k8s的监控,分为几种角色,node、pod、endpoint、ingress等。api server暴露的是endpoint类型接口。

tlc_config:指的是https认证的证书信息,其中ca_file指的是认证证书。bearer_token_file指的是用token进行认证。

relabel_configs表示,对label进行二次过滤或命名。对source_labels的内容中匹配__meta_kubernetes_namespace=default,__meta_kubernetes_service_name=kubernetes,__meta_kubernetes_endpoint_port_name=https的,keep,即保留。其他值则全部丢弃。

然后重启prometheus pod后,web ui的target处会多出kubernetes-apiservers的target:

在查询处,输入apisever,会出现相关指标:

表明api server监控成功。

五、总结

本文详细描述了如何在TKE上搭建prometheus监控平台,以及如何安装exporter和api server监控。

下一篇文章将继续描述如何基于TKE实现告警和图形化界面监控。

参考文章:

https://prometheus.io/docs/prometheus/latest/configuration/recording_rules/

https://github.com/prometheus/prometheus/blob/release-2.22/documentation/examples/prometheus-kubernetes.yml

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、prometheus简介
    • Prometheus的特点:
      • Prometheus三大套件
      • 二、在TKE上安装Prometheus
        • 1、在docker官网下载prometheus官方镜像:
          • 2、准备promtheus配置文件prometheus.yml
            • 3、把镜像加工后推送到腾讯云镜像仓库
              • 4、新建RBAC访问权限
                • 5、新建prometheus workload。
                • 三、安装exporter并进行监控
                • 四、实现api server监控
                • 五、总结
                  • 参考文章:
                  相关产品与服务
                  容器服务
                  腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档