1、Prometheus概述

除了前面的资源指标(如CPU、内存)以外,用户或管理员需要了解更多的指标数据,比如Kubernetes指标、容器指标、节点资源指标以及应用程序指标等等。自定义指标API允许请求任意的指标,其指标API的实现要指定相应的后端监视系统。而Prometheus是第一个开发了相应适配器的监控系统。这个适用于PrometheusKubernetes Customm Metrics Adapter是属于Github上的k8s-prometheus-adapter项目提供的。其原理图如下:

要知道的是prometheus本身就是一监控系统,也分为server端和agent端,server端从被监控主机获取数据,而agent端需要部署一个node_exporter,主要用于数据采集和暴露节点的数据,那么 在获取Pod级别或者是mysql等多种应用的数据,也是需要部署相关的exporter。我们可以通过PromQL的方式对数据进行查询,但是由于本身prometheus属于第三方的 解决方案,原生的k8s系统并不能对Prometheus的自定义指标进行解析,就需要借助于k8s-prometheus-adapter将这些指标数据查询接口转换为标准的Kubernetes自定义指标。

Prometheus是一个开源的服务监控系统和时序数据库,其提供了通用的数据模型和快捷数据采集、存储和查询接口。它的核心组件Prometheus服务器定期从静态配置的监控目标或者基于服务发现自动配置的目标中进行拉取数据,新拉取到啊的 数据大于配置的内存缓存区时,数据就会持久化到存储设备当中。Prometheus组件架构图如下:

如上图,每个被监控的主机都可以通过专用的exporter程序提供输出监控数据的接口,并等待Prometheus服务器周期性的进行数据抓取。如果存在告警规则,则抓取到数据之后会根据规则进行计算,满足告警条件则会生成告警,并发送到Alertmanager完成告警的汇总和分发。当被监控的目标有主动推送数据的需求时,可以以Pushgateway组件进行接收并临时存储数据,然后等待Prometheus服务器完成数据的采集。

任何被监控的目标都需要事先纳入到监控系统中才能进行时序数据采集、存储、告警和展示,监控目标可以通过配置信息以静态形式指定,也可以让Prometheus通过服务发现的机制进行动态管理。下面是组件的一些解析:

  • 监控代理程序:如node_exporter:收集主机的指标数据,如平均负载、CPU、内存、磁盘、网络等等多个维度的指标数据。
  • kubelet(cAdvisor):收集容器指标数据,也是K8S的核心指标收集,每个容器的相关指标数据包括:CPU使用率、限额、文件系统读写限额、内存使用率和限额、网络报文发送、接收、丢弃速率等等。
  • API Server:收集API Server的性能指标数据,包括控制队列的性能、请求速率和延迟时长等等
  • etcd:收集etcd存储集群的相关指标数据
  • kube-state-metrics:该组件可以派生出k8s相关的多个指标数据,主要是资源类型相关的计数器和元数据信息,包括制定类型的对象总数、资源限额、容器状态以及Pod资源标签系列等。

Prometheus 能够 直接 把 Kubernetes API Server 作为 服务 发现 系统 使用 进而 动态 发现 和 监控 集群 中的 所有 可被 监控 的 对象。 这里 需要 特别 说明 的 是, Pod 资源 需要 添加 下列 注解 信息 才 能被 Prometheus 系统 自动 发现 并 抓取 其 内建 的 指标 数据。

  • 1) prometheus. io/ scrape: 用于 标识 是否 需要 被 采集 指标 数据, 布尔 型 值, true 或 false。
  • 2) prometheus. io/ path: 抓取 指标 数据 时 使用 的 URL 路径, 一般 为/ metrics。
  • 3) prometheus. io/ port: 抓取 指标 数据 时 使 用的 套 接 字 端口, 如 8080。

另外, 仅 期望 Prometheus 为 后端 生成 自定义 指标 时 仅 部署 Prometheus 服务器 即可, 它 甚至 也不 需要 数据 持久 功能。 但 若要 配置 完整 功能 的 监控 系统, 管理员 还需 要在 每个 主机 上 部署 node_ exporter、 按 需 部署 其他 特有 类型 的 exporter 以及 Alertmanager。

2、Prometheus部署

由于官方的YAML部署方式需要使用到PVC,这里使用马哥提供的学习类型的部署,具体生产还是需要根据官方的建议进行。本次部署的YAML

2.1、创建名称空间prom

  1. [root@k8s-master ~]# git clone https://github.com/iKubernetes/k8s-prom.git && cd k8s-prom
  2. [root@k8s-master k8s-prom]# kubectl apply -f namespace.yaml
  3. namespace/prom created

