一、前言
不同于传统平台的监控,在容器云平台由于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服务对数据进行进一步计算和展示。
从应用到监控的部署流程如下:
- 首先在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:
之后将replica扩展到10,prometheus会自动捕获这个更新从而自动对新的POD进行监控:
转载自
三、使用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并进行监控:
并且可以查看简略的运行状态图表:
转载自
四、grafana图表展示
grafana可以使用prometheus最为展示的数据源:
通过grafana可以定义复杂的监控算法生产易于人眼观察的图表:
也可以定义特定条件的告警:
这些告警可以通过如下方式定义traffic_alert_rule.yml: