一、前言

不同于传统平台的监控,在容器云平台由于POD的易变动性,所以需要更加container native的监控解决方案,Prometheus就是这样一个适合kubernetes平台的容器云监控解决方案。

Prometheus已经成为CNCF的项目,能够和Kubernetes很好的集成。Prometheus和Kubernetes集成有两种方式,一种是使用prometheus-operator,另外一种是使用relabel机制。

在prometheus收集到数据之后,可以使用Grafana定义合适的数据表示方式进行展示。

转载自

转载自

二、使用preometheus-operator监控kubernetes

Prometheus Operator是一个处于alpha阶段的解决方案,它通过定义新的ServiceMonitor和prometheus(TPR/CRD),将Kubernetes的POD、Service资源同Prometheus服务进行动态连接,在operation级别提供基于Prometheus的Kubernetes平台上应用的监控方案。

这个方案需要部署一个ServiceMonitor资源对象,这个ServiceMonitor资源对象需要通过selector选择一个或者多个服务(当然前提是这些服务的POD已经暴露了满足prometheus接口需求的metrics数据)作为监控对象;还要部署一个prometheus资源对象,这个prometheus资源对象需要通过serviceMonitorSelector选择需要关注的ServiceMonitor资源对象;最后,这个方案还会自动部署一个prometheus server来收集和存储各个POD暴露的监控数据,并且提供一个GUI服务对数据进行进一步计算和展示。

Prometheus监控mysql定位慢sql prometheus监控pod_grafana

从应用到监控的部署流程如下:

  • 首先在kubernetes setup的时候建立对Prometheus Operator的支持(通过部署Prometheus Operator manifest,会引入prometheus和ServiceMonitor这两个CRD,而且会启动一个带有一定系统处理权限的POD对这些新的CDR进行释义操作)
  • 部署一个application的kubernetes deployment
  • 部署一个application的kubernetes service,这个service使用selector选择各个部署的deployment作为它的endpoints
  • 部署一个kubernetes ServiceMonitor,使用和service一样的selector并且定义收集metrics的端口
  • 部署一个Prometheus CDR并且通过serviceMonitorSelector选择之前建立的ServiceMonitor作为监控目标
  • 部署一个prometheus instance的service来将prometheus服务对外暴露,便于查看UI
  • 在此之后,application的kubernetes deployment里面POD的变化将会自动被prometheus捕获并更新到metric收集

在这个使用Prometheus Operator进行监控的测试中,一开始deployment有4个replica:

Prometheus监控mysql定位慢sql prometheus监控pod_prometheus_02

之后将replica扩展到10,prometheus会自动捕获这个更新从而自动对新的POD进行监控:

Prometheus监控mysql定位慢sql prometheus监控pod_告警_03

转载自

三、使用relabel机制进行监控

relabel机制通过标签机制灵活的选择监控目标比如node、POD、service、endpoints等。

具体的部署流程如下:

  • 部署一个满足prometheus运行权限要求的cluster role和service account
- apiGroups: [""]
  resources:
  - nodes
  - nodes/proxy
  - services
  - endpoints
  - pods
  verbs: ["get", "list", "watch"]
- nonResourceURLs: ["/metrics"]
  verbs: ["get"]
  • 部署一个ConfigMap,承载prometheus的配置
  • 部署运行prometheus服务的POD
  • 部署暴露prometheus服务的kubernetes service
  • 部署带有prometheus标签的应用


prometheus通过配置文件定义它自己的监控行为,比如在如下配置中,可以对添加来prometheus标签的service的endpoints进行动态监控:

scrape_configs:
- job_name: 'kubernetes-apiservers'

  kubernetes_sd_configs:
  - role: endpoints

  # Default to scraping over https. If required, just disable this or change to
  # `http`.
  scheme: https
  tls_config:
  bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token

  # Keep only the default/kubernetes service endpoints for the https port. This
  # will add targets for each API server which Kubernetes adds an endpoint to
  # the default/kubernetes service.
  relabel_configs:
  - target_label: __address__
    replacement: kubernetes.default.svc:443
  - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
    action: keep
    regex: default;kubernetes;https


而在部署application的service时候需要为这个service指定标签:


kind: Service
apiVersion: v1
metadata: 
  annotations:
    prometheus.io/port: "8082"
    prometheus.io/scrape: "true"
  namespace: prometheus
  name: httpd
  labels:
    tier: frontend
spec: 
  selector: 
    app: http 
  ports:
  - name: web
    protocol: TCP
    port: 80
    targetPort: web
  - name: metrics
    port: 8082
    targetPort: metrics
    protocol: TCP

在deployment部署之后,prometheus会自动检测到service的这些POD并进行监控:

Prometheus监控mysql定位慢sql prometheus监控pod_prometheus_04

并且可以查看简略的运行状态图表:




Prometheus监控mysql定位慢sql prometheus监控pod_监控_05


转载自


四、grafana图表展示

grafana可以使用prometheus最为展示的数据源:

 

Prometheus监控mysql定位慢sql prometheus监控pod_告警_06

通过grafana可以定义复杂的监控算法生产易于人眼观察的图表:

Prometheus监控mysql定位慢sql prometheus监控pod_Kubernetes_07

也可以定义特定条件的告警:

Prometheus监控mysql定位慢sql prometheus监控pod_Kubernetes_08


这些告警可以通过如下方式定义traffic_alert_rule.yml:


Prometheus监控mysql定位慢sql prometheus监控pod_告警_09