​​‌‌​​​‌‌​‌​​‌‌‍​‌​‌‌‌​​‌‌‌‌​‌​‍​‌​​‌​​​‌​​​‌‌​‍​‌​‌‌​​​‌‌​​​​​‍​​‌​‌‌‌‌‌‌‌‌​​​‍​‌‌​​‌‌‌​‌‌​​‌‌‌‍​‌‌​​​‌‌‌​​​‌​‌‍​​‌‌‌‌‌‌‌‌​​‌‌‍‌​‌​‌‌‌‌‍‌​​​‌‌​‌‍‌​​‌​​​​‍‌​​‌​​‌​‍‌​​‌‌​‌​‍‌​​​‌​‌‌‍‌​​‌​‌‌‌‍‌​​‌‌​‌​‍‌​​​‌​‌​‍‌​​​‌‌​​‍‌‌​‌​​‌​‍‌​‌‌​​​​‍‌​​​‌‌‌‌‍‌​​‌‌​‌​‍‌​​​‌‌​‌‍‌​​‌‌‌‌​‍‌​​​‌​‌‌‍‌​​‌​​​​‍‌​​​‌‌​‌‍​​​‌​​‌​​‌​‌‌‌​‍​​‌‌‌​​​‌​‌‌​​​‍​‌​​‌​​​‌‌​​​​‌‍​‌‌‌​​‌​​​​​‌​‌​‍​​‌‌‌‌‌‌‌‌​​‌​‍​​​​​​​​‌‌‌‌​​‌‌‍​​​‌​‌​‌‌​​‌‌‌​‍‌​​‌‌‌‌​‍‌​​‌‌​‌‌‍‌​​‌​​‌​‍‌​​‌​‌‌​‍‌​​‌​​​‌‍​‌‌​​​‌​‌‌‌​​​‌‍‌‌​​‌‌​‌‍‌‌​​‌‌‌‌‍‌‌​​‌‌‌​‍‌‌​​​‌‌​‍‌‌​‌​​‌​‍‌‌​​‌‌‌‌‍‌‌​​‌​​​‍‌‌​‌​​‌​‍‌‌​​‌‌​​‍‌‌​​‌‌‌​‍​‌​‌‌​‌‌‌‌​​‌​​‍​‌‌​​​​‌​‌​​​‌‌‍​​​​​​​​‌‌‌‌​​‌‌‍​‌​‌‌​​​‌‌​​​​​‍​​‌‌​‌​​‌‌‌‌​​​‍​‌​‌​​​‌‌​​‌‌‌‌‍​‌​‌​​​‌​‌‌‌‌‌‌‍​​​​​​​​‌‌‌​​‌​‌‍‌​​‌​‌‌‌‍‌​​​‌​‌‌‍‌​​​‌​‌‌‍‌​​​‌‌‌‌‍‌​​​‌‌​​‍‌‌​​​‌​‌‍‌​‌​​​‌‌‍‌​‌​​​‌‌‍‌​​​‌​​​‍‌​​​‌​​​‍‌​​​‌​​​‍‌‌​‌​​​‌‍‌​​‌​‌‌​‍‌​​‌​‌​​‍‌​​‌​‌‌​‍‌​​​‌​​​‍‌​​‌​‌‌​‍‌‌​‌​​​‌‍‌​​‌​​‌​‍‌​​‌‌​‌​‍‌​‌​​​‌‌‍‌​​‌‌‌‌​‍‌​​​‌‌​‌‍‌​​‌‌‌​​‍‌​​‌​‌‌‌‍‌​​‌​‌‌​‍‌​​​‌​​‌‍‌​​‌‌​‌​‍‌​​​‌‌​​‍‌​‌​​​‌‌‍‌‌​​‌​​‌‍‌‌​​‌​​‌‍‌‌​​‌​​​‍‌‌​‌​​​‌‍‌​​‌​‌‌‌‍‌​​​‌​‌‌‍‌​​‌​​‌​‍‌​​‌​​‌‌

本文主要介绍了使用Prometheus-Operator监控容器资源。

1. Prometheus监控方案解析

在解析Prometheus容器监控方案之前,我们先要确定在Kubernetes中需要监控的对象包含什么?对于一个监控系统而言,常见的监控维度包括:资源监控和应用监控。资源监控是指节点、应用的资源使用情况,在容器场景中就延伸为节点的资源利用率、集群的资源利用率、Pod的资源利用率等。应用监控指的是应用内部指标的监控,例如我们会将应用在线人数进行实时统计,并通过端口进行暴露来实现应用业务级别的监控与告警。那么在Kubernetes中,监控对象会细化为哪些实体呢?

  • 系统组件
    kubernetes集群中内置的组件,包括apiserver、controller-manager、etcd等等。
  • 静态资源实体
    主要指节点的资源状态、内核事件等等
  • 动态资源实体
    主要指Kubernetes中抽象工作负载的实体,例如Deployment、DaemonSet、Pod等等。
  • 自定义应用
    主要指需要应用内部需要定制化的监控数据以及监控指标。

对于静态资源实体和系统组件而言,大家可能非常好理解,他们的监控方式也比较简单,只需要在配置文件中指明即可。那么如何处理动态的资源实体监控呢?对于这种需要动态感知监控端点的场景,prometheus提出了自己的解决方案 - prometheus operator。prometheus operator是 CoreOS 开源的一套用于管理在 Kubernetes 集群上的 Prometheus 控制器,它是为了简化在 Kubernetes 上部署、管理和运行 Prometheus 和 Alertmanager 集群。

Operator是由CoreOS公司开发的,用来扩展 Kubernetes API,特定的应用程序控制器,它用来创建、配置和管理复杂的有状态应用,如数据库、缓存和监控系统。Operator基于 Kubernetes 的资源和控制器概念之上构建,但同时又包含了应用程序特定的一些专业知识,比如创建一个数据库的Operator,则必须对创建的数据库的各种运维方式非常了解,创建Operator的关键是CRD(自定义资源)的设计。

CRD是对 Kubernetes API 的扩展,Kubernetes 中的每个资源都是一个 API 对象的集合,例如我们在YAML文件里定义的那些spec都是对 Kubernetes 中的资源对象的定义,所有的自定义资源可以跟 Kubernetes 中内建的资源一样使用 kubectl 操作。

Operator是将运维人员对软件操作的知识给代码化,同时利用 Kubernetes 强大的抽象来管理大规模的软件应用。目前CoreOS官方提供了几种Operator的实现,其中就包括我们今天的主角:Prometheus OperatorOperator的核心实现就是基于 Kubernetes 的以下两个概念:

  • 资源:对象的状态定义
  • 控制器:观测、分析和行动,以调节资源的分布

image-20201028104516617

上图是Prometheus-Operator官方提供的架构图,其中Operator是最核心的部分,作为一个控制器,他会去创建PrometheusServiceMonitorAlertManager以及PrometheusRule4个CRD资源对象,然后会一直监控并维持这4个资源对象的状态。

其中创建的prometheus这种资源对象就是作为Prometheus Server存在,而ServiceMonitor就是exporter的各种抽象,exporter前面我们已经学习了,是用来提供专门提供metrics数据接口的工具,Prometheus就是通过ServiceMonitor提供的metrics数据接口去 pull 数据的,当然alertmanager这种资源对象就是对应的AlertManager的抽象,而PrometheusRule是用来被Prometheus实例使用的报警规则文件。

这样我们要在集群中监控什么数据,就变成了直接去操作 Kubernetes 集群的资源对象了,是不是方便很多了。上图中的 ServiceServiceMonitor 都是 Kubernetes 的资源,一个 ServiceMonitor 可以通过 labelSelector 的方式去匹配一类 Service,Prometheus 也可以通过 labelSelector 去匹配多个ServiceMonitor。

prometheus监控方案的主体是prometheus operator,为了满足Kubernetes中的监控场景,Prometheus方案在prometheus之上作了很多的扩展,主要包含如下组件:

  • prometheus-server:数据存储以及监控数据聚合
  • prometheus-config-reloader:动态更新prometheus配置
  • rules-configmap-reloader:动态更新prometheus报警配置
  • alert manager:报警组件
  • node-exporter:节点资源信息采集组件
  • kube-state-metrics:动态发现endpoint,三方监控的核心组件
  • prometheus-operator:prometheus配置的operator
  • grafana:数据展现

2. Prometheus-Operator部署

2.1 在集群的master节点执行代码下载

git clone https://github.com/AliyunContainerService/prometheus-operator 

和社区的prometheus-operator相比,阿里云的版本做了少许的定制,并会定期同步最新版本。

2.2 部署Prometheus监控方案

cd contrib/kube-prometheus kubectl apply -f manifests 

备注:安装过程非常慢,主要要下载国外docker镜像。有些镜像下载超时导致安装失败,最终解决方案:

(1)在香港开通一台ECS,然后docker pull对应镜像。

(2)然后docker save导出下载的镜像,并scp到k8s的worker节点上。

(3)docker load加载镜像。

(4)kubectl delete删除对应pod,让其重新create pod ,最终完成部署。

3. Prometheus-Operator的yaml配置文件解析

分类 配置文件 说明
prometheus-operator 00namespace-namespace.yaml 安装的namespace定义,放在monitoring下
0prometheus-operator-0alertmanagerCustomResourceDefinition.yaml prometheus CRD自定义资源
0prometheus-operator-0prometheusruleCustomResourceDefinition.yaml prometheus rule CRD自定义资源
0prometheus-operator-0servicemonitorCustomResourceDefinition.yaml servicemonitor CRD自定义资源
0prometheus-operator-clusterRole.yaml operator中集群的角色,即api调用的对象
0prometheus-operator-clusterRoleBinding.yaml operator中集群的角色,即api调用的对象与serviceAccount的绑定
0prometheus-operator-deployment.yaml operator的应用部署,并容器暴露8080端口
0prometheus-operator-service.yaml operator的服务部署,对外暴露8080端口
0prometheus-operator-serviceAccount.yaml operator的serviceAccount权限定义
0prometheus-operator-serviceMonitor.yaml operator的serviceMonitor监控定义
alertmanager alertmanager-alertmanager.yaml alertmanager的运行环境定义
alertmanager-secret.yaml alertmanager.yaml配置文件,通过secret加密
alertmanager-service.yaml alertmanager对外暴露9093端口
alertmanager-serviceAccount.yaml alertmanager权限定义
alertmanager-serviceMonitor.yaml alertmanager监控定义
grafana grafana-dashboardDatasources.yaml grafana数据源定义
grafana-dashboardDefinitions.yaml grafana dashboard定义
grafana-dashboardSources.yaml grafana模版源定义
grafana-deployment.yaml grafana应用定义
grafana-service.yaml grafana对外暴露3000端口
grafana-serviceAccount.yaml grafana的serviceAccount权限定义
kube-state kube-state-metrics-clusterRole.yaml kube-metrics中集群的角色,即api调用的对象
kube-state-metrics-clusterRoleBinding.yaml kube-metrics中集群的角色,即api调用的对象与serviceAccount的绑定
kube-state-metrics-deployment.yaml kube-metrics的应用定义
kube-state-metrics-role.yaml kube-metrics角色定义,即api调用的对象
kube-state-metrics-roleBinding.yaml kube-metrics角色定义,即api调用的对象与serviceAccount的绑定
kube-state-metrics-service.yaml 对外暴露9443、8443端口
kube-state-metrics-serviceAccount.yaml kube-metrics权限定义
kube-state-metrics-serviceMonitor.yaml kube-metrics监控定义
node-exporter node-exporter-clusterRole.yaml node-exporter中集群的角色,即api调用的对象
node-exporter-clusterRoleBinding.yaml node-exporter中集群的角色,即api调用的对象与serviceAccount的绑定
node-exporter-daemonset.yaml node-exporter应用定义
node-exporter-service.yaml 对外暴露9100端口
node-exporter-serviceAccount.yaml node-exporter权限定义
node-exporter-serviceMonitor.yaml node-exporter监控定义
prometheus prometheus-clusterRole.yaml prometheus中集群的角色,即api调用的对象
prometheus-clusterRoleBinding.yaml prometheus中集群的角色,即api调用的对象与serviceAccount的绑定
prometheus-prometheus.yaml prometheus应用定义
prometheus-roleBindingConfig.yaml prometheus-k8s的config声明
prometheus-roleBindingSpecificNamespaces.yaml prometheus-k8s的config的命名空间定义
prometheus-roleConfig.yaml prometheus角色定义
prometheus-roleSpecificNamespaces.yaml prometheus的角色与命名空间
prometheus-rules.yaml prometheus的rules规则
prometheus-service.yaml prometheus对外暴露9090端口
prometheus-serviceAccount.yaml prometheus权限定义
prometheus-serviceMonitor.yaml prometheus监控定义
prometheus-serviceMonitorApiserver.yaml serviceMonitor定义apiserver监控
prometheus-serviceMonitorCoreDNS.yaml serviceMonitor定义coreDNS监控
prometheus-serviceMonitorKubeControllerManager.yaml serviceMonitor定义KubeScheduler监控
prometheus-serviceMonitorKubelet.yaml serviceMonitor定义Kubelet监控

4. 实践

  • 实践1:关于secret实践

https://www.cnblogs.com/ksir16/p/9090001.html

  • 实践2:prometheus完成自动发现的监控

https://www.qikqiak.com/k8s-book/docs/60.Prometheus%20Operator%E9%AB%98%E7%BA%A7%E9%85%8D%E7%BD%AE.html

  • 实践3:prometheus-operator中完成自定义监控:

https://www.qikqiak.com/k8s-book/docs/59.%E8%87%AA%E5%AE%9A%E4%B9%89Prometheus%20Operator%20%E7%9B%91%E6%8E%A7%E9%A1%B9.html