2019-10-22-安装部署与监控ingress-controller

Prometheus 介绍

prometheus 当前已经成为k8s的主流监控方案。具备集群资源监控、服务监控、告警与一体,具备较强的扩展性与集成能力。

扩展性:可以通过多个prometheus 采集多个不同区域的数据,使用联邦集群技术在一个prometheus上进行汇聚与展示。

集成能力:目前支持: Java, JMX, Python, Go,Ruby, .Net, Node.js等等语言的客户端SDK,基于这些SDK可以快速让应用程序纳入到Prometheus的监控当中,或者开发自己的监控数据收集程序。

我们常用于k8s的prometheus并不单单只有这一组件

  • export: Exporter将监控数据采集的端点通过HTTP服务的形式暴露给Prometheus Server,Prometheus Server通过访问该Exporter提供的Endpoint端点,即可获取到需要采集的监控数据。

  • prometheus-server:负责实现对监控数据的获取,存储以及查询。 Prometheus Server可以通过静态配置管理监控目标,也可以配合使用Service Discovery的方式动态管理监控目标,并从这些监控目标中获取数据。自带web ui,可以直接通过PromQL实现数据的查询以及可视化。

  • grafana:展示面板,将prometheus中的数据通过面板图形化更友好的方式展示

  • alertmanager: Prometheus根据PromQL定义的规则,产生一条告警,告警的后续处理流程由AlertManager进行管理。在AlertManager中我们可以与邮件,Slack等等内置的通知方式进行集成,也可以通过Webhook自定义告警处理方式。AlertManager即Prometheus体系中的告警处理中心。

架构图

prometheus-all

安装部署

k8s:1.16 使用operator方式。

Prometheus Operator为Kubernetes服务和Prometheus实例的部署和管理提供了简单的监控定义。全面监控k8s集群各项指标。自动的target管理和tag定义

了解Prometheus Operator能做什么,其实就是要了解Prometheus Operator为我们提供了哪些自定义的Kubernetes资源,列出了Prometheus Operator目前提供的️5类资源:

  • Prometheus:声明式创建和管理Prometheus Server实例;

  • ServiceMonitor:负责声明式的管理监控配置,监控指定service下的pod;

  • PrometheusRule:负责声明式的管理告警配置,告警规则配置;

  • Alertmanager:声明式的创建和管理Alertmanager实例。

  • PodMonitor: 监控指定规则的pod。

简言之,Prometheus Operator能够帮助用户自动化的创建以及管理Prometheus Server以及其相应的配置。

Prometheus 和 Alermanager 负载部署这两块的服务,部署完了很少再操作。

主要需要熟悉 ServiceMonitor 和 PrometheusRule,分别负责管理监控对象和管理告警配置。

部署:

配置访问页面

修改service为nodeport,就可以从外部访问了

任意k8s节点IP:32664 即可访问grafana,其他同理

grafana 初始用户密码 admin/admin

内置了很多默认面板

grafana-all-dashboard

集群信息面板

grafana-cluster

prometheus 页面

prometheus-dashboard

监控Ingress controller

Ingress controller 作为整个集群应用流量的入口,在日常运维管理中需要对他的流量做一定监控与展示。

通过监控ingress controller 来熟悉prometheus监控数据的方法与grafana展示。

ingress-controller 最新部署参照这边,也可以按照下面步骤 https://github.com/kubernetes/ingress-nginx/blob/master/docs/deploy/index.md

ingress-controller 部署

prometheus-k8s sa 权限调整

monitoring namespace 下的 prometheus-k8s 这个service account 权限不足,只有default,kube-system,monitoring 这三个的endponits,service 权限。

具体原因见FAQ1

导入这个我修改好的clusterrole可解决

ingress监控部署

监控ingress需要完成两点,一是ingress提供相关的prometheus查询接口(上一步已确认),二创建一条ServiceMonitor规则来指定ingress的数据采集规则。

如果还需要gragana展示,则需在gragana添加对应面板。

此处不使用ingress-controller github带的prometheus,那个不是operator。

  1. 创建service

    先创建ingres-nginx 对接的service,因为下面servicemonitor会通过service来查询对应的pod,用到了service的服务发现

验证

  1. 创建ServiceMonitor

servicenitor中定义了需要监控的对象,创建成功后,在prometheus 的status-configuration 和status - target能查看到ingress的配置与状态

导入文件

注解1 此处是个隐藏的坑,我这次没遇到。 https://github.com/coreos/prometheus-operator/issues/2119 ServiceMonitor 中的label,需要与monitoring下的prometheus内容里的serviceMonitorSelector保持一致。 因为当前我们serviceMonitorSelector为空,所以 ServiceMonitor 中的label可以自己随便写

  1. 验证

    prometheus页面查看status -- configration

    如果看不到,检查配置文件及上面注解1

prometheus-ingress-configuration

prometheus页面查看status -- target 如果能看到configration,target里面没有,查看FAQ1,可能权限问题

prometheus-ingress-target

prometheus页面测试查询

prometheus-ingress-graph

grafana添加面板

以上,prometheus已经能够获取到ingress数据,下一步就是添加grafana面板,更好的展示数据

在grafana页面点+, import,导入nginx.json https://github.com/kubernetes/ingress-nginx/tree/dfa7f10fc9691a3be90fd30cb458b64b617ef440/deploy/grafana/dashboards

已经获取到数据,现在没有应用使用ingress负载,很多地方还是空的

grafana-ingress-1

可以创建一条ingress来访问prometheus 把grafana,prometheus,alertmanager都通过ingress暴露域名

kubectl apply -f https://raw.githubusercontent.com/cai11745/k8s-ocp-yaml/master/yaml-file/ingress-controller/my-ingress.yaml

文件内容:

在自己电脑写入hosts文件,IP写ingress controller的pod IP 172.16.160.33 grafana.localkube.com prometheus.localkube.com alertmanager.localkube.com

即可以通过域名方式访问到三个服务

同时,grafana页面上ingress的数据也会刷新

grafana-ingress-2

各服务角色与功能

monitoring 这个namespace下的pod都分别承担了什么角色,如何创建出来的,以及prometheus中容器、节点的数据如何获取、数据来源,下一篇写。

FAQ

1. 创建ServiceMonitor后prometheus页面没有看到相应target

在prometheus 页面 status configuration 已经查询到ingress配置,但是target里面没有ingress

查询 operator 日志无报错 kubectl -n monitoring logs prometheus-operator-99dccdc56-h5rvq

查询prometheus日志,找到原因

发现是 monitoring 下 prometheus-k8s 这个sa权限不够

查看权限,会发现prometheus-k8s 绑定了clusterrole prometheus-k8s 以及 default,kube-system,monitoring 三个ns下的role prometheus-k8s

再分别查看 clusterrole prometheus-k8s 和role prometheus-k8s

找到原因,clusterrole 里面没有endpoints权限,之前上面三个namespaces有,所以我们直接把clusterrole改掉

完成后,prometheus页面,status - target 就能查询到 新添加的ingress

本文全文及见github,欢迎点点小星星 https://github.com/cai11745/k8s-ocp-yaml/blob/master/prometheus/2019-10-22-prometheus-1-install-and-metricsIngress.md

参考内容: https://yunlzheng.gitbook.io/prometheus-book/ https://github.com/kubernetes/ingress-nginx/tree/master/deploy

Last updated