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