8

istio学习笔记(5)-prometheus配置改造

 3 years ago
source link: http://vearne.cc/archives/39424
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

istio学习笔记(5)-prometheus配置改造

版权声明 本站原创文章 由 萌叔 发表
转载请注明 萌叔 | http://vearne.cc

警告:本文仅用于萌叔自己总结之用,对其它人而言可能毫无营养,没有阅读价值。

要让一个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)中的指标都是标准指标

根据参考资料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

请我喝杯咖啡

微信支付码


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK