基于prometheus的HPA实战

架构如下:
在这里插入图片描述关键组件包括:

  • Prometheus:
    定期采集各pod的性能指标
  • Custom Metrics Server:
    自定义Metrics Serverr,用prometheus Adapter进行具体实现。
    通过Metrics Aggregate将自定义指标API注册到API server中。
  • HPA Controller
    kubernetes的HPA控制器。
    基于用户定义的策略进行自动扩容缩容操作。

开始部署:

  1. 在Master的API Server启动Aggregation层,通过设置kube-apiserver服务的下列启动参数进行开启:

  2. 部署Prometheus,这里使用Operator模式进行部署。

Operator是由CoreOS公司开发的,用来扩展 Kubernetes API,特定的应用程序控制器。

它用来创建、配置和管理复杂的有状态应用,如数据库、缓存和监控系统。

Operator基于 Kubernetes 的资源和控制器概念之上构建,但同时又包含了应用程序特定的一些专业知识,比如创建一个数据库的Operator,则必须对创建的数据库的各种运维方式非常了解,创建Operator的关键是CRD(自定义资源)的设计。全称CustomResourceDefinition

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

了解下Prometheus-Operator的架构图:

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

创建的prometheus这种资源对象就是作为Prometheus Server而存在。

ServiceMonitor就是exporter的各种抽象,是用来提供metrics数据接口的工具。Prometheus就是通过ServiceMonitor提供的metrics数据接口去 pull 数据的

alertmanager这种资源对象就是对应的AlertManager的抽象

PrometheusRule是用来被Prometheus实例使用的报警规则文件。

这样要在集群中监控什么数据,就变成了直接去操作 Kubernetes 集群的资源对象了,是不是方便很多了。

上图中的 Service 和 ServiceMonitor 都是 Kubernetes 的资源,一个 ServiceMonitor 可以通过 labelSelector 的方式去匹配一类 Service,Prometheus 也可以通过 labelSelector 去匹配多个ServiceMonitor。

这里直接通过 Prometheus-Operator 的源码来进行安装,当然也可以用 Helm 来进行一键安装,这里采用源码安装可以去了解更多的实现细节。首页将源码 Clone 下来:

git慢的话直接上压缩包:
wget https://github.com/coreos/kube-prometheus/archive/v0.4.0.tar.gz

[root@bogon src]# git clone https://github.com/coreos/kube-prometheus.git
正克隆到 'kube-prometheus'...
remote: Enumerating objects: 28, done.
remote: Counting objects: 100% (28/28), done.
remote: Compressing objects: 100% (19/19), done.
remote: Total 8571 (delta 11), reused 17 (delta 7), pack-reused 8543
接收对象中: 100% (8571/8571), 4.79 MiB | 3.00 KiB/s, done.
处理 delta 中: 100% (5193/5193), done.

进入到 manifests 目录下面,这个目录下面包含所有的资源清单文件,我们需要对其中的文件 prometheus-serviceMonitorKubelet.yaml 进行简单的修改。

因为默认情况下,这个 ServiceMonitor 是关联的 kubelet 的10250端口去采集的节点数据,而我们前面说过为了安全,这个 metrics 数据已经迁移到10255这个只读端口上面去了,只需要将文件中的https-metrics更改成http-metrics即可。

先部署这个目录下的资源文件:这个目录的资源文件是部署CRD资源的,需要事先部署

cd kube-prometheus/manifests/setup
kubectl apply -f .

再部署这个目录的资源:

cd kube-prometheus/manifests
kubectl apply -f .

部署完成后,会创建一个名为monitoring的 namespace,所以资源对象对将部署在改命名空间下面,此外 Operator 会自动创建5个 CRD 资源对象:

[root@bogon manifests]# kubectl get namespace
NAME              STATUS   AGE
default           Active   27d
kube-node-lease   Active   27d
kube-public       Active   27d
kube-system       Active   27d
monitoring        Active   2m1s

[root@bogon manifests]# kubectl get crd
NAME                                    CREATED AT
alertmanagers.monitoring.coreos.com     2020-07-18T20:11:57Z
podmonitors.monitoring.coreos.com       2020-07-18T20:11:57Z
prometheuses.monitoring.coreos.com      2020-07-18T20:11:57Z
prometheusrules.monitoring.coreos.com   2020-07-18T20:11:59Z
servicemonitors.monitoring.coreos.com   2020-07-18T20:12:00Z

可以在 monitoring 命名空间下面查看所有的 Pod,其中 alertmanager 和 prometheus 是用 StatefulSet 控制器管理的,其中还有一个比较核心的 prometheus-operator 的 Pod,用来控制其他资源对象和监听对象变化的:

猜你喜欢

转载自blog.csdn.net/zhangshaohuas/article/details/107448421