2.2、部署node_exporter

  1. [root@k8s-master k8s-prom]# kubectl apply -f node_exporter/
  2. daemonset.apps/prometheus-node-exporter created
  3. service/prometheus-node-exporter created
  4. [root@k8s-master k8s-prom]# kubectl get pods -n prom
  5. NAME READY STATUS RESTARTS AGE
  6. prometheus-node-exporter-6srrq 1/1 Running 0 32s
  7. prometheus-node-exporter-fftmc 1/1 Running 0 32s
  8. prometheus-node-exporter-qlr8d 1/1 Running 0 32s

2.3、部署prometheus-server

  1. [root@k8s-master k8s-prom]# kubectl apply -f prometheus/
  2. configmap/prometheus-config unchanged
  3. deployment.apps/prometheus-server configured
  4. clusterrole.rbac.authorization.k8s.io/prometheus configured
  5. serviceaccount/prometheus unchanged
  6. clusterrolebinding.rbac.authorization.k8s.io/prometheus configured
  7. service/prometheus unchanged
  8. [root@k8s-master k8s-prom]# kubectl get all -n prom
  9. NAME READY STATUS RESTARTS AGE
  10. pod/prometheus-node-exporter-6srrq 1/1 Running 0 11m
  11. pod/prometheus-node-exporter-fftmc 1/1 Running 0 11m
  12. pod/prometheus-node-exporter-qlr8d 1/1 Running 0 11m
  13. pod/prometheus-server-66cbd4c6b-j9lqr 1/1 Running 0 4m
  14. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  15. service/prometheus NodePort 10.96.65.72 <none> 9090:30090/TCP 10m
  16. service/prometheus-node-exporter ClusterIP None <none> 9100/TCP 11m
  17. NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
  18. daemonset.apps/prometheus-node-exporter 3 3 3 3 3 <none> 11m
  19. NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
  20. deployment.apps/prometheus-server 1 1 1 1 10m
  21. NAME DESIRED CURRENT READY AGE
  22. replicaset.apps/prometheus-server-65f5d59585 0 0 0 10m
  23. replicaset.apps/prometheus-server-66cbd4c6b 1 1 1 4m

2.4、部署kube-sate-metrics

  1. [root@k8s-master k8s-prom]# kubectl apply -f kube-state-metrics/
  2. deployment.apps/kube-state-metrics created
  3. serviceaccount/kube-state-metrics created
  4. clusterrole.rbac.authorization.k8s.io/kube-state-metrics created
  5. clusterrolebinding.rbac.authorization.k8s.io/kube-state-metrics created
  6. service/kube-state-metrics created
  7. [root@k8s-master k8s-prom]# kubectl get pods -n prom -o wide
  8. NAME READY STATUS RESTARTS AGE IP NODE
  9. kube-state-metrics-78fc9fc745-g66p8 1/1 Running 0 11m 10.244.1.22 k8s-node01
  10. prometheus-node-exporter-6srrq 1/1 Running 0 31m 192.168.56.11 k8s-master
  11. prometheus-node-exporter-fftmc 1/1 Running 0 31m 192.168.56.12 k8s-node01
  12. prometheus-node-exporter-qlr8d 1/1 Running 0 31m 192.168.56.13 k8s-node02
  13. prometheus-server-66cbd4c6b-j9lqr 1/1 Running 0 24m 10.244.0.4 k8s-master

2.5、制作证书

  1. [root@k8s-master pki]# (umask 077; openssl genrsa -out serving.key 2048)
  2. Generating RSA private key, 2048 bit long modulus
  3. ......................+++
  4. ....+++
  5. e is 65537 (0x10001)
  6. [root@k8s-master pki]# openssl req -new -key serving.key -out serving.csr -subj "/CN=serving"
  7. [root@k8s-master pki]# openssl x509 -req -in serving.csr -CA ./ca.crt -CAkey ./ca.key -CAcreateserial -out serving.crt -days 3650
  8. Signature ok
  9. subject=/CN=serving
  10. Getting CA Private Key
  11. [root@k8s-master pki]# kubectl create secret generic cm-adapter-serving-certs --from-file=serving.crt=./serving.crt --from-file=serving.key -n prom
  12. secret/cm-adapter-serving-certs created
  13. [root@k8s-master pki]# kubectl get secret -n prom
  14. NAME TYPE DATA AGE
  15. cm-adapter-serving-certs Opaque 2 20s

