摘要:客户端库,为需要监控的服务生成相应的并暴露给。根据配置文件,对接收到的警报进行处理,发出告警。再创建一个来告诉需要监控带有为的背后的一组的。
Prometheus 是一套开源的系统监控报警框架。它的设计灵感源于 Google 的 borgmon 监控系统,由SoundCloud 在 2012 年创建,后作为社区开源项目进行开发,并于 2015 年正式发布。2016 年,Prometheus 正式加入 Cloud Native Computing Foundation(CNCF),成为受欢迎度仅次于 Kubernetes 的项目,目前已广泛应用于Kubernetes集群监控系统中,大有成为Kubernetes集群监控标准方案的趋势。
强大的多维度数据模型:
图片源于Prometheus官方文档
上图为Prometheus的架构图,包含了Prometheus的核心模块及生态圈中的组件,简要介绍如下:
如上图可见,Prometheus 的主要模块包括:Prometheus server exporters Pushgateway PromQL Alertmanager 以及图形界面,其大概的工作流程是:
Prometheus 工作的核心,是使用 Pull (抓取)的方式去搜集被监控对象的 Metrics 数据(监控指标数据),然后,再把这些数据保存在一个 TSDB (时间序列数据库,比如 OpenTSDB、InfluxDB 等)当中,以便后续可以按照时间进行检索。
Prometheus非常适合记录纯时间序列的数据。它既适用于面向服务器等硬件指标的监控,也适用于高动态的面向服务架构的监控。对于现在流行的微服务,Prometheus的多维度数据收集和数据筛选查询语言也是非常的强大。Prometheus是为服务的可靠性而设计的,当服务出现故障时,它可以使你快速定位和诊断问题。它的搭建过程对硬件和服务没有很强的依赖关系。
Prometheus重视可靠性,即使在故障情况下,您也可以随时查看有关系统的可用统计信息。如果您需要100%的准确度,例如按请求计费,Prometheus不是一个好的选择,因为收集的数据可能不够详细和完整。
总之,在需要高可用性的业务场景,Prometheus是一个非常好的选择,但对于高精度、高准确率的业务场景,Prometheus并非最佳选择。
为了在 Prometheus 的配置和使用中可以更加顺畅,我们对 Prometheus 中的数据模型、metric 类型以及 instance 和 job 等概念做个简要介绍。
Prometheus 中存储的数据为时间序列,是由 metric 的名字和一系列的标签(键值对)唯一标识的,不同的标签则代表不同的时间序列。
Prometheus 客户端库主要提供四种主要的 metric 类型,分别如下:
一种累加的 metric,典型的应用如:请求的个数,结束的任务数, 出现的错误数等等。
例如,查询 http_requests_total{method="get" job="kubernetes-nodes" handler="prometheus"} 返回 8,10 秒后,再次查询,则返回 14。
一种常规的 metric,典型的应用如:温度,运行的 goroutines 的个数。例如:go_goroutines{instance="10.9.81.55" job="kubernetes-nodes"} 返回值 147,10 秒后返回 124。
可以理解为柱状图,典型的应用如:请求持续时间,响应大小。可以对观察结果采样,分组及统计。
例如,查询 http_request_duration_microseconds_sum{job="kubernetes-nodes" handler="prometheus"} 时,返回结果如下:
类似于 Histogram 典型的应用如:请求持续时间,响应大小。提供观测值的 count 和 sum 功能。提供百分位的功能,即可以按百分比划分跟踪结果。
instance: 一个多带带 scrape 的目标, 一般对应于一个进程。
jobs: 一组同类型的 instances
例如,一个 api-server 的 job 可以包含4个 instances:
job: api-server
当 scrape 目标时,Prometheus 会自动给这个 scrape 的时间序列附加一些标签以便更好的分别,例如:instance,job。
对于一套Kubernetes集群而言,需要监控的对象大致可以分为以下几类:
在Kubernetes中部署Prometheus,除了手工方式外,CoreOS开源了Prometheus-Operator以及kube-Prometheus项目,使得在K8S中安装部署Prometheus变得异常简单。下面我们介绍下如何在UK8S中部署Kube-Prometheus。
Prometheus-operator的本职就是一组用户自定义的CRD资源以及Controller的实现,Prometheus Operator这个controller有BRAC权限下去负责监听这些自定义资源的变化,并且根据这些资源的定义自动化的完成如Prometheus Server自身以及配置的自动化管理工作。
在K8S中,监控metrics基本最小单位都是一个Service背后的一组pod,对应Prometheus中的target,所以prometheus-operator抽象了对应的CRD类型" ServiceMonitor ",这个ServiceMonitor通过 sepc.selector.labes来查找对应的Service及其背后的Pod或endpoints,通过sepc.endpoint来指明Metrics的url路径。
以下面的CoreDNS举例,需要pull的Target对象Namespace为kube-system,kube-app是他们的labels,port为metrics。
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
labels:
k8s-app: coredns
name: coredns
namespace: monitoring
spec:
endpoints:
- bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token
interval: 15s
port: metrics
jobLabel: k8s-app
namespaceSelector:
matchNames:
- kube-system
selector:
matchLabels:
k8s-app: kube-dns
ssh到任意一台Master节点,克隆kube-prometheus项目。该项目源自CoreOS开源的kube-prometheus,与原始项目相比,主要作为以下优化:
yum install git -y
git clone --depth=1 -b kube-prometheus https://github.com/ucloud/uk8s-demo.git
在manifests目录下有UK8S目录,这批配置文件主要用于为UK8S中的controller-manager、schduler、etcd手动创建endpoints和svc,便于Prometheus Server通过ServiceMonitor来采集这三个组件的监控数据。
cd /uk8s-demo/manifests/uk8s
# 修改以下两个文件,将其中的IP替换为你自己UK8S Master节点的内网IP
vi controllerManagerAndScheduler_ep.yaml
vi etcd_ep.yaml
上面提到要修改controllerManagerAndScheduler_ep.yaml和etcd_ep.yaml这两个文件,这里解释下原因。
由于UK8S的ETCD、Scheduler、Controller-Manager都是通过二进制部署的,为了能通过配置"ServiceMonitor"实现Metrics的抓取,我们必须要为其在K8S中创建一个SVC对象,但由于这三个组件都不是Pod,因此我们需要手动为其创建Endpoints。
apiVersion: v1
kind: Endpoints
metadata:
labels:
k8s-app: etcd
name: etcd
namespace: kube-system
subsets:
- addresses:
- ip: 10.7.35.44 # 替换成master节点的内网IP
nodeName: etc-master2
ports:
- name: port
port: 2379
protocol: TCP
- addresses:
- ip: 10.7.163.60 # 同上
nodeName: etc-master1
ports:
- name: port
port: 2379
protocol: TCP
- addresses:
- ip: 10.7.142.140 #同上
nodeName: etc-master3
ports:
- name: port
port: 2379
protocol: TCP
先创建一个名为monitor的NameSpace,Monitor创建成功后,直接部署Operator,Prometheus Operateor以Deployment的方式启动,并会创建前面提到的几个CRD对象。
# 创建Namespace
kubectl apply -f 00namespace-namespace.yaml
# 创建Secret,给到Prometheus Server抓取ETCD数据时使用
kubectl -n monitoring create secret generic etcd-certs --from-file=/etc/kubernetes/ssl/ca.pem --from-file=/etc/kubernetes/ssl/etcd.pem --from-file=/etc/kubernetes/ssl/etcd-key.pem
# 创建Operator
kubectl apply -f operator/
# 查看operator启动状态
kubectl get po -n monitoring
# 查看CRD
kubectl get crd -n monitoring
比较关键的有Prometheus Server、Grafana、 AlertManager、ServiceMonitor、Node-Exporter等,这些镜像已全部修改为UHub官方镜像,因此拉取速度相对比较快。
kubectl apply -f adapter/
kubectl apply -f alertmanager/
kubectl apply -f node-exporter/
kubectl apply -f kube-state-metrics/
kubectl apply -f grafana/
kubectl apply -f prometheus/
kubectl apply -f serviceMonitor/
kubectl apply -f uk8s/
我们可以通过以下命令来查看应用拉取状态。
kubectl -n monitoring get po
由于默认所有的SVC 类型均为ClusterIP,我们将其改为LoadBalancer,方便演示。
kubectl edit svc/prometheus-k8s -n monitoring
# 修改为type: LoadBalancer
[root@10-9-52-233 manifests]# kubectl get svc -n monitoring
# 获取到Prometheus Server的EXTERNAL-IP及端口
可以看到,所有K8S组件的监控指标均已获取到。
我们先来部署一组Pod及SVC,该镜像里的主进程会在8080端口上输出metrics信息。
apiVersion: apps/v1
kind: Deployment
metadata:
name: example-app
spec:
replicas: 3
selector:
matchLabels:
app: example-app
template:
metadata:
labels:
app: example-app
spec:
containers:
- name: example-app
image: uhub.service.ucloud.cn/uk8s_public/instrumented_app:latest
ports:
- name: web
containerPort: 8080
---
kind: Service
apiVersion: v1
metadata:
name: example-app
labels:
app: example-app
spec:
selector:
app: example-app
ports:
- name: web
port: 8080
再创建一个ServiceMonitor来告诉prometheus server需要监控带有label为app: example-app的svc背后的一组pod的metrics。
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: example-app
labels:
team: frontend
spec:
selector:
matchLabels:
app: example-app
endpoints:
- port: web
打开浏览器访问Prometheus Server,进入target发现已经监听起来了,对应的config里也有配置生成和导入。
该文档只适用于kubernetes 1.14以上的版本,如果你的kubernetes版本为1.14以下,可以使用release-0.1.
实时文档欢迎访问https://docs.ucloud.cn/uk8s/monitor/prometheus/README
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/126277.html
摘要:添加接收人监控中心支持添加邮箱及微信两种告警,需要注意的是,添加邮箱告警的话,需要预先配置发件服务器。由于监控中心配置了一条告警规则,只要企业微信的信息填写正确,一般分钟以内均可从企业微信中获取到告警信息。监控中心概述监控中心是UK8S提供的产品化监控方案,提供基于Prometheus的产品解决方案,涵盖Prometheus集群的全生命周期管理,以及告警规则配置、报警设置等功能,省去了自行搭...
摘要:宋体本文从拉勾网的业务架构日志采集监控服务暴露调用等方面介绍了其基于的容器化改造实践。宋体此外,拉勾网还有一套自研的环境的业务发布系统,不过这套发布系统未适配容器环境。写在前面 拉勾网于 2019 年 3 月份开始尝试将生产环境的业务从 UHost 迁移到 UK8S,截至 2019 年 9 月份,QA 环境的大部分业务模块已经完成容器化改造,生产环境中,后台管理服务已全部迁移到 UK8...
摘要:详细请见产品价格产品概念使用须知名词解释漏洞修复记录集群节点配置推荐模式选择产品价格操作指南集群创建需要注意的几点分别是使用必读讲解使用需要赋予的权限模式切换的切换等。UK8S概览UK8S是一项基于Kubernetes的容器管理服务,你可以在UK8S上部署、管理、扩展你的容器化应用,而无需关心Kubernetes集群自身的搭建及维护等运维类工作。了解使用UK8S为了让您更快上手使用,享受UK...
摘要:为什么在节点直接起容器网络不通为什么在节点直接起容器网络不通为什么在节点直接起容器网络不通使用自己的插件,而直接用起的容器并不能使用该插件,因此网络不通。 UK8S 集群常见问题本篇目录1. UK8S 完全兼容原生 Kubernetes API吗?2. UK8S 人工支持3. UK8S对Node上发布的容器有限制吗?如何修改?4. 为什么我的容器一起来就退出了?5. Docker 如何调整日...
摘要:宋体自年被开源以来,很快便成为了容器编排领域的标准。宋体年月,乐心医疗的第一个生产用集群正式上线。所以于年推出后,乐心医疗的运维团队在开会讨论之后一致决定尽快迁移到。Kubernetes 自 2014 年被 Google 开源以来,很快便成为了容器编排领域的标准。因其支持自动化部署、大规模可伸缩和容器化管理等天然优势,已经被广泛接纳。但由于 Kubernetes 本身的复杂性,也让很多企业的...
阅读 3514·2023-04-25 20:09
阅读 3720·2022-06-28 19:00
阅读 3035·2022-06-28 19:00
阅读 3058·2022-06-28 19:00
阅读 3131·2022-06-28 19:00
阅读 2859·2022-06-28 19:00
阅读 3014·2022-06-28 19:00
阅读 2610·2022-06-28 19:00