Promethuse-监控 Etcd

一、思路

Prometheus监控Etcd集群,是没有对应的exporter,而 由CoreOS公司开发的Operator,用来扩展 Kubernetes API,特定的应用程序控制器,它用来创建、配置和管理复杂的有状态应用,如数据库、缓存和监控系统,可以实现监控etcd。

用自定义的方式来对 Kubernetes 集群进行监控,但是还是有一些缺陷,比如 Prometheus、AlertManager 这些组件服务本身的高可用,当然我们也完全可以用自定义的方式来实现这些需求,我们也知道 Prometheus 在代码上就已经对 Kubernetes 有了原生的支持,可以通过服务发现的形式来自动监控集群,因此我们可以使用另外一种更加高级的方式来部署 Prometheus:Operator 框架。

安装方法:

第一步 安装 Prometheus Operator

第二步建立一个 ServiceMonitor 对象,用于 Prometheus 添加监控项

第三步为 ServiceMonitor 对象关联 metrics 数据接口的一个 Service 对象

第四步确保 Service 对象可以正确获取到 metrics 数据

二、安装 Prometheus Operator

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 的以下两个概念:

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

当然我们如果有对应的需求也完全可以自己去实现一个Operator,接下来我们就来给大家详细介绍下Prometheus-Operator的使用方法。

介绍

首先我们先来了解下Prometheus-Operator的架构图:

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

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

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

安装

我们这里直接通过 Prometheus-Operator 的源码来进行安装,当然也可以用 Helm 来进行一键安装,我们采用源码安装可以去了解更多的实现细节。首页将源码 Clone 下来:GitHub - prometheus-operator/prometheus-operator: Prometheus Operator creates/configures/manages Prometheus clusters atop Kubernetes

注意版本,由于我的k8s是1.21,所以选择了release-0.9

$ git clone https://github.com/coreos/kube-prometheus.git
$ cd manifests
$ ls
00namespace-namespace.yaml                                         node-exporter-clusterRole.yaml
0prometheus-operator-0alertmanagerCustomResourceDefinition.yaml    node-exporter-daemonset.yaml
......

最新的版本官方将资源prometheus-operator/contrib/kube-prometheus at main · prometheus-operator/prometheus-operator · GitHub迁移到了独立的 git 仓库中:GitHub - prometheus-operator/kube-prometheus: Use Prometheus to monitor Kubernetes and applications running on Kubernetes

注意,老版本中进入到 manifests 目录下面,这个目录下面包含我们所有的资源清单文件, prometheus-serviceMonitorKubelet.yaml 默认情况下,这个 ServiceMonitor 是关联的 kubelet 的10250端口去采集的节点数据,如果这个 metrics 数据已经迁移到其他只读端口上面去了,数据已经迁移到10255这个只读端口上面去了,我们只需要将文件中的https-metrics更改成http-metrics即可,这个在 Prometheus-Operator 对节点端点同步的代码中有相关定义,感兴趣的可以点此查看完整代码

Subsets: []v1.EndpointSubset{
    {
        Ports: []v1.EndpointPort{
            {
                Name: "https-metrics",
                Port: 10250,
            },
            {
                Name: "http-metrics",
                Port: 10255,
            },
            {
                Name: "cadvisor",
                Port: 4194,
            },
        },
    },
},

正式部署:

[root@master prometheus-operator]# kubectl get node
NAME      STATUS   ROLES                  AGE    VERSION
master    Ready    control-plane,master   514d   v1.21.1
slave01   Ready    <none>                 513d   v1.21.1
slave02   Ready    <none>                 513d   v1.21.1

unzip kube-prometheus-release-0.9.zip
cd kube-prometheus-release-0.9/

注意,一定先部署manifests/setup,否则会如下错误

[root@master kube-prometheus-release-0.8]# kubectl create -f manifests/setup
customresourcedefinition.apiextensions.k8s.io/alertmanagerconfigs.monitoring.coreos.com created
customresourcedefinition.apiextensions.k8s.io/alertmanagers.monitoring.coreos.com created
customresourcedefinition.apiextensions.k8s.io/podmonitors.monitoring.coreos.com created
customresourcedefinition.apiextensions.k8s.io/probes.monitoring.coreos.com created
customresourcedefinition.apiextensions.k8s.io/prometheuses.monitoring.coreos.com created
customresourcedefinition.apiextensions.k8s.io/prometheusrules.monitoring.coreos.com created
customresourcedefinition.apiextensions.k8s.io/servicemonitors.monitoring.coreos.com created
customresourcedefinition.apiextensions.k8s.io/thanosrulers.monitoring.coreos.com created
clusterrole.rbac.authorization.k8s.io/prometheus-operator created
clusterrolebinding.rbac.authorization.k8s.io/prometheus-operator created
deployment.apps/prometheus-operator created
service/prometheus-operator created
serviceaccount/prometheus-operator created