2.6、部署k8s-prometheus-adapter

这里自带的custom-metrics-apiserver-deployment.yaml和custom-metrics-config-map.yaml有点问题,需要下载k8s-prometheus-adapter项目中的这2个文件

  1. [root@k8s-master k8s-prometheus-adapter]# wget https://raw.githubusercontent.com/DirectXMan12/k8s-prometheus-adapter/master/deploy/manifests/custom-metrics-apiserver-deployment.yaml
  2. [root@k8s-master k8s-prometheus-adapter]# vim k8s-prometheus-adapter/custom-metrics-apiserver-deployment.yaml #修改名称空间为prom
  3. [root@k8s-master k8s-prometheus-adapter]# wget https://raw.githubusercontent.com/DirectXMan12/k8s-prometheus-adapter/master/deploy/manifests/custom-metrics-config-map.yaml #也需要修改名称空间为prom
  4. [root@k8s-master k8s-prom]# kubectl apply -f k8s-prometheus-adapter/
  5. clusterrolebinding.rbac.authorization.k8s.io/custom-metrics:system:auth-delegator created
  6. rolebinding.rbac.authorization.k8s.io/custom-metrics-auth-reader created
  7. deployment.apps/custom-metrics-apiserver created
  8. clusterrolebinding.rbac.authorization.k8s.io/custom-metrics-resource-reader created
  9. serviceaccount/custom-metrics-apiserver created
  10. service/custom-metrics-apiserver created
  11. apiservice.apiregistration.k8s.io/v1beta1.custom.metrics.k8s.io created
  12. clusterrole.rbac.authorization.k8s.io/custom-metrics-server-resources created
  13. clusterrole.rbac.authorization.k8s.io/custom-metrics-resource-reader created
  14. clusterrolebinding.rbac.authorization.k8s.io/hpa-controller-custom-metrics created
  15. configmap/adapter-config created
  16. [root@k8s-master k8s-prom]# kubectl get pods -n prom
  17. NAME READY STATUS RESTARTS AGE
  18. custom-metrics-apiserver-65f545496-l5md9 1/1 Running 0 7m
  19. kube-state-metrics-78fc9fc745-g66p8 1/1 Running 0 40m
  20. prometheus-node-exporter-6srrq 1/1 Running 0 1h
  21. prometheus-node-exporter-fftmc 1/1 Running 0 1h
  22. prometheus-node-exporter-qlr8d 1/1 Running 0 1h
  23. prometheus-server-66cbd4c6b-j9lqr 1/1 Running 0 53m
  24. [root@k8s-master k8s-prom]# kubectl api-versions |grep custom
  25. custom.metrics.k8s.io/v1beta1
  26. [root@k8s-master ~]# kubectl get svc -n prom
  27. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  28. custom-metrics-apiserver ClusterIP 10.99.14.141 <none> 443/TCP 11h
  29. kube-state-metrics ClusterIP 10.107.23.237 <none> 8080/TCP 11h
  30. prometheus NodePort 10.96.65.72 <none> 9090:30090/TCP 11h
  31. prometheus-node-exporter ClusterIP None <none> 9100/TCP 11h

访问192.168.56.11:30090,如下图:选择 需要查看的指标,点击Execute

3、Grafana数据展示

  1. [root@k8s-master k8s-prom]# cat grafana.yaml
  2. apiVersion: apps/v1
  3. kind: Deployment
  4. metadata:
  5. name: monitoring-grafana
  6. namespace: prom #修改名称空间
  7. spec:
  8. replicas: 1
  9. selector:
  10. matchLabels:
  11. task: monitoring
  12. k8s-app: grafana
  13. template:
  14. metadata:
  15. labels:
  16. task: monitoring
  17. k8s-app: grafana
  18. spec:
  19. containers:
  20. - name: grafana
  21. image: registry.cn-hangzhou.aliyuncs.com/google_containers/heapster-grafana-amd64:v5.0.4
  22. ports:
  23. - containerPort: 3000
  24. protocol: TCP
  25. volumeMounts:
  26. - mountPath: /etc/ssl/certs
  27. name: ca-certificates
  28. readOnly: true
  29. - mountPath: /var
  30. name: grafana-storage
  31. env: #这里使用的是原先的heapster的grafana的配置文件,需要注释掉这个环境变量
  32. #- name: INFLUXDB_HOST
  33. # value: monitoring-influxdb
  34. - name: GF_SERVER_HTTP_PORT
  35. value: "3000"
  36. # The following env variables are required to make Grafana accessible via
  37. # the kubernetes api-server proxy. On production clusters, we recommend
  38. # removing these env variables, setup auth for grafana, and expose the grafana
  39. # service using a LoadBalancer or a public IP.
  40. - name: GF_AUTH_BASIC_ENABLED
  41. value: "false"
  42. - name: GF_AUTH_ANONYMOUS_ENABLED
  43. value: "true"
  44. - name: GF_AUTH_ANONYMOUS_ORG_ROLE
  45. value: Admin
  46. - name: GF_SERVER_ROOT_URL
  47. # If you're only using the API Server proxy, set this value instead:
  48. # value: /api/v1/namespaces/kube-system/services/monitoring-grafana/proxy
  49. value: /
  50. volumes:
  51. - name: ca-certificates
  52. hostPath:
  53. path: /etc/ssl/certs
  54. - name: grafana-storage
  55. emptyDir: {}
  56. ---
  57. apiVersion: v1
  58. kind: Service
  59. metadata:
  60. labels:
  61. # For use as a Cluster add-on (https://github.com/kubernetes/kubernetes/tree/master/cluster/addons)
  62. # If you are NOT using this as an addon, you should comment out this line.
  63. kubernetes.io/cluster-service: 'true'
  64. kubernetes.io/name: monitoring-grafana
  65. name: monitoring-grafana
  66. namespace: prom
  67. spec:
  68. # In a production setup, we recommend accessing Grafana through an external Loadbalancer
  69. # or through a public IP.
  70. # type: LoadBalancer
  71. # You could also use NodePort to expose the service at a randomly-generated port
  72. type: NodePort
  73. ports:
  74. - port: 80
  75. targetPort: 3000
  76. selector:
  77. k8s-app: grafana
  78. [root@k8s-master k8s-prom]# kubectl apply -f grafana.yaml
  79. deployment.apps/monitoring-grafana created
  80. service/monitoring-grafana created
  81. [root@k8s-master k8s-prom]# kubectl get pods -n prom
  82. NAME READY STATUS RESTARTS AGE
  83. custom-metrics-apiserver-65f545496-l5md9 1/1 Running 0 16m
  84. kube-state-metrics-78fc9fc745-g66p8 1/1 Running 0 49m
  85. monitoring-grafana-7c94886cd5-dhcqz 1/1 Running 0 36s
  86. prometheus-node-exporter-6srrq 1/1 Running 0 1h
  87. prometheus-node-exporter-fftmc 1/1 Running 0 1h
  88. prometheus-node-exporter-qlr8d 1/1 Running 0 1h
  89. prometheus-server-66cbd4c6b-j9lqr 1/1 Running 0 1h
  90. [root@k8s-master k8s-prom]# kubectl get svc -n prom
  91. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  92. custom-metrics-apiserver ClusterIP 10.99.14.141 <none> 443/TCP 11h
  93. kube-state-metrics ClusterIP 10.107.23.237 <none> 8080/TCP 11h
  94. monitoring-grafana NodePort 10.98.174.125 <none> 80:30582/TCP 10h
  95. prometheus NodePort 10.96.65.72 <none> 9090:30090/TCP 11h
  96. prometheus-node-exporter ClusterIP None <none> 9100/TCP 11h

访问grafana的地址:192.168.56.11:30582,默认是没有kubernetes的模板的,可以到grafana.com中去下载相关的kubernetes模板。

Kubernetes学习之路(二十四)之Prometheus监控的更多相关文章

  1. Kubernetes学习之路(十四)之服务发现Service

    一.Service的概念 运行在Pod中的应用是向客户端提供服务的守护进程,比如,nginx.tomcat.etcd等等,它们都是受控于控制器的资源对象,存在生命周期,我们知道Pod资源对象在自愿或非 ...

  2. 嵌入式Linux驱动学习之路(二十四)Nor Flash驱动程序

    Nor Flash和Nand Flash的不同: 类型 NOR Flash  Nand Flash  接口 RAM-like,引脚多 引脚少 容量 小(1M.2M...) 大(512M.1G) 读 简 ...

  3. IOS学习之路二十四(UIImageView 加载gif图片)

    UIImageView 怎样加载一个gif图片我还不知道(会的大神请指教),不过可以通过加载不同的图片实现gif效果 代码如下: UIImageView* animatedImageView = [[ ...

  4. IOS学习之路二十四(custom 漂亮的UIColor)

    下面简单列举一下漂亮的和颜色,大家也可以自己依次试一试选出自己喜欢的. 转载请注明 本文转自:http://blog.csdn.net/wildcatlele/article/details/1235 ...

  5. FastAPI 学习之路(十四)响应模型

    系列文章: FastAPI 学习之路(一)fastapi--高性能web开发框架 FastAPI 学习之路(二) FastAPI 学习之路(三) FastAPI 学习之路(四) FastAPI 学习之 ...

  6. Android学习路线(二十四)ActionBar Fragment运用最佳实践

    转载请注明出处:http://blog.csdn.net/sweetvvck/article/details/38645297 通过前面的几篇博客.大家看到了Google是怎样解释action bar ...

  7. Kubernetes学习之路(十二)之Pod控制器--ReplicaSet、Deployment

    一.Pod控制器及其功用 Pod控制器是用于实现管理pod的中间层,确保pod资源符合预期的状态,pod的资源出现故障时,会尝试 进行重启,当根据重启策略无效,则会重新新建pod的资源. pod控制器 ...

  8. Hive学习之路 (十四)Hive分析窗口函数(二) NTILE,ROW_NUMBER,RANK,DENSE_RANK

    概述 本文中介绍前几个序列函数,NTILE,ROW_NUMBER,RANK,DENSE_RANK,下面会一一解释各自的用途. 注意: 序列函数不支持WINDOW子句.(ROWS BETWEEN) 数据 ...

  9. Kubernetes学习之路(十五)之Ingress和Ingress Controller

    目录 一.什么是Ingress? 1.Pod 漂移问题 2.端口管理问题 3.域名分配及动态更新问题 二.如何创建Ingress资源 三.Ingress资源类型 1.单Service资源型Ingres ...

  10. Android破解学习之路(十四)——【Unity3D】王牌大作战破解

    一.前言 今天带来的是王牌大作战的破解教程,游戏下载的话,我是直接去TapTap官网下载的 支付宝内购破解用老套了,今天学点破解的新花样吧!! 二.支付宝内购破解 支付宝的内购破解已经很熟悉了, 直接 ...

随机推荐

  1. Mac走moneky

    1. 安装卸载apk ① 安装apk:下载apk到电脑 ,adb install -r 拖动apk adb install /Users/yangdan/Downloads/tutor-6.18.0. ...

  2. LeetCode 题解之Add Digits

    1.问题描述 2.问题分析 循环拆分数字,然求和判断. 3.代码 int addDigits(int num) { ) return num; int result = num; do{ vector ...

  3. 给Jqgrid添加横向滚动条,实现点击行数据,触发事件。

    function reloadNoKitScheduleGridData() { $("#noKittingScheduleList").jqGrid({ url: ". ...

  4. 如何加密 Windows VM 上的虚拟磁盘

    为了增强虚拟机 (VM) 的安全性以及符合性,可以加密 Azure 中的虚拟磁盘. 磁盘是使用 Azure 密钥保管库中受保护的加密密钥加密的. 可以控制这些加密密钥,以及审核对它们的使用. 本文详细 ...

  5. 转:在网站开发中很有用的8个 jQuery 效果【附源码】

    原文地址:http://www.cnblogs.com/lhb25/p/amazing-jquery-effects.html jQuery 作为最优秀 JavaScript 库之一,改变了很多人编写 ...

  6. Jmeter用于接口测试中【接口耦合关联的实现】

    Jmeter用于接口测试时,后一个接口经常需要用到前一次接口返回的结果,应该如何获取前一次请求的结果值,应用于后一个接口呢,拿一个登录的例子来说明如何获取. 1.打开jmeter, 使用的3.3的版本 ...

  7. [Spark SQL_1] Spark SQL 配置

    0. 说明 Spark SQL 的配置基于 Spark 集群搭建  && Hive 的安装&配置 1. 简介 Spark SQL 是构建在 Spark Core 模块之上的四大 ...

  8. Redis上踩过的一些坑

    来自: http://blog.csdn.net//chenleixing/article/details/50530419 上上周和同事(龙哥)参加了360组织的互联网技术训练营第三期,美团网的DB ...

  9. git pull与本地修改冲突

    1.先将本地修改存储起来 $ git stash 这样本地的所有修改就都被暂时存储起来 . $ git stash list                 可以看到保存的信息: git stash暂 ...

  10. 关于Vue的nextTick的一点小理解

    官方文档表示:为了在数据变化之后等待Vue完成更新DOM,可以在数据变化之后立即执行Vue.$nextTick(callback),这样回调函数就可以在数据变化之后立即执行. 这段话的意思是: 例如: ...