(3)Prometheus关键组件
「*Promethus server*」
Promethus server 是promethus组件的核心部分
负责实现监控数据的获取、存储以及查询,提供PromQL查询语言支持
Retrieval:采样模块,prometheus的服务器在哪里拉取数据,检索拉取到的数据分发给 TSDB进行存储
TSDB:存储模块默认本地存储为TSDB
HTTP server : 提供http接口查询和面板,默认端口为9090
「*Nodeport业务数据源*」
业务数据源通过pull/push两种方式推送数据到promethus server
支持其他数据源的指标导入到prometheus,支持数据库,硬件,消息中间件,存储系统。http服务器,jmx等
负责收集目标对象的性能数据,并通过http接口供prometheus server获取
只要符合接口格式,就可以被采集
「*Mysqld_exporter*」
用于监控mysql指标的一个导出器,支持对mysql5.5以上进行监控。
「*altermanager报警管理器*」
Promethus通过配置报警规则,如果符合报警规则,那么就将报警推送到altermanager。
「*可视化监控界面*」
promethus收集到数据之后,由webui界面进行可视化图标展示,目前我们可以通过自定义的api客户端进行调用数据展示,也可以直接使用grafana解决方案来展示。
「*short-lived jobs:*」存在时间不足以被删除的短暂或批量业务,无法通过pull的方式拉取,需要使用push的方式,与pushgeteway结合使用。
「*Service Discovery:*」服务发现,prometheus支持多种服务发现机制:文件,DNS,k8s,openstack,等,基于服务发现的过程,通过第三方接口,prometheus查询到需要监控的target列表,然后轮询这些target获取监控数据。
「*客户端SDK*」官方提供的客户端类库有go,java,python,ruby
「*pushgateway*」支持临时性的job主动推送指标的中间网关,prometheus默认通过pull方式从exporters拉取,但有些情况我们是不允许promethes
与exporters直接进行通信的,这时候我们可以使用pushgateway由客户端主动push数据到pushgateway,在由prometheus拉取。很
多时候我们需要自定义一些组件来采集
「*proDash*」使用rails开发的dashboard,用于可视化指标数据
(4)工作过程
- prometheus server 定期从配置好的jobs或者exporters中拉metrics.或者接受来自pushgateway发过来的metrics,或者从其他的 prometheus server中拉取metrics。
- prometheus server 在本地存储收集到的metrics,并运行已经定义好的arlt.rules,记录新的时间序列或者向alertmanager推送报警。
- Alertmanager根据配置文件,对接受的警报进行处理,发出告警。
- 在图形界面中,可视化采集数据,可以使用别人写好的grafana模板。
1.1实操步骤
1.1.2 master创建一个命名空间
### master创建namespace [root@k8s-master-01]#Vim prometheus_grafana_namespaces.yaml apiVersion: v1 kind: Namespace metadata: name: prom-grafana labels: name: prom-grafana [root@k8s-master-01 ]# kubectl create -f prom-grafana-namespaces.yaml ### master创建一个SA账号 [root@k8s-master-01]# kubectl create serviceaccount drifter -n prom-grafana ### matser节点把sa 账号drifter通过clusterrolebing绑定到clusterrole上 [root@k8s-master-01 ]# kubectl create clusterrolebinding drifter-clusterrolebinding -n prom-grafana --clusterrole=cluster-admin --serviceaccount=prom-grafana:drifter ####在集群的任意节点上创建一个数据目录 mkdir /data chmod 777 /data/
1.1.3 master创建一个configmap存储卷,用来存放prometheus配置信息
[root@k8s-master-01]#vim prometheus-cfg.yaml --- kind: ConfigMap apiVersion: v1 metadata: labels: app: prometheus name: prometheus-config namespace: monitor-sa data: prometheus.yml: | global: scrape_interval: 15s scrape_timeout: 10s evaluation_interval: 1m scrape_configs: - job_name: 'kubernetes-node' kubernetes_sd_configs: - role: node relabel_configs: - source_labels: [__address__] regex: '(.*):10250' replacement: '${1}:9100' target_label: __address__ action: replace - action: labelmap regex: __meta_kubernetes_node_label_(.+) - job_name: 'kubernetes-node-cadvisor' kubernetes_sd_configs: - role: node scheme: https tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token relabel_configs: - action: labelmap regex: __meta_kubernetes_node_label_(.+) - target_label: __address__ replacement: kubernetes.default.svc:443 - source_labels: [__meta_kubernetes_node_name] regex: (.+) target_label: __metrics_path__ replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor - job_name: 'kubernetes-apiserver' kubernetes_sd_configs: - role: endpoints scheme: https tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token relabel_configs: - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name] action: keep regex: default;kubernetes;https - job_name: 'kubernetes-service-endpoints' kubernetes_sd_configs: - role: endpoints relabel_configs: - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape] action: keep regex: true - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme] action: replace target_label: __scheme__ regex: (https?) - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path] action: replace target_label: __metrics_path__ regex: (.+) - source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port] action: replace target_label: __address__ regex: ([^:]+)(?::\d+)?;(\d+) replacement: $1:$2 - action: labelmap regex: __meta_kubernetes_service_label_(.+) - source_labels: [__meta_kubernetes_namespace] action: replace target_label: kubernetes_namespace - source_labels: [__meta_kubernetes_service_name] action: replace target_label: kubernetes_name ### 创建存储卷pod kubectl create -f prometheus-cfg.yaml
1.1.4通过deployment部署prometheus server
[root@k8s-master-01]#Vim prometheus-deployment.yaml [root@k8s-master-01 ]# more prometheus-deployment.yaml --- apiVersion: apps/v1 kind: Deployment metadata: name: prometheus-server namespace: prom-grafana labels: app: prometheus spec: replicas: 1 selector: matchLabels: app: prometheus component: server #matchExpressions: #- {key: app, operator: In, values: [prometheus]} #- {key: component, operator: In, values: [server]} template: metadata: labels: app: prometheus component: server annotations: prometheus.io/scrape: 'false' spec: nodeName: k8s-node-02 #prometheus调度到这个节点上。 serviceAccountName: drifter containers: - name: prometheus image: prom/prometheus:v2.2.1 imagePullPolicy: IfNotPresent command: - prometheus - --config.file=/etc/prometheus/prometheus.yml - --storage.tsdb.path=/prometheus - --storage.tsdb.retention=720h ports: - containerPort: 9090 protocol: TCP volumeMounts: - mountPath: /etc/prometheus/prometheus.yml name: prometheus-config subPath: prometheus.yml - mountPath: /prometheus/ name: prometheus-storage-volume volumes: - name: prometheus-config configMap: name: prometheus-config items: - key: prometheus.yml path: prometheus.yml mode: 0644 - name: prometheus-storage-volume hostPath: path: /data type: Directory ###创建prometheus server pod kubectl create -f prometheus-deployment.yaml ###查看prometheus server pod状态信息 kubectl get pod -n prom-grafana
1.1.5 对外暴露prometheus端口
###prometheus pod创建一个service [root@k8s-master-01]#vim prometheus-svc.yaml --- apiVersion: v1 kind: Service metadata: name: prometheus-server namespace: prom-grafana labels: app: prometheus spec: # type: NodePort type: ClusterIP ports: - port: 9090 targetPort: 9090 # protocol: TCP selector: app: prometheus component: prometheus-server ###对外暴露prometheus端口 [root@k8s-master-01]#kubectl create -f prometheus-svc.yaml ###查看pod状态信息 [root@k8s-master-01]#kubectl get svc -n prom-grafana NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE prometheus-server ClusterIP 10.103.172.209 <none> 9090/TCP 4m57s
1.1.6prometheus热更新
为了每次修改配置文件可以热加载prometheus,也就是不停止prometheus,就可以使配置生效,如修改prometheus-cfg.yaml,想要使配置生效可用如下热加载命令: curl -X POST http://100.119.255.145:9090/-/reload ###热加载速度比较慢,可以暴力重启prometheus,如修改上面的prometheus-cfg.yaml文件之后,可执行如下强制删除: [root@k8s-master-01]#kubectl delete -f prometheus-cfg.yaml [root@k8s-master-01]#kubectl delete -f prometheus-deployment.yaml ###然后再通过apply更新: [root@k8s-master-01]#kubectl apply -f prometheus-cfg.yaml [root@k8s-master-01]#kubectl apply -f prometheus-deployment.yaml 注意:线上最好热加载,暴力删除可能造成监控数据的丢失
1.1.7 master节点部署node-porter组件
采集机器(物理机、虚拟机、云主机等)的监控指标数据,能够采集到的指标包括CPU, 内存,磁盘,网络,文件数等信息。
[root@k8s-master-01]#vim node-export.yaml apiVersion: apps/v1 kind: DaemonSet metadata: name: node-exporter namespace: prom-grafana labels: name: node-exporter spec: selector: matchLabels: name: node-exporter template: metadata: labels: name: node-exporter spec: hostPID: true hostIPC: true hostNetwork: true containers: - name: node-exporter image: prom/node-exporter:v0.16.0 ports: - containerPort: 9100 resources: requests: cpu: 0.15 securityContext: privileged: true args: - --path.procfs - /host/proc - --path.sysfs - /host/sys - --collector.filesystem.ignored-mount-points - '"^/(sys|proc|dev|host|etc)($|/)"' volumeMounts: - name: dev mountPath: /host/dev - name: proc mountPath: /host/proc - name: sys mountPath: /host/sys - name: rootfs mountPath: /rootfs tolerations: - key: "node-role.kubernetes.io/master" operator: "Exists" effect: "NoSchedule" volumes: - name: proc hostPath: path: /proc - name: dev hostPath: path: /dev - name: sys hostPath: path: /sys - name: rootfs hostPath: path: / [root@k8s-master-01]#kubectl create -f node-export.yaml [root@k8s-master-01]#kubectl get pods -n prom-grafana 查看到pod处于running状态则证明pod创建成功 node-export默认的监听端口是9100,可以看到当前主机获取到的所有监控数据(如图)
三、k8s搭建Grafana
1.grafana介绍
(1)什么是grafana
简单来说,是一个多用途的监控工具,同时邮件等方式进行有效的预警通知,丰富直观的可视化界面,是一种数据源配置是其优点所在,是一个跨平台的源的度量分析和可视化工具,可与通过将采集的数据查询然后可视化的展示并及时通知。
1、展示方式:
客户端可视化有丰富的仪表盘比如热图、折线图等多种展示方式
2、数据源:Graphite,InfluxDB,OpenTSDB,Prometheus,Elasticsearch,CloudWatch和KairosDB等
3、通知提醒:可视方式展示重要指标的报警规则,它将不断计算发送通知,在数据达到阈值时Slack、PagerDuty等获得通知
4、混合展示:在同一图表中混合使用不同数据源,可以基于每个查询指定数据源,甚至自定义数据源
5、注释:使用来自不同数据源的丰富事件注释图表,将鼠标悬停在事件上会显示完整的事件元数据和标记
6、过滤器:Ad-hoc过滤器允许动态创建新的键/值过滤器,这些过滤器会自动应用于使用该数据源的所有查询。
(2)Grafana结构
![img](file:///C:\Users\ZOOWEM~1\AppData\Local\Temp\ksohtml4440\wps1.jpg)
(3)通俗解释工作过程
Export监控指标并获取指标数据推送到prometheus,prometheus拉取数据并连接到grafana,直观展示被监控状态。
1.2 实操步骤
1.2.1 master上安装grafana
外网可以自动下载镜像,内网可以上传下载好镜像
[root@k8s-master-01]#vim grafana.yaml apiVersion: apps/v1 kind: Deployment metadata: name: grafana-server namespace: prom-grafana spec: replicas: 1 selector: matchLabels: task: monitoring k8s-app: grafana template: metadata: labels: task: monitoring k8s-app: grafana spec: imagePullSecrets: - name: registry-pps containers: - name: grafana-server image: registry.drifter.net/grafana:5.0.4 ports: - containerPort: 3000 protocol: TCP volumeMounts: - mountPath: /etc/ssl/certs name: ca-certificates readOnly: true - mountPath: /var name: grafana-storage env: - name: INFLUXDB_HOST value: monitoring-influxdb - name: GF_SERVER_HTTP_PORT value: "3000" - name: GF_AUTH_BASIC_ENABLED value: "false" - name: GF_AUTH_ANONYMOUS_ENABLED value: "true" - name: GF_AUTH_ANONYMOUS_ORG_ROLE value: Admin - name: GF_SERVER_ROOT_URL value: / volumes: - name: ca-certificates hostPath: path: /etc/ssl/certs - name: grafana-storage emptyDir: {}
1.2.2 创建pod
[root@k8s-master-01]#kubectl create -f grafana.yaml deployment.apps/grafana-server created
1.2.3 查看grafana pod 状态 ,处于running状态则pod创建成功
[root@k8s-master-01]#kubectl get pods -n prom-grafana NAME READY STATUS RESTARTS AGE grafana-server-657495c99d-x5hnn 1/1 Running 0 23s
1.2.4 对外暴露grafana端口
[root@k8s-master-01]# vim grafana-svc.yaml --- apiVersion: v1 kind: Service metadata: labels: kubernetes.io/cluster-service: 'true' kubernetes.io/name: grafana-server name: grafana-server namespace: prom-grafana spec: ports: - port: 80 targetPort: 3000 selector: k8s-app: grafana # type: NodePort type: ClusterIP [root@k8s-master-01]# kubectl create -f grafana-svc.yaml
1.2.5 查看暴露的端口
[root@k8s-master-01]# kubectl get svc -n prom-grafana NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE grafana-server ClusterIP 10.102.129.245 <none> 3000/TCP 2m3s prometheus-server ClusterIP 10.96.17.72 <none> 9090/TCP 12m
1.2.6 访问效果
- 访问prometheus
- 访问grafana