istio学习笔记(5)-prometheus配置改造
版权声明 本站原创文章 由 萌叔 发表
转载请注明 萌叔 | https://vearne.cc
1. 前言
警告:本文仅用于萌叔自己总结之用,对其它人而言可能毫无营养,没有阅读价值。
要让一个k8s + istio的集群真正能够在生产可用,我们需要考虑如下几类指标。
- Node Metrics
- Container Resource Metrics
- Kubernetes API Server
- Etcd metrics
- Kube state-metrics
对于准备上集群的服务而言,我们会比较关注
1. 服务所在容器的CPU、内存、网络流量、磁盘使用率等
2. 业务指标:QPS、StatusCode、ErrorCode、请求延迟、缓存使用情况,连接池等
其中很大一部分其实都是标准指标,所有的服务都应该会有。另外istio已经对container的输入和输出流量进行了拦截,基于这些条件。萌叔希望达到如下效果
目标
- 1) 通过prometheus的自动发现功能,发现并监控Container Resource Metrics
- 2) 通过prometheus的自动发现功能,发现并监控envoy拦截到的部分指标
- 3)通过prometheus的自动发现功能,发现并监控app暴露的prometheus metrics
- 4) 对于标准指标实现在grafana上的自动配置(生成Dashboard和Graph)
显然对于1)2)中的指标都是标准指标
2. 配置
根据参考资料4的说法
spec:
template:
metadata:
annotations:
prometheus.io/scrape: true # determines if a pod should be scraped. Set to true to enable scraping.
prometheus.io/path: /metrics # determines the path to scrape metrics at. Defaults to /metrics.
prometheus.io/port: 80 # determines the port to scrape metrics at. Defaults to 80.
服务本身如果想暴露自己的指标,可以通过在pod上增加注释prometheus.io/scrape
prometheus.io/path
prometheus.io/port
。 但是实际使用中我发现注入了istio之后,这3项的值已经被修改为
prometheus.io/path: /stats/prometheus
prometheus.io/port: '15020'
prometheus.io/scrape: 'true'
app本身的待监控地址无法正常暴露
另外,envoy通过http://{envoy}:15090/stats/prometheus
地址也暴露服务被拦截并采集到的标准指标,有一定的价值。
对于这2部分指标,都应该采集到,所以需要对prometheus的配置进行改造。
3. 配置改造
如果读者是使用的Helm安装的prometheus,那么你会发现,Prometheus实例所在的Pod(名称形如:xxx-prometheus-server-c64894d95-k9fmq)中,有2个容器。
name | image | comment |
---|---|---|
prometheus-server-configmap-reload | jimmidyson/configmap-reload:v0.4.0 | 辅助容器 |
prometheus-server | prom/prometheus:v2.21.0 | 主容器 |
这2个容器通过共享卷通讯
Deployment
名称形如
# 定义 volume
volumes:
- name: config-volume
configMap:
name: monitor-prometheus-server
defaultMode: 420
# 2个容器都会挂载同一个volume
"volumeMounts": [{
"name": "config-volume",
"readOnly": true,
"mountPath": "/etc/config"
}],
ConfigMap
名字形如 xxx-prometheus-server
kind: ConfigMap
apiVersion: v1
metadata:
name: monitor-prometheus-server
namespace: monitoring
labels:
app: prometheus
chart: prometheus-7.1.8
component: server
heritage: Tiller
release: monitor
data:
alerts: ...
prometheus.yml: ...
rules: |
{}
ConfigMap
挂载以后,对应的key、value会被映射成/"/etc/config"中的文件
prometheus-server-configmap-reload负责监视"/etc/config"文件夹,如果文件有发生变化,它会执行webhook,请求 "POST http://127.0.0.1:9090/-/reload", 让prometheus-server重载配置
直接修改 ConfigMap
即可增加2个job
# 3.1 负责发现并抓取app暴露的监控端口
- job_name: myk8s-pods
kubernetes_sd_configs:
- role: pod
relabel_configs:
- action: keep
regex: true
source_labels:
- __meta_kubernetes_pod_annotation_myk8s_scrape
- action: replace
regex: (.+)
source_labels:
- __meta_kubernetes_pod_annotation_myk8s_path
target_label: __metrics_path__
- action: replace
regex: ([^:]+)(?::\d+)?;(\d+)
replacement: $1:$2
source_labels:
- __address__
- __meta_kubernetes_pod_annotation_myk8s_port
target_label: __address__
- action: labelmap
regex: __meta_kubernetes_pod_label_(.+)
- action: replace
source_labels:
- __meta_kubernetes_namespace
target_label: kubernetes_namespace
- action: replace
source_labels:
- __meta_kubernetes_pod_name
target_label: kubernetes_pod_name
# 3.2 负责发现并抓取envoy暴露的监控端口
- job_name: envoy-pods
kubernetes_sd_configs:
- role: pod
relabel_configs:
- action: keep
regex: true
source_labels:
- __meta_kubernetes_pod_annotation_myk8s_scrape
- action: replace
regex: (.+)
replacement: /stats/prometheus
target_label: __metrics_path__
- action: replace
regex: ([^:]+)(?::\d+)?
replacement: $1:15090
source_labels:
- __address__
target_label: __address__
- action: labelmap
regex: __meta_kubernetes_pod_label_(.+)
- action: replace
source_labels:
- __meta_kubernetes_namespace
target_label: kubernetes_namespace
- action: replace
source_labels:
- __meta_kubernetes_pod_name
target_label: kubernetes_pod_name
3.1 负责发现并抓取app暴露的监控端口
注意: pod的注释部分需要有
myk8s/scrape: true
myk8s/port: 9090
myk8s/path: /metrics
3.2 负责发现并抓取envoy暴露的监控端口
pod的注释部分需要有
myk8s/scrape: true
参考资料
- A Deep Dive into Kubernetes Metrics
- Prometheus:management API
- prometheus: configuration
- 整合prometheus