在k8s集群上部署Prometheus监控系统
简介
Prometheus目前是Kubernetes集群监控的官方推荐方案,也是目前为止最流行的解决方案。本文首先介绍Prometheus Operator组件,接着介绍基于Prometheus Operator在Kubernetes集群配置、部署服务、告警。通过本文,大家可以在Kubernetes集群的基础上学习和搭建完善的Prometheus监控系统。
Kubernetes Operator
在 Kubernetes 中,管理“有状态应用”是一个比较复杂的过程,尤其是编写 Pod 模板的时候,总有一种“在 YAML 文件里编程序”的感觉,让人很不舒服。而在 Kubernetes 生态中,还有一个相对更加灵活和编程友好的管理“有状态应用”的解决方案,它就是:Operator。
对于无状态应用,在kubernetes里面管理相对简单容易。但对于数据库、缓存或者监控系统等有状态应用的管理,就是挑战了。这些系统需要掌握相应领域的知识,正确地进行伸缩和升级,当数据丢失或不可用的时候,要进行有效的重新配置。我们希望这些应用相关的运维技能可以编码到软件之中,从而借助Kubernetes 的能力,正确地运行和管理复杂应用。
使用Operator能够方便的维护有状态应用。Operator方案使用CRD机制对Kubernetes API进行扩展,将特定应用的知识融入其中,让用户可以创建、配置和管理应用。与Kubernetes的内置资源一样,Operator操作的不是一个单实例应用,而是集群范围内的多实例。
Prometheus Operator
Prometheus Operator为Kubernetes服务和Prometheus实例的部署和管理提供了简单的监控定义。
Prometheus Operator提供了以下功能:
1、创建/毁坏。在Kubernetes namespace中更容易启动一个Prometheus实例,一个特定的应用程序或团队更容易使用的Operator。
2、简单配置。配Prometheus的基础东西,比如在Kubernetes的本地资源versions, persistence,retention policies和replicas。
3、Target Services通过标签。基于常见的Kubernetes label查询,自动生成监控target配置;不需要学习Prometheus特定的配置语言。
如下所示,是Prometheus Operator的架构示意图:
架构中的各组成部分以不同的资源方式运行在Kubernetes集群中,它们各自有不同的作用。
Operator:Operator资源会根据自定义资源(Custom Resource Definition,CRD)来部署和管理Prometheus Server,同时监控这些自定义资源事件的变化来做相应的处理,是整个系统的控制中心。
Prometheus: Prometheus资源是声明性地描述Prometheus部署的期望状态。
Prometheus Server: Operator根据自定义资源Prometheus类型中定义的内容而部署的Prometheus Server集群,这些自定义资源可以看作用来管理Prometheus Server 集群的StatefulSets资源。
ServiceMonitor:ServiceMonitor也是一个自定义资源,它描述了一组被Prometheus监控的target列表。该资源通过标签来选取对应的Service Endpoint,让Prometheus Server通过选取的Service来获取Metrics信息。
Service:Service资源主要用来对应Kubernetes集群中的Metrics Server Pod,提供给ServiceMonitor选取,让Prometheus Server来获取信息。简单说就是Prometheus监控的对象,例如Node Exporter Service、Mysql Exporter Service等。
Alertmanager:Alertmanager也是一个自定义资源类型,由Operator根据资源描述内容来部署Alertmanager集群。
通过Operator方式部署Prometheus
传统方式部署Promehteus步骤相对复杂,随着Operator的日益成熟,推荐使用Operator方式部署Prometheus。通过Operator方式部署Prometheus,可将更多的操作集成到Operator中,简化了操作过程,也使部署更加简单。本节详细介绍在Kubernetes中使用Operator方式部署整套Prometheus监控和告警。
一、Kubernetes基础环境
部署Prometheus依赖的基础环境如下:
Kubernetes版本为1.18.3。
Prometheus版本:kube-prometheus-release-0.6
克隆地址:https://github.com/prometheus-operator/kube-prometheus.git
二、部署详细步骤
1、下载prometheus operator代码
https://github.com/prometheus-operator/kube-prometheus/tree/release-0.6
2、修改定制安装部署参数
这一步是prometheus能否按照自己的需求进行部署的关键步骤,所有需要部署的系统和设置全部在这一步完成。
修改example.jsonnet配置文件,用于后续生成定制化的prometheus部署:
a、设置prometheus组件镜像版本和本地镜像仓库地址;
b、设置alertmanager告警发送接口参数alertmanager-config.yaml;
c、设置部署的namespace和需要监控的namespace
d、设置自定义的grafana dashboard模版文件
e、设置prometheus自定义的告警触发设置
等等配置
配置文件的具体代码如下:
local mixin = import 'kube-prometheus/kube-prometheus-config-mixins.libsonnet';
local kp =
(import 'kube-prometheus/kube-prometheus.libsonnet') +
// Uncomment the following imports to enable its patches
// (import 'kube-prometheus/kube-prometheus-anti-affinity.libsonnet') +
// (import 'kube-prometheus/kube-prometheus-managed-cluster.libsonnet') +
// (import 'kube-prometheus/kube-prometheus-node-ports.libsonnet') +
// (import 'kube-prometheus/kube-prometheus-static-etcd.libsonnet') +
// (import 'kube-prometheus/kube-prometheus-thanos-sidecar.libsonnet') +
// (import 'kube-prometheus/kube-prometheus-custom-metrics.libsonnet') +
{
_config+:: {
// 定义需要部署到哪个namespace
namespace: 'monitoring',
versions+:: {
// 定义需要部署到各个组件的版本
alertmanager: "v0.21.0",
nodeExporter: "v0.18.1",
kubeStateMetrics: "1.9.5",
kubeRbacProxy: "v0.4.1",
prometheusOperator: "v0.42.1",
prometheus: "v2.20.0",
grafana: "7.1.0",
prometheusAdapter: "v0.7.0",
},
prometheus+:: {
// 定义需要监控的namespace,prometheus默认只监控monitoring、default、kube-system。
namespaces+: ['bbs', 'testhpa'],
names: 'k8s-prometheus',
replicas: 2,
//rules: {
},
},
alertmanager+:: {
name: 'alertmain',
config: importstr 'alertmanager-config.yaml',