Kubernetes-基于Prometheus和Grafana进行性能监控


1、Prometheus介绍和架构

1.1 Prometheus介绍

Prometheus是一个开源的系统监视和警报工具包,自2012成立以来,许多公司和组织采用了Prometheus。它现在是一个独立的开源项目,并独立于任何公司维护。在2016年,Prometheus加入云计算基金会作为Kubernetes之后的第二托管项目。
Prometheus的关键特性如下:

由度量名和键值对标识的时间序列数据的多维数据模型
灵活的查询语言
不依赖于分布式存储;单服务器节点是自治的
通过HTTP上的拉模型实现时间序列收集
通过中间网关支持推送时间序列
通过服务发现或静态配置发现目标
图形和仪表板支持的多种模式
Prometheus的组件:
Prometheus生态由多个组件组成,并且这些组件大部分是可选的:

Prometheus服务器,用于获取和存储时间序列数据;
仪表应用数据的客户端类库(Client Library)
支持临时性工作的推网关(Push Gateway)
特殊目的的输出者(Exporter),提供被监控组件信息的 HTTP 接口,例如HAProxy、StatsD、MySQL、Nginx和Graphite等服务都有现成的输出者接口
处理告警的告警管理器(Alert Manager)
其它支持工具
Prometheus的整体架构

Prometheus从jobs获取度量数据,也直接或通过推送网关获取临时jobs的度量数据。它在本地存储所有被获取的样本,并在这些数据运行规则,对现有数据进行聚合和记录新的时间序列,或生成警报。通过Grafana或其他API消费者,可以可视化的查看收集到的数据。下图显示了Pometheus的整体架构和生态组件:

Prometheus architecture

Prometheus的整体工作流程:

1)Prometheus 服务器定期从配置好的 jobs 或者 exporters 中获取度量数据;或者接收来自推送网关发送过来的 度量数据。

2)Prometheus 服务器在本地存储收集到的度量数据,并对这些数据进行聚合;

3)运行已定义好的 alert.rules,记录新的时间序列或者向告警管理器推送警报。

4)告警管理器根据配置文件,对接收到的警报进行处理,并通过email等途径发出告警。

5)Grafana等图形工具获取到监控数据,并以图形化的方式进行展示。

1.2 Prometheus关键概念

1.2.1 数据模型

Prometheus从根本上将所有数据存储为时间序列:属于相同度量标准和同一组标注尺寸的时间戳值流。除了存储的时间序列之外,普罗米修斯可能会生成临时派生时间序列作为查询的结果。

度量名称和标签:每个时间序列都是由度量标准名称和一组键值对(也称为标签)组成唯一标识。度量名称指定被测量的系统的特征(例如:http_requests_total-接收到的HTTP请求的总数)。它可以包含ASCII字母和数字,以及下划线和冒号。它必须匹配正则表达式[a-zA-Z_:][a-zA-Z0-9_:]。标签启用Prometheus的维度数据模型:对于相同度量标准名称,任何给定的标签组合都标识该度量标准的特定维度实例。查询语言允许基于这些维度进行筛选和聚合。更改任何标签值(包括添加或删除标签)都会创建新的时间序列。标签名称可能包含ASCII字母,数字以及下划线。他们必须匹配正则表达式[a-zA-Z_][a-zA-Z0-9_]。以__开始的标签名称保留给供内部使用。
样本:实际的时间序列,每个序列包括:一个 float64 的值和一个毫秒级的时间戳。
格式:给定度量标准名称和一组标签,时间序列通常使用以下格式来标识:

<metric name>{<label name>=<label value>, ...}
例如,时间序列的度量名称为api_http_requests_total,标签method=”POST”和handler=”/messages”,则标记为:

api_http_requests_total{method="POST", handler="/messages"}

1.2.2 度量类型

Prometheus 客户端库主要提供Counter、Gauge、Histogram和Summery四种主要的 metric 类型:

Counter(计算器):Counter是一种累加的度量,它的值只能增加或在重新启动时重置为零。例如,您可以使用计数器来表示提供的请求数,已完成的任务或错误的数量。不要使用计数器来表达可减少的值。例如,不要使用Counter来计算当前正在运行的进程的数量,而是使用Gauge。
Gauge(测量):Gauge表示单个数值,表达可以任意地上升和下降的度量。Gauge通常用于测量值,例如温度或当前的内存使用情况,但也可以表达上升和下降的“计数”,如正在运行的goroutines的数量。
Histogram(直方图):Histogram样本观测(例如:请求持续时间或响应大小),并将它们计入配置的桶中。它也提供所有观测值的总和。具有<basename>基本度量标准名称的histogram的在获取数据期间会显示多个时间序列:
观察桶的累计计数器,暴露为 <basename>_bucket{le=”<upper inclusive bound>”}
所有观察值的总和,暴露为<basename>_sum
已观察到的事件的计数,暴露为<basename>_count(等同于<basename>_bucket{le=”+Inf”})
Summery:类似于Histogram,Summery样本观察(通常是请求持续时间和响应大小)。虽然它也提供观测总数和所有观测值的总和,但它计算滑动时间窗内的可配置分位数。在获取数据期间,具有<basename>基本度量标准名称的Summery会显示多个时间序列:

流动φ分位数(0≤φ≤1)的观察事件,暴露为<basename>{quantile=”<φ>”}
所有观察值的总和,暴露为<basename>_sum
已经观察到的事件的计数,暴露为<basename>_count

1.2.3 工作和实例

按照Prometheus的说法,可以获取数据的端点被称为实例(instance),通常对应于一个单一的进程。具有相同目的的实例集合(例如为了可伸缩性或可靠性而复制的进程)称为作业(job)。

例如,具有四个复制实例的API服务器作业:

工作: api-server
实例1: 1.2.3.4:5670
实例2: 1.2.3.4:5671
实例3: 5.6.7.8:5670
实例4: 5.6.7.8:5671
自动生成标签和时间序列

当Prometheus获取目标时,它会自动附加一些标签到所获取的时间序列中,以识别获取目标:

job:目标所属的配置作业名称。
instance:<host>:<port>被抓取的目标网址部分。
如果这些标签中的任何一个已经存在于抓取的数据中,则行为取决于honor_labels配置选项。

对于每个实例抓取,Prometheus会在以下时间序列中存储一个样本:

up{job=”<job-name>”, instance=”<instance-id>”}:1 如果实例健康,即可达;或者0抓取失败。
scrape_duration_seconds{job=”<job-name>”, instance=”<instance-id>”}:抓取的持续时间。
scrape_samples_post_metric_relabeling{job=”<job-name>”, instance=”<instance-id>”}:应用度量标准重新标记后剩余的样本数。
scrape_samples_scraped{job=”<job-name>”, instance=”<instance-id>”}:目标暴露的样本数量。
up时间序列是实例可用性的监控。

1.3 使用Helm在Kubernetes中部署Prometheus

1.3.1 环境要求

已有Kubernetes 1.6+环境;
已部署helm客户端和tiller服务端(请参考:https://docs.helm.sh/using_helm/#installing-helm):
在Kubernetes中创建了具备足够权限访问权限的service account;
并通过此service account在Kubernetes部署了tiller服务端(请参考:https://docs.helm.sh/using_hel ... ntrol)。
在Kubernetes中提供2个容量大于10g的持久化存储卷。
1.3.2 Helm chart配置
下表列示了Prometheus chart的配置参数和默认值:

参数 描述 默认值
alertmanager.enabled 如果为true,创建告警管理器 true
alertmanager.name 告警管理器容器名称 alertmanager
alertmanager.image.repository 告警管理器容器镜像仓库 prom/alertmanager
alertmanager.image.tag 告警管理器容器镜像标记 v0.13.0
alertmanager.image.pullPolicy 告警管理器容器镜像拉取策略 IfNotPresent
alertmanager.prefixURL The prefix slug at which the server can be accessed “
alertmanager.baseURL The external url at which the server can be accessed /
alertmanager.extraArgs 额外的告警管理器容器参数 {}
alertmanager.configMapOverrideName Prometheus alertmanager ConfigMap override where full-name is {{.Release.Name}}-{{.Values.alertmanager.configMapOverrideName}}and setting this value will prevent the default alertmanager ConfigMap from being generated ""
alertmanager.ingress.enabled If true, alertmanager Ingress will be created false
alertmanager.ingress.annotations 告警管理器Ingress注释 {}
alertmanager.ingress.extraLabels 警告管理器Ingress额外标签 {}
alertmanager.ingress.hosts 警告管理器Ingress主机名称 []
alertmanager.ingress.tls 警告管理器Ingress TLS配置(YAML) []
alertmanager.nodeSelector 用于警告管理器pod指派的node标签 {}
alertmanager.tolerations node玷污容忍 (requires Kubernetes >=1.6) []
alertmanager.schedulerName 警告管理器警告调度名称 nil
alertmanager.persistentVolume.enabled 如果为true,告警管理器江创建一个持久化存储卷声明 true
alertmanager.persistentVolume.accessModes 告警管理器数据持久化存储访问模式 [ReadWriteOnce]
alertmanager.persistentVolume.annotations 持久化存储卷声明注释 {}
alertmanager.persistentVolume.existingClaim 告警管理器数据持久化存储卷存在声明名称 ""
alertmanager.persistentVolume.mountPath 告警管理器数据持久化存储卷挂接根路径 /data
alertmanager.persistentVolume.size 告警数据持久化存储卷大小 2Gi
alertmanager.persistentVolume.storageClass 告警管理器数据持久化存储卷存储类 unset
alertmanager.persistentVolume.subPath Subdirectory of alertmanager data Persistent Volume to mount ""
alertmanager.podAnnotations 添加到告警管理器Pod中的注释 {}
alertmanager.replicaCount 告警管理器Pod的期望副本数量 1
alertmanager.resources 告警管理器Pod资源请求和限制 {}
alertmanager.securityContext 为告警管理器容器定制安全上下文 {}
alertmanager.service.annotations 告警管理器服务的注释 {}
alertmanager.service.clusterIP 内部的告警管理器集群服务IP ""
alertmanager.service.externalIPs 告警管理器服务外部IP地址 []
alertmanager.service.loadBalancerIP 指派给负载均衡器的IP地址 ""
alertmanager.service.loadBalancerSourceRanges list of IP CIDRs allowed access to load balancer (if supported) []
alertmanager.service.servicePort 告警管理器服务端口 80
alertmanager.service.type 告警管理器服务的类型 ClusterIP
alertmanagerFiles.alertmanager.yml Prometheus告警管理器配置 example configuration
configmapReload.name configmap-reload container name configmap-reload
configmapReload.image.repository configmap-reload container image repository jimmidyson/configmap-reload
configmapReload.image.tag configmap-reload container image tag v0.1
configmapReload.image.pullPolicy configmap-reload container image pull policy IfNotPresent
configmapReload.extraArgs Additional configmap-reload container arguments {}
configmapReload.extraConfigmapMounts Additional configmap-reload configMap mounts []
configmapReload.resources configmap-reload pod resource requests & limits {}
initChownData.enabled If false, don’t reset data ownership at startup true
initChownData.name init-chown-data container name init-chown-data
initChownData.image.repository init-chown-data container image repository busybox
initChownData.image.tag init-chown-data container image tag latest
initChownData.image.pullPolicy init-chown-data container image pull policy IfNotPresent
initChownData.resources init-chown-data pod resource requests & limits {}
kubeStateMetrics.enabled If true, create kube-state-metrics true
kubeStateMetrics.name kube-state-metrics容器名称 kube-state-metrics
kubeStateMetrics.image.repository kube-state-metrics容器镜像仓库 quay.io/coreos/kube-state-metrics
kubeStateMetrics.image.tag kube-state-metrics容器镜像版本 v1.3.1
kubeStateMetrics.image.pullPolicy kube-state-metrics容器镜像拉取策略 IfNotPresent
kubeStateMetrics.args kube-state-metrics容器参数 {}
kubeStateMetrics.nodeSelector node labels for kube-state-metrics pod assignment {}
kubeStateMetrics.podAnnotations annotations to be added to kube-state-metrics pods {}
kubeStateMetrics.tolerations node taints to tolerate (requires Kubernetes >=1.6) []
kubeStateMetrics.replicaCount kube-state-metrics Pod的期望副本数量 1
kubeStateMetrics.resources kube-state-metrics资源请求和限制(YAML) {}
kubeStateMetrics.securityContext 为kube-state-metrics容器定制安全上下文 {}
kubeStateMetrics.service.annotations kube-state-metrics服务的注释 {prometheus.io/scrape: "true"}
kubeStateMetrics.service.clusterIP 内部的kube-state-metrics集群服务IP None
kubeStateMetrics.service.externalIPs kube-state-metrics服务外部IP地址 []
kubeStateMetrics.service.loadBalancerIP 指派给负载均衡的IP地址(如果支持的话) ""
kubeStateMetrics.service.loadBalancerSourceRanges list of IP CIDRs allowed access to load balancer (if supported) []
kubeStateMetrics.service.servicePort kube-state-metrics服务端口 80
kubeStateMetrics.service.type type of kube-state-metrics service to create ClusterIP
nodeExporter.enabled 如果为true,则创建node-exporter true
nodeExporter.name node-exporter容器名称 node-exporter
nodeExporter.image.repository node-exporter容器镜像仓库 prom/node-exporter
nodeExporter.image.tag node-exporter容器镜像版本 v0.15.2
nodeExporter.image.pullPolicy node-exporter容器镜像拉取策略 IfNotPresent
nodeExporter.extraArgs 额外的node-exporter容器参数 {}
nodeExporter.extraHostPathMounts 额外的node-exporter hostPath 挂接 []
nodeExporter.extraConfigmapMounts Additional node-exporter configMap mounts []
nodeExporter.nodeSelector node labels for node-exporter pod assignment {}
nodeExporter.podAnnotations annotations to be added to node-exporter pods {}
nodeExporter.pod.labels labels to be added to node-exporter pods {}
nodeExporter.tolerations node taints to tolerate (requires Kubernetes >=1.6) []
nodeExporter.resources node-exporter resource requests and limits (YAML) {}
nodeExporter.securityContext securityContext for containers in pod {}
nodeExporter.service.annotations annotations for node-exporter service {prometheus.io/scrape: "true"}
nodeExporter.service.clusterIP internal node-exporter cluster service IP None
nodeExporter.service.externalIPs node-exporter service external IP addresses []
nodeExporter.service.loadBalancerIP IP address to assign to load balancer (if supported) ""
nodeExporter.service.loadBalancerSourceRanges list of IP CIDRs allowed access to load balancer (if supported) []
nodeExporter.service.servicePort node-exporter service port 9100
nodeExporter.service.type type of node-exporter service to create ClusterIP
pushgateway.enabled 如果为true,则创建推送网关 true
pushgateway.name 推送网关容器名称 pushgateway
pushgateway.image.repository pushgateway container image repository prom/pushgateway
pushgateway.image.tag pushgateway container image tag v0.5.1
pushgateway.image.pullPolicy pushgateway container image pull policy IfNotPresent
pushgateway.extraArgs Additional pushgateway container arguments {}
pushgateway.ingress.enabled If true, pushgateway Ingress will be created false
pushgateway.ingress.annotations pushgateway Ingress annotations {}
pushgateway.ingress.hosts pushgateway Ingress hostnames []
pushgateway.ingress.tls pushgateway Ingress TLS configuration (YAML) []
pushgateway.nodeSelector node labels for pushgateway pod assignment {}
pushgateway.podAnnotations annotations to be added to pushgateway pods {}
pushgateway.tolerations node taints to tolerate (requires Kubernetes >=1.6) []
pushgateway.replicaCount desired number of pushgateway pods 1
pushgateway.resources pushgateway pod resource requests & limits {}
pushgateway.service.annotations annotations for pushgateway service {}
pushgateway.service.clusterIP internal pushgateway cluster service IP ""
pushgateway.service.externalIPs pushgateway service external IP addresses []
pushgateway.service.loadBalancerIP IP address to assign to load balancer (if supported) ""
pushgateway.service.loadBalancerSourceRanges list of IP CIDRs allowed access to load balancer (if supported) []
pushgateway.service.servicePort pushgateway service port 9091
pushgateway.service.type type of pushgateway service to create ClusterIP
rbac.create If true, create & use RBAC resources true
server.name Prometheus服务器容器名称 server
server.image.repository Prometheus服务器容器镜像仓库 prom/prometheus
server.image.tag Prometheus服务器容器镜像版本 v2.1.0
server.image.pullPolicy Prometheus服务器容器镜像拉取策略 IfNotPresent
server.enableAdminApi If true, Prometheus administrative HTTP API will be enabled. Please note, that you should take care of administrative API access protection (ingress or some frontend Nginx with auth) before enabling it. false
server.global.scrape_interval How frequently to scrape targets by default 1m
server.global.scrape_timeout How long until a scrape request times out 10s
server.global.evaluation_interval How frequently to evaluate rules 1m
server.extraArgs Additional Prometheus server container arguments {}
server.prefixURL The prefix slug at which the server can be accessed “
server.baseURL The external url at which the server can be accessed “
server.extraHostPathMounts Additional Prometheus server hostPath mounts []
server.extraConfigmapMounts Additional Prometheus server configMap mounts []
server.extraSecretMounts Additional Prometheus server Secret mounts []
server.configMapOverrideName Prometheus server ConfigMap override where full-name is {{.Release.Name}}-{{.Values.server.configMapOverrideName}} and setting this value will prevent the default server ConfigMap from being generated ""
server.ingress.enabled If true, Prometheus server Ingress will be created false
server.ingress.annotations Prometheus server Ingress annotations []
server.ingress.extraLabels Prometheus服务器Ingress额外标签 {}
server.ingress.hosts Prometheus服务器Ingress主机名称 []
server.ingress.tls Prometheus服务器Ingress TLS配置
(YAML)

[]
server.nodeSelector node labels for Prometheus server pod assignment {}
server.tolerations node taints to tolerate (requires Kubernetes >=1.6) []
server.schedulerName Prometheus服务器告警调度器名称 nil
server.persistentVolume.enabled 如果为true,则为Prometheus服务器创建持久化卷声明 true
server.persistentVolume.accessModes Prometheus server data Persistent Volume access modes [ReadWriteOnce]
server.persistentVolume.annotations Prometheus server data Persistent Volume annotations {}
server.persistentVolume.existingClaim Prometheus server data Persistent Volume existing claim name ""
server.persistentVolume.mountPath Prometheus server data Persistent Volume mount root path /data
server.persistentVolume.size Prometheus服务器数据持久化卷大小 8Gi
server.persistentVolume.storageClass Prometheus服务器数据持久化卷存储类 unset
server.persistentVolume.subPath Subdirectory of Prometheus server data Persistent Volume to mount ""
server.podAnnotations 被添加至Prometheus服务器Pod的注释 {}
server.replicaCount Prometheus服务器Pod的期望副本数量 1
server.resources Prometheus服务器资源请求和限制 {}
server.securityContext 为服务器容器定制安全上下文 {}
server.service.annotations annotations for Prometheus server service {}
server.service.clusterIP internal Prometheus server cluster service IP ""
server.service.externalIPs Prometheus server service external IP addresses []
server.service.loadBalancerIP IP address to assign to load balancer (if supported) ""
server.service.loadBalancerSourceRanges list of IP CIDRs allowed access to load balancer (if supported) []
server.service.nodePort Port to be used as the service NodePort (ignored if server.service.type is not NodePort) 0
server.service.servicePort Prometheus服务器服务端口 80
server.service.type type of Prometheus server service to create ClusterIP
serviceAccounts.alertmanager.create If true, create the alertmanager service account true
serviceAccounts.alertmanager.name name of the alertmanager service account to use or create {{ prometheus.alertmanager.fullname }}
serviceAccounts.kubeStateMetrics.create If true, create the kubeStateMetrics service account true
serviceAccounts.kubeStateMetrics.name name of the kubeStateMetrics service account to use or create {{ prometheus.kubeStateMetrics.fullname }}
serviceAccounts.nodeExporter.create If true, create the nodeExporter service account true
serviceAccounts.nodeExporter.name name of the nodeExporter service account to use or create {{ prometheus.nodeExporter.fullname }}
serviceAccounts.pushgateway.create If true, create the pushgateway service account true
serviceAccounts.pushgateway.name name of the pushgateway service account to use or create {{ prometheus.pushgateway.fullname }}
serviceAccounts.server.create 如果为true,则创建服务器service account true
serviceAccounts.server.name name of the server service account to use or create {{ prometheus.server.fullname }}
server.terminationGracePeriodSeconds Prometheus服务器Pod终止优雅期 300
server.retention (可选) Prometheus数据保留 ""
serverFiles.alerts Prometheus服务器告警配置 {}
serverFiles.rules Prometheus服务器规则配置 {}
serverFiles.prometheus.yml Prometheus服务器抓取配置 example configuration
networkPolicy.enabled 是否启用NetworkPolicy false
1.3.3 通过Chart安装Prometheus
通过执行如下的命令,在Kubernetes中部署Prometheus:

$ helm install stable/prometheus --name=prometheus --namespace=kube-system
通过上述命令,将以默认的配置在Kubernetes中部署Prometheus。

2、Grafana介绍和部署
2.1 Grafana介绍
Grafana是一个开源的度量分析和可视化套件,它用于基础设施和应用分析的时间序列数据可视化。Grafana拥有种类丰富的图表,灵活的布局控制,强大的组织管理功能 (权限控制),支持多种数据库作为数据源。社区提供了丰富的插件和APP 进行功能扩展。Grafana的主要概念如下:

数据源(Data Souce)
Grafana为时间序列数据(数据源)提供多种不同的存储后端。每个数据源都有一个特定的查询编辑器,可根据特定数据源公开的功能进行自定义。目前官方支持以下数据源:Graphite,InfluxDB,OpenTSDB,Prometheus,Elasticsearch,CloudWatch和KairosDB。每个数据源的查询语言和功能显然会非常不同,但可以将来自多个数据源的数据组合到单个仪表板上,每个面板都绑定到属于特定组织的特定数据源。

组织(Oragnization)
Grafana支持多个组织,以支持各种各样的部署模型,包括使用单个Grafana实例为多个可能不受信任的组织提供服务。在很多情况下,Grafana将与单一组织一起部署。每个组织可以有一个或多个数据源。所有仪表板都由特定组织拥有。注意:大多数度量数据库不提供任何类型的用户认证。因此,在Grafana中,数据源和仪表板可供特定组织的所有用户使用。

用户(User)
用户是Grafana中的指定帐户。用户可以属于一个或多个组织,并且可以通过角色分配不同级别的权限。Grafana支持多种内部和外部认证方式来对用户进行身份验证。包括来自自身的集成数据库,来自外部SQL服务器或来自外部LDAP服务器。

行(Row)
行是仪表板内的逻辑分隔符,用于将面板组合在一起。行总是12“单位”宽,这些单位会根据浏览器的水平分辨率进行自动缩放。也可以通过设置自己的宽度来控制一行中面板的相对宽度。利用单位抽象,可以让Grafana适应所有小型和巨大的屏幕。注意:无论您的分辨率或时间范围如何,借助MaxDataPoint功能,Grafana都可以显示完美的数据点数量。

面板(Panel)
面板是Grafana中的基本可视化构建模块。每个面板都提供了一个查询编辑器(取决于在面板中选择的数据源),通过利用查询编辑器可以将数据以可视化方式的显示在面板上,面板提供了各种各样的样式和格式选项。面板可以在仪表板上拖放和重新排列,他们也可以调整大小。目前有四种面板类型:Graph,Singlestat,Dashlist,Table和Text。

查询编辑器(Query Editor)
查询编辑器提供暴露数据源的功能,通过查询编辑器能够查询度量信息。使用查询编辑器可以在时间序列数据库中构建一个或多个查询(针对一个或多个系列)。可以在查询本身的查询编辑器中使用模板变量,这正方式提供了一种基于Dashboard上选定的模板变量动态探索数据的强大方法。Grafana允许通过查询编辑器所在的行来引用查询。如果将第二个查询添加到图形中,则只需输入#A即可引用第一个查询。这为构建复合查询提供了一种简单方便的方法。

仪表板(Dashboard)
仪表板是聚集所有可视化信息的地方,仪表板可以被认为是组织和排列成一个或多个行的一组或多组面板的集合。仪表板的时间段可以通过仪表板右上角的仪表板时间选择器(Dashboard time picker)来控制。仪表板可以利用模板(Templating)使它们更具动态性和交互性。仪表板可以利用注释(Annotations)在面板上显示事件数据。这有助于将面板中的时间序列数据与其他事件相关联。仪表盘(或特定面板)可以通过多种方式轻松共享。可以发送一个链接给能够登录Grafana用户。可以使用快照功能将当前正在查看的所有数据编码为静态和交互式JSON文档。仪表板可以被标记,仪表板选择器可以快速,可搜索地访问特定组织中的所有仪表板。

2.2 基于Helm在Kubernetes中部署Grafana
2.2.1 环境要求
已有Kubernetes 1.6+环境;
已部署helm客户端和tiller服务端(请参考:https://docs.helm.sh/using_helm/#installing-helm):
在Kubernetes中创建了具备足够权限访问权限的service account;
并通过此service account在Kubernetes部署了tiller服务端(请参考:https://docs.helm.sh/using_hel ... ntrol)。
在Kubernetes中提供了容量大于10g的持久化存储卷。
2.2.2 Helm chart配置
下表列示了Grafana chart的配置参数和默认值:

参数 描述 默认值
replicas 副本数量 1
deploymentStrategy 部署策略 RollingUpdate
image.repository 镜像仓库 grafana/grafana
image.tag 镜像版本(Must be >= 5.0.0) 5.0.4
image.pullPolicy 镜像拉取策略 IfNotPresent
service.type Kubernetes服务类型 ClusterIP
service.port 在Kubernetes中暴露的服务端口 9000
service.annotations 服务注释 80
service.labels 服务标签 {}
ingress.enabled 是否启用Ingress false
ingress.annotations Ingress注释 {}
ingress.labels Ingress定制标签 {}
ingress.hosts Ingress accepted hostnames []
ingress.tls Ingress TLS配置 []
resources CPU/Memory resource requests/limits {}
nodeSelector Node labels for pod assignment {}
tolerations Toleration labels for pod assignment []
affinity Affinity settings for pod assignment {}
persistence.enabled 是否使用持久化存储卷存储数据 false
persistence.size 持久化存储卷大小 10Gi
persistence.existingClaim 使用已存在的PVC持久化数据 nil
persistence.storageClassName 持久化存储卷声明类型 nil
persistence.accessModes 持久化访问模式 []
persistence.subPath Mount a sub directory of the persistent volume if set ""
schedulerName 告警调度器名称 nil
env Extra environment variables passed to pods {}
envFromSecret The name of a Kubenretes secret (must be manually created in the same namespace) containing values to be added to the environment ""
extraSecretMounts Additional grafana server secret mounts []
datasources Configure grafana datasources {}
dashboardProviders Configure grafana dashboard providers {}
dashboards Dashboards to import {}
grafana.ini Grafana’s primary configuration {}
ldap.existingSecret The name of an existing secret containing the ldap.toml file, this must have the key ldap-toml. ""
ldap.config Grafana’s LDAP configuration ""
annotations 部署注释 {}
podAnnotations Pod注释 {}
sidecar.dashboards.enabled Enabled the cluster wide search for dashboards and adds/updates/deletes them in grafana false
sidecar.dashboards.label Label that config maps with dashboards should have to be added false
sidecar.datasources.enabled Enabled the cluster wide search for datasources and adds/updates/deletes them in grafana false
sidecar.datasources.label Label that config maps with datasources should have to be added false
smtp.existingSecret The name of an existing secret containing the SMTP credentials, this must have the keys userand password. ""
2.2.3 通过Chart安装Grafana
通过执行如下的命令,在Kubernetes中部署Grafana:

$ helm install stable/grafana --name=grafana --namespace=kube-system
通过上述命令,将以默认的配置在Kubernetes中部署Grfana。

3、监控Kubernetes实践
3.1 监控Kubernetes内容分析
对于Kubernetes来说,需要对集群内容相关资源运行的性能和健康状态这两类指标需要监控,这些资源主要包括:

Node:主机节点
Container:应用运行的容器
Pod:一组容器的组合
Deployment:无状态的应用部署
StatefulSet:有状态的应用部署
3.2 在Grafana中配置数据源
登录Grafana,添加Prometheus类型的的数据源。登录Grafana的管理帐户为admin,密码从grafana保密字典的admin-password键的值中获取。其中,url地址:http://{prometheus_server}.{namespace}:80,Access模式:proxy。

3.3 监控实践
在此文中以监控Pod和应用性能指标为例,展示Prometheus和Grafana对Kubernetes的监控实践。

1)对于Pod性能指标进行监控

进入Grafana的dashboard页面导入Kubernetes Pod Metrics模板:

导入Kubernetes Pod Metrics以后,就可以对Kubernetes中的Pod进行性能监控,包括网络I/O压力、CPU和内存使用情况等。

2)对于应用性能指标进行监控

进入Grafana的dashboard页面导入Kubernetes App Metrics模板:

导入Kubernetes App Metrics以后,就可以对Kubernetes中的应用进行性能监控,包括请求率、反应时间、使用Pod的数量、Pod使用情况等指标。

参考资料
1.《Prometheus Overview》地址:https://prometheus.io/docs/introduction/overview/

2.《使用 Prometheus + Grafana 对 Kubernetes 进行性能监控的实践》作者: 付雅丹 地址:https://mp.weixin.qq.com/s/c2qH4ILq8-3Uuz2VrYKyBw

3.《最佳实践 | Prometheus在Kubernetes下的监控实践》作者:郑云龙,地址:http://dockone.io/article/2579

4.《prometheus》地址:https://hub.kubeapps.com/charts/stable/prometheus

5.《Prometheus 入门与实践》作者:吴 莉, 殷 一鸣, 和 蔡 林,地址:https://www.ibm.com/developerw ... ao.io

5.《grafana》地址:https://hub.kubeapps.com/charts/stable/grafana

6.《kubernetes系列之十:使用prometheus和grafana对kubernetes的部署进行监控》地址:https://blog.csdn.net/cloudvte ... 15866

7.《实战 | 使用Prometheus监控Kubernetes集群和应用》地址:https://www.kancloud.cn/huyipow/kubernetes/531996

8.《Basic Concepts》地址:http://docs.grafana.org/v3.1/g ... epts/

作者简介:
季向远,北京神舟航天软件技术有限公司产品经理。本文版权归原作者所有。

微信:TheMind_sunshine

0 个评论

要回复文章请先登录注册