​
[root@master kube-prometheus-release-0.8]# kubectl get pod -A -owide -n monitoring
NAMESPACE        NAME                                             READY   STATUS    RESTARTS   AGE     IP               NODE      NOMINATED NODE   READINESS GATES
monitoring       prometheus-operator-7775c66ccf-mwtx6             2/2     Running   0          54s     172.7.1.36       slave01   <none>           <none>

[root@master kube-prometheus-release-0.8]# kubectl create -f manifests/

alertmanager.monitoring.coreos.com/main created
Warning: policy/v1beta1 PodDisruptionBudget is deprecated in v1.21+, unavailable in v1.25+; use policy/v1 PodDisruptionBudget
poddisruptionbudget.policy/alertmanager-main created
prometheusrule.monitoring.coreos.com/alertmanager-main-rules created
secret/alertmanager-main created
service/alertmanager-main created
serviceaccount/alertmanager-main created
servicemonitor.monitoring.coreos.com/alertmanager created
clusterrole.rbac.authorization.k8s.io/blackbox-exporter created
clusterrolebinding.rbac.authorization.k8s.io/blackbox-exporter created
configmap/blackbox-exporter-configuration created
deployment.apps/blackbox-exporter created
service/blackbox-export
### 使用 Prometheus 监控 Hadoop 集群的最佳实践和配置方法 #### 安装必要的工具和服务 为了能够顺利设置 Prometheus 对 Hadoop 的监控,需要先安装一些必备组件。对于 Linux 系统而言,可以通过 `yum` 或者其他包管理器来安装所需的软件: ```bash sudo yum install dos2unix # 将 Windows 文件转换为 Unix 格式的命令行工具[^1] ``` 这一步骤主要是为了确保所有的配置文件都采用一致的换行符格式。 #### 设置 JMX Exporter Hadoop 组件通过 Java Management Extensions (JMX) 提供性能指标数据。要让这些度量标准被 Prometheus 收集到,则需借助于名为 **JMX Exporter** 的桥接程序。此工具可以将来自 JVM 应用程序内部的数据暴露给 Prometheus 抓取端口[^2]。 下载并配置好适合版本的 JMX Exporter 后,在启动各个 Hadoop 进程时附加相应的参数指向该插件路径即可完成集成工作。 #### Prometheus 和 Grafana 的部署 Prometheus 是一个开源的时间序列数据库,专门用于收集机器上的各种运行状态信息;而 Grafana 则是用来展示时间序列数据分析结果的强大可视化平台。两者结合起来非常适合用来构建高效的分布式系统监测解决方案。 针对 Docker 环境下的 Hadoop3.x 版本集群,建议按照官方文档指导进行 Prometheus 及其相关服务(如 Alertmanager, Pushgateway)以及 Grafana 的安装与初始化操作[^3]。 - 访问 Web UI 地址如下所示: - Prometheus Targets 页面: [http://localhost:9090/targets](http://localhost:9090/targets) - Prometheus Graph 查询界面: [http://localhost:9090/graph](http://localhost:9090/graph) - Grafana 登录页面: [http://localhost:3000/](http://localhost:3000/) 以上地址默认情况下适用于本地开发环境测试用途,请根据实际情况调整主机名或 IP 地址部分。 #### 编写 PromQL 表达式查询 一旦完成了上述准备工作之后就可以利用 Prometheus Query Language(PromQL) 来编写自定义查询语句获取所需的关键业务逻辑统计数值了。例如计算过去五分钟内 NameNode RPC 请求成功率的变化趋势图等复杂场景分析任务都能轻松应对。 ```promql rate(hdfs_namenode_rpc_requests{code="SUCCESS"}[5m]) / ignoring(code) group_left rate(hdfs_namenode_rpc_requests_total[5m]) ``` 这段表达式会返回最近五分钟左右时间内成功处理过的请求次数占总请求数的比例作为输出结果之一。 #### 自动化运维脚本举例 最后提供一段简单的 Python 脚本来定期抓取指定时间段内的日志记录,并将其保存至外部存储介质当中以便后续离线审计之用。 ```python import requests from datetime import datetime, timedelta def fetch_logs(start_time, end_time): url = 'http://<PROMETHEUS_SERVER_IP>:9090/api/v1/query_range' query = '{__name__=~"hdfs.*log"}' params = { 'query': query, 'start': start_time.timestamp(), 'end': end_time.timestamp(), 'step': '60' # 每分钟采集一次样本点 } response = requests.get(url, params=params) if response.status_code != 200: raise Exception('Failed to get logs from Prometheus') data = response.json() with open('/path/to/save/logs.txt', mode='w') as f: for entry in data['data']['result'][0]['values']: timestamp, value = entry formatted_date = datetime.fromtimestamp(timestamp).strftime('%Y-%m-%d %H:%M:%S') log_line = f'{formatted_date}: {value}\n' f.write(log_line) if __name__ == '__main__': now = datetime.now() one_hour_ago = now - timedelta(hours=1) try: fetch_logs(one_hour_ago, now) print('Log fetching completed successfully.') except Exception as e: print(f'Something went wrong during the process: {str(e)}') ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值