据Sysdig发布的容器报告,容器以及如Kubernetes等编排工具的使用增加了51%以上,你们开始将工做负载在集群中进行托管并管理。鉴于集群中短暂的状态,对于端到端的集群有一个十分重要的需求,即可以详细监控节点、容器以及pod。node
IT工程师须要管理应用程序、集群(节点和数据),而且须要减小手动配置service、目标和数据存储的工做量,同时在应用程序每次关闭和返回时进行监控。这就须要一个无缝部署以及管理高可用监控系统(如Prometheus),其中能够与Operator一块儿处理抓取目标的动态配置、服务发现以及用于告警集群中各类目标的配置规则。同时,使用Operator模式编写代码以减小人工干预。git
本文,咱们将关注Prometheus Operator是如何工做的,service monitor在Prometheus Operator中是如何发现目标和获取指标的。web
可以使用原生Kubernetes配置选项无缝安装Prometheus Operator编程
可以在Kubernetes命名空间中建立和摧毁一个Prometheus实例,某个特定的应用程序或者团队可以轻松地使用Operatorapi
可以预配置配置文件,包括Kubernetes资源的版本、持久性、保留策略和replica安全
可以使用标签发现目标service,并根据熟悉的Kubernetes标签查询自动生成监控目标配置。app
例如:当pod /service销毁并返回时,Prometheus Operator能够自动建立新的配置文件,无需人工干预。工具
Custom Resource Definition(CRD):建立一个新的自定义资源,包括可指定的名称和模式,无需任何编程。Kubernetes API提供和处理自定义资源的存储。性能
自定义资源:扩展Kubernetes API或容许将自定义API引入kubernetes集群的对象。编码
自定义控制器:以新的方式处理内置的Kubernetes对象,如Deployment、Service等,或管理自定义资源,如同管理本机Kubernetes组件
Operator模式(适用于CRD和自定义控制器):Operator基于Kubernetes资源和控制器增长了容许Operator执行常见应用程序任务的配置。
Operator在后台执行如下操做以管理自定义资源:
一、CRD建立:CRD定义规范和元数据,基于该规范和元数据应建立自定义资源。当建立CRD的请求时,使用Kubernetes内部模式类型(OpenAPI v3模式)验证元数据,而后建立自定义资源定义(CRD)对象
二、自定义资源建立根据元数据和CRD规范验证对象,并相应地建立自定义对象建立。
三、Operator(自定义控制器)开始监控event及其状态变动,并基于CRD管理自定义资源。它能够提供event在自定义资源上执行CRUD操做,所以每当更改自定义资源的状态时,都能被触发相应的event。
Prometheus Operator使用Service Monitor CRD执行自动发现和自动配置获取的目标。
ServiceMonitoring包括如下组件:
Service:其实是service/deployment,它在定义的端点、端口暴露指标,并使用对应的标签进行标识。每当service或pod发生故障时,该service以相同的标签返回,所以使得它可被service monitor发现。
Service Monitor:可基于匹配的标签发现service的自定义资源。Servicemonitor处于部署了Prometheus CRD的命名空间中,但经过使用NamespaceSelector,它依旧可以发现部署在其余命名空间中的service。
Prometheus CRD:基于标签与service monitor相匹配而且可以生成Prometheus的配置。
Prometheus Operator:它可调用config-reloader组件以自动更新yaml配置,其中包含抓取目标的详细信息。
接下来咱们来看一个简单的使用案例,以此理解Prometheus Operator时如何监控service的。
Gerrit是一个代码review工具,主要用于DevOps CI流水线,在代码入库前对每一个提交进行审阅。本文假设Gerrit已经在Kubernetes集群中运行,所以再也不赘述Gerrit在Kubernetes做为服务运行的步骤。
若是你尚未Prometheus Operator,可使用helm chart来安装或直接使用Rancher,在Rancher2.2及以上的版本中,Rancher会在新添加的集群中部署一个Prometheus Operator。如下组件将会被默认下载安装:
prometheus-operator
prometheus
alertmanager
node-exporter
kube-state-metrics
grafana
service monitors to scrape internal kubernetes components
kube-apiserver kube-scheduler kube-controller-manager etcd kube-dns/coredns
如下步骤将展现Prometheus Operator如何自动发现运行在Kubernetes集群上的Gerrit服务以及如何从Gerrit中抓取指标。
可使用Prometheus jar插件暴露Gerrit指标,但须要提早将该插件安装在Gerrit实例上运行。
Prometheus jar插件下载地址:
https://gerrit-ci.gerritforge.com/ ,将jar放在Gerrit插件目录中:/var/gerrit/review_site/plugins/,并重启gerrit服务。
在管理员的web界面校验Prometheus插件:Gerrit -> Plugins -> Prometheus plugin。
建立一个帐号和组并给予查看指标的访问权限
以管理员权限登陆到Gerrit的web界面,访问:Projects>List>All-Projects。点击【Access】标签,再点击【edit】按钮。
在block global capabilities中,点击【Add Permission】而且在下拉列表中选择【View Metrics】。
在Gerrit中为用户生成一个token。
选择咱们此前建立的组“Prometheus Metrics“,点击【Add】按钮。
滑至页面底部并点击【Save Changes】按钮。
在Gerrit中生成token以后,你可使用用户id和token来生成Base64编码格式的用户id和token,用于将凭证存储在Kubernetes中。
使用secret的详细信息建立一个yaml并在Kubernetes中建立secret。
kubectl apply -f gerrit-secret.yaml
使用两个标签标记Gerrit服务,例如:app: gerrit and release: prometheus-operator
kubectl label svc gerrit app=gerrit release=prometheus-operator
在servicemonitoring添加端点的详细信息以发现Gerrit服务指标以及具备匹配标签的的selector,以下所示:
Selector下的标签是用于标识服务的标签:
Selector: matchLabels: app: gerrit release: prometheus-operator
元数据部分下的标签是指用于经过Prometheus CRD识别服务监视器的标签。
Metadata: labels: app: gerrit release: prometheus-operator
Namespaceselector:在Gerrit服务所运行的Kubernetes集群中提供命名空间。Service能够在任何命名空间中运行,但service monitor只能在Prometheus Operator运行的命名空间建立,这样Prometheus CRD就能够识别service monitor对象。
使用如下命令验证Prometheus对象中Service Monitor selector的部分:
kubectl get prometheus Match and apply the label as given in step 4b for the Prometheus object. serviceMonitorSelector: matchLabels: release: prometheus-operator
注意:若是Prometheus-operator使用helm部署,标签release=Prometheus-operator已经应用到Prometheus对象上。咱们依旧须要在service monitor中匹配这个标签,由于Prometheus CRD须要肯定合适的service monitor。
以上servicemonitor建立步骤可使用prometheus-operator helm自定义values.yaml来完成。
标签更新以后,Prometheus自定义对象将会自动调用config-reloader来读取终端并更新Prometheus配置文件。这是Prometheus Operator的一个好处,无需手动介入建立Prometheus配置文件和更新抓取的配置。
一、 打开Prometheus url:http://prometheusip:nodeport
kubectl get svc prometheus以获取nodeport详细信息并用节点的详细信息来替代IP。
二、 访问菜单:Status -> Configuration,来查看使用抓取配置自动加载的Prometheus配置。在scrape_configs部分,能够查看Gerrit service monitor的详细信息,以下所示:
三、 访问菜单 -> Status -> Targets or Service Discovery。若是service monitor已经成功抓取Gerrit的指标,目标应该显示为健康[1/1up]。
Gerrit暴露了各类指标,如JVM运行时间、线程内存、heap size、error等。这些均可以在Grafana仪表板中配置以监控Gerrit的性能和运行情况(以下所示)。
Gerrit指标在scrape url下暴露:
http://gerrit-svcip:nodeport/a/plugins/metrics-reporter-prometheus/metrics
kubectl get svc prometheus
-获取service 节点端口。
将gerrit-svcip、nodeport替换为gerrit服务的gerrit IP / nodeport的详细信息,暴露的指标将以下所示。
指标的值能够在Prometheus -> Graph 中的表达字段进行评估,如:caches_disk_cached_git_tags
在Grafana中配置指标以监控Gerrit的健康情况,选择数据源为Prometheus并在dashboard中配置widget。一些已经配置的关键指标有JVM_threads、Uptime、Http_Plugin errors、内存使用状况、事件等。
Prometheus Operator有助于Prometheus的无缝部署和管理、抓取目标的动态配置、服务发现、可扩展性、以及内置的SRE专业知识,这能够加速集群监控。
2018年年底,Rancher Labs宣布增强对Prometheus的支持,这将为跨多个Kubernetes集群和多个隔离租户环境提供更高的可见性。在Rancher2.2及以上的版本中,每当添加一个新的Kubernetes集群到Rancher中,Rancher都将在集群中部署一个Prometheus operator,而后在集群中建立一个Prometheus部署。此外,还支持如下两个功能:
集群范围内的Prometheus部署将被用于存储集群指标(如CPU节点和内存消耗),并存储从单个用户部署的应用程序中收集的项目级指标。
项目级的Grafana与Prometheus的通讯将经过安全代理完成,该代理可为Prometheus实现多租户。安全代理工具PromQL语句可确保仅能经过用户项目的命名空间进行查询。
Rancher对Prometheus的加强支持,可确保为全部Kubernetes集群、全部项目和全部用户进行高效的部署和有效的监测。安全代理确保不在多租户之间重复共享数据,而且对多租户进行隔离。除此以外,Rancher还收集使用Prometheus处理的数据公开端点的任意自定义指标。全部指标都可用于Rancher内部的告警和决策,经过通知用户的Slack及PagerDuty进行简单操做,经过启动工做负载的横向扩展最终增长负载进行复杂操做。Rancher如今还拥有彻底安全隔离和RBAC的集群级和项目级的指标和仪表盘。