Fork me on GitHub

版权声明 本站原创文章 由 萌叔 发表
转载请注明 萌叔 | http://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

参考资料

  1. A Deep Dive into Kubernetes Metrics
  2. Prometheus:management API
  3. prometheus: configuration
  4. 整合prometheus

请我喝杯咖啡

微信支付码

发表评论

电子邮件地址不会被公开。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据