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

2020-10-24 15:23:06 浏览数 (1)

业务在使用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

0 人点赞