2020/05/25 Prometheus监控k8s企业级应用 1

编程入门 行业动态 更新时间:2024-10-19 19:39:36

2020/05/25 Prometheus监控k8s<a href=https://www.elefans.com/category/jswz/34/1768228.html style=企业级应用 1"/>

2020/05/25 Prometheus监控k8s企业级应用 1

2.2 课程介绍及课程大纲

普罗米修斯的配置很难

2.3 Prometheus监控软件概述

prometheus是一名google的前员工写的,也是go语言写的,K8S是第一个托管的项目,prometheus是第二个



这里就有一些很繁杂的表达式

普罗米修斯源码托管地址


2.4 Prometheus监控特点

监控特点:
最重要的是支持多维数据模型:(持久化监控数据,zabbix用的是MySQL,Prometheus内置的是一个时间序列数据库:TSDB(Time Series Database)类似mongodb和hbase,json格式的数据,没有二维表的行和列,可以大致类比成关系型数据库里的列很多,一维代表一个列,对存储的数据进行查询和索引。
多维数据模型,最重要的是通过不同的查询检索和过滤条件去查到想要监控的指标。

普罗米修斯最难理解的就是通过一系列查询条件过滤出来结果,并不是个数值而是一个函数,通过一系列条件,得到一个函数

关系型数据库在保证强一致性的时候,是没有任何数据库可以替代的。prometheus为什么要监控时间序列数据库,是做了精心选择的,因为监控里最常用的查询就是基于时间来查询,zabbix接的mysql是最不擅长查询的。
prometheus除了内置的TSDB还可以外接influxdb这样的。

类似sql,可以利用多维数据完成复杂查询,配置报警的时候一定要配置promql

采集方式和zabbix略有不同(agent和server的数据通信,主动和被动,agent主动像agent汇报数据,zabbix被动就是,server轮询去获取数据

普罗米修斯只能通过http或者https拉取的方式采集时间序列数据exporter。
prometheus的exporter鉴于只能提供http接口,但是有一些服务不带http接口,redis,mysql,就需要去官网下载这种软件指定的exporter,由exporter在内部和你要监控的软件进行通信,由你一个mysql exporter,配置一些连接串,用socket进行通信,由exporter帮你暴露http接口,就可以去抓信息了

exporter不是只有一种

exporter是拉,pushgateway是推,把数据推给普罗米修斯,如果监控目标是转瞬即逝的调用,拉数据有interview,可能根本拉不到,所以这时候就要用到组件pushgateway,能让你把job信息主动推送给普罗米修斯的server

两种方式发现目标,服务发现和静态配置


grafana的图形做的很好


这几个是重点

2.5 Prometheus架构介绍


pushgateway,暂时不做研究

中间是Prometheus的服务端,exporter也叫prometheus的targets,真正要监控哪些东西,是依赖于exporters,类比成zabbix的agent(zabbix的agent只需要安装一个,然后分发自定义脚本即可)。
exporter是需要装一批exporter,根据需求可以装几个,通过普罗米修斯去pull metrics拉,从exporter去拉数据


右边是altermanager报警,webUI,或者是当成数据源给grafana,API接口可以自己写

最令人发指,就是service discovery,有非常厉害的服务自动发现的功能,服务发现类型主要有两种,一种是基于kubernetes本身元数据的自动发现,管这种发现叫kubernetes_sd(sd代表service discovery)
把自动发现规则写到文件里就是基于文件进行服务自动发现,就是file_sd(恰好服务不在k8s里的,就需要我们提前写在文件里)


retrieval是数据收集中心,去收集自动发现规则,还要去收集exporter监控指标,然后传到TSDB时间序列数据库可以放在HDD/SSD上,prometheus-server还提供了http server,可以给alertmanager去 push alerts。或者通过promql给ui或者grafana,提供数据查询接口

、这里接的告警工具有很多,pagerduty,email


转瞬即逝的job才用push gateway

2.6 Prometheus和Zabbix对比


zabbix可以用ld自动发现,起来一个docker容器,有dokcername,

coredns有pod控制器


有个pod


干掉再起来就变了,如果是自动发现会认为是新的,老的不可达就会告警,但是这个本来就是更新,是可达的,这就是zabbix不能做容器监控的最重要的点,随意不得不用普罗米修斯

2.7 交付kube-state-metric

第一先去做exporter,第二做prometheus-server,第三做service discovery,第四做grafana,第5做alertmanager


prometheus有各种exporter,都可以从官网上下

每一种软件都有自己的exporter

这是要用到的第一个exporter,kube-state-metrics用来收集k8s状态信息的监控代理。
比如k8s里有几个节点,有几个deployment,有几个模板


第二个要用的就是node-exporter,专门收集k8s运算节点上基础设施信息的 ,你的运算节点还有多少内存,使用量,cpu,网络IO。
node-exporter要部署到所有k8s节点上


第三要部署的是CAdvisor,这个exporter,是很重要的,是用来监控容器内部使用资源的重要工具。
docker容器到底耗费多少资源,该如何监控。
CAdvisor是在外面探测容器到底消耗多少cpu,内存。
1.9以前CAdvisor和kubelet是集成在一起的。1.9以后拆开了。
看容器消耗的资源用CAdvisor


blackbox-exporter,重要的作用,用来帮你探明业务容器是否存活,


**kube-state-metrics其实跟dockerhub一个意思
**

版本一定要一样

在运维主机pull镜像,做docker,去编资源配置清单


push到harbor里

创建service account服务账号,是在kube-system名称空间里

声明了一个clusterrole

kube-state-mertrics能获得以下资源


做了一个集群角色绑定



声明一个deployment的控制器

readinessprobe,就绪性探针,满足探针的时候,才认为容器是启动状态,才会调度流量



任选一个运算节点,先去创建rbac


再去创建dp

dp本身有8080端口,kube-state-metrics起来监听了一个8080端口,是一个http类型的接口

这个pod就起来了

查看logs是监听在8080



如何确定正常启动

2.8 交付node-exporter




push到仓库


可以准备资源配置清单了

挂了两个目录,宿主机的proc目录和sys目录


用到两个path,把/proc挂载到了/host-proc,把/sys挂载到了/host_sys


traefik,用了宿主机的网络名称空间



直接应用

去看kube-system,pods,两个node_exporter都起来了



真正取到数据的接口是metrics

就把宿主机的一些取出来了


kube-state-metrics

这里就i出现一些数据

若干标签是,监控度量的维度,通过namespace去过滤kube_service_labels,或者是通过service等于什么来过滤

2.9 交付cadvisor

Cadvisor其实是跟kubelet,要kubelet启动容器的消费资源,网络IO,磁盘IO,更新比较快,版本不要用太高,因为可能需要centos8

直接pull一个镜像

push进去



准备资源配置清单



和宿主机共享网络名称空间


**tolerations英文是容忍,就是用户本身可以手动人为影响K8S调度的一种重要方法。K8S能调度不同pod,就是靠的kube-scheduler,逻辑上是主控节点的组件,有预选策略和优选策略
**

但是有时候调度的结果不怎么如意,就需要人为影响,一个pod不能在哪些节点上运行。用污点、容忍度方法可以人为规定。

污点是运算节点node上的污点。
容忍度是pod是否能够容忍污点。
需要先给运算节点的污点


roles相当于给运算节点设置角色


tolerations容忍度是如果发现主控节点,影响effect就是不调度。
发现了污点,要匹配pod控制器上的策略,这里是发现master就不调度


这个role是label,之前是用kubectl label node,真正要给node打污点

打污点,最常用的就是disktype=ssd,在node上打污点告诉你,node用的是ssd硬盘,普通的pod不要往这里调度,必须是IO密集型的才往这里调度

key=xxx:动作

key=xxx:动作,taint就是已经被污染了

这样看不出来

现在有两个node,一个21,一个22

点击21,21是被污染的

这里有一个污点taints


污点叫node -role.kubernetes.io/master=master:NoSchedule

给cadvisor,定义daemonset,定义了一个tolerations,只要看到了污点的key,node.role.kubernetes.io/master.,然后effect就是不调度

这里是容忍了污点,effect改成NoExec


这里有NoExecute


不执行跟不调度还不是一码事


在修改运算节点的软连接


重新挂载一下



实际上软连接就换了


这个所有的运算节点都需要整,否则cadvicsor容器绝对起不来


只在22上,21上没有被调度,因为21上打了污点

想在在21上把污点删除,,在容器的po控制器里写的是noexec,但是污点打的是noscheduler

查看如何删除

需要加个减号-

现在就没了

现在cadvisor在21上也起来了


cadvisor改成noscheduler



这样cadvisor就起来了


这是人为影响调度的第一种方法,污点,容忍度方法


第二种是指定nodeName运行,让pod运行在指定的node上,通过标签选择器,让Pod运行在指定的一类node上

通过这三种可以组合成很多新奇的方法,比如用deployment去管理,但是想每个节点运行一份,多余的运行在某些指定的节点上

2.10 交付blackbox-exporter



先去拉取镜像


先准备一个configmap配置文件



deployment类型的pod控制器










需要去解析出来,用了ingress-controller,不用去管nginx配置,只需要ingress解析域名,流量就过来了


修改dns,记得前滚序列号





修改文件夹名



这就ok了

2.11 污点容忍度调度补充1

kubectl create一个deployment nginx-dp --image,-n放到名称空间里 kube-public,用最简单的方式创建一个deployment


扩容至两份

这样21和22都起来了,尽可能负载均衡,但是现在如果就是不想调度在21上

启动的service,进行修改

dnspolicy还有一种default,走的是宿主机的results,不走coredns了,所以原则上扔到k8s里的pod都接受dns管理,这样才能服务发现

把多余的干掉,变成deployement比较简单的写法


给hdss-7-21加污点,然后观察nginx-dp是否还能调度,先缩成一份


现在只在22上有


加一个污点,key=quedian,value=buxijiao,方法NoScheduler

可以看到quedian是buxijiao
再去扩容nginx-dp

就没往21上调度


扩成4份

都在22上

恢复成1个


现在去改一下deployment

在spec下,加一个toleration容忍度,yaml文件格式要严格对齐
写错了,这个spec是pod控制器的


放到这里


再去看deployment去看一下yaml

这个yaml里就有加的tolerations,方法是noshcheduler

扩容2个


toleration的意思是容忍


尽管node有污点,toleration是受委屈也得忍,忍这个污点

先把缺点去掉

缩容为0


打上污点,不执行


修改dp


如果能容忍quedian=buxijiao,就能调度起来并执行



扩容两个

都在22上


再加一个

也是22上

如果没有任何节点调度了,可以调度到21上,但是起不来,给node打了污点,如果没有完全容忍污点动作,调度器会默认帮你调度到干净的节点上,实在没办法才去调度
生产中用的多的还是noscheduler,少的就是noexecute

普罗米修斯非常吃资源,一般就单独一个节点,就单独跑普罗米修斯,任何容器都跑不起来,普罗米修斯吃资源,所以就给这个节点打污点,只能普罗米修斯容忍

给运算节点打标签,机器,disk type是ssd,这一批是sas,这一批是sata。如果要调度IO密集型 的容器,就可以加node selector,去做标签选择,这样就把容器尽量的往SSD机器上去调度

污点和容忍度用的挺少,如果节点打了污点,等于要调度容器就必须加容忍度,永远调度不过来

2.12 污点容忍度调度补充2

kube-system,21和22上都有容器


在21上打污点,凡是在21上已经运行的容器,就会被驱逐

都到22了,还有一个可能是daemonset,等会就会被驱逐



把污点减去

daemonset就回来了

加个污点,把容器排干,这样就能进行维护,现在21的节点明显负载低l

还可以给node加多个污点

容忍不洗脚,可以容忍两个缺点


这样就被调度到21上了

缩容为0


现在只容忍一个污点



21容器就排干了


有污点,就不会调度到21,只容忍不洗澡,没容忍不洗脚

缩容为0


22上不洗澡不洗脚,21上不洗脚i


、起不来,都不洗脚忍不了

缩容为0
不洗澡删除



恢复1个,21上更闲


继续为0

2.13 安装部署prometheus-server

把deployment删除


把污点也删除

**cadvisor,k8s应该是分为主控节点和逻辑节点。如果用kubeadm去部署集群的话,部署出来的role等于matser节点,会给你加一个taint。
master节点只运行etcd,apiserver,scheduler,controller manager,kubeadm相当于k8s自身的组件,托管给k8s了,把自己托管给自己了。相当于把自己作为一个pod运行在kubelet,让kubelet弄在运行节点上。kubeadm弄出主控节点的时候,会给你加taint,同时加污点,保证你的业务容器不会调度到主控节点上
**
cadvisor加上一个容忍度,尽管是主控节点,仍然让cadvisor跑上去,去收集你的信息。
加了toleration,尽管是主控节点。在部署的时候只给主控节点加标签,kubeadn真正要做起来,就是加个标签,加个污点

有了这个toleration,就是无差别的让cadvisor起来,无论加了污点都会起来



可以用这个版本

Prometheus可以用新一点的版本,但是grafana不行


放到infra仓库

准备好镜像,就需要准备Prometheus的资源配置清单


还是三步,建一个service account,建一个cluster role,然后一个cluster role binding




**replicas只要1是因为普罗米修斯要持久化数据,用到nfs,ftp挂出来,只能起一份。
selector标签选择器,match labels
**


strategy其实可以删除,有默认值


容器里用/bin/prometheus起来

持久化72小时,暴露端口9090,/data/nfs-volume/prometheus挂载到了容器里的/data

resources是k8s里限制容器资源的方法,里面有两个配置项requests,limits,requests代表容器一起来就需要多大资源,memory:1.5g起来就需要1.5G内存,cpu:1000m是1000毫核,1000M就是1,就是1核
limits就是当你的容器资源达到了limits量的时候就把它杀死,不能因为一个容器把宿主机容器一起吃掉。
没有resoources就是无限制吃


jenkins已经吃了掉800M,普罗米修斯跟他错开,到21上

在spec下面加一个参数,nodeName,人为介入调度的很简单的方法



deployment下有spec,spec下有template,template下有spec,spec下有containers,container下有resources,resources下有request和limits,request和limits下有cpu和memory

手动的把普罗米修斯运行在hdss7-21里


制作svc











创建nfs目录/data/nfs-volume,还有prometheus下的两个目录/etc和/data

开始应用


先缩一下

准备prometheus的配置文件

创建目录

私钥是Prometheus要和api通信,帮你自动发现k8s的元数据



证书准备好i了,就去做普罗米修斯yml







2.14 启动prometheus-server、解释配置

key有了,yml有了。prom-db也有了

Prometheus变成1

一定调度到了21上,加了node name



alert是报警


先看configuration


就是之前的配置文件


查看targets

先折叠起来

可以先去看,这里有几个job name

先看etcd,在普罗米修斯配置里,只有etcd用的是static_config静态配置,其他都是自动发现,如果在生产要套用这个配置,只需要修改这一段etcd配置,静态就意味着写死,不是自动发现

要往etcd里存数据,才要证书


打开etcd,取etcd的检测信息,就是从这里取的。去endpoint拿数据


这个label是通过什么样的标签去过滤相关的监控指标



这里就是自动发现

这个jobname和target对上


采集的时间和超时时间

到底请求http的哪个url

service discovery的配置,定义job的时候就用的是自动发现
role :pod 定义pod之后,k8s会发现k8s集群里的所有pod


下面有一堆relabel_config,不能所有的pod都进到job里,只能去过滤一些符合要求的pod进到任务里

kube-state任务最后过滤出了3个pod,


relabel_config是Prometheus里最难的配置


relabel里有action



取的源标签是从k8s里取 的一些元数据,当你k8s里的pod,有一个标签,这个标签名字是grafanak8sapp的时候,就保留。
也就是没有这个标签就不保留


查看pod元数据



再看这一个



再去看kubestate


这里有是因部署为kube-state-metrics,准备了资源配置清单,资源清单里的deployment里,pod控制器里给了标签

node-exporter里也给了标签



通过pod控制器给pod打标签,普罗米修斯拿到标签做匹配

所有poddlabel,去匹配grafanak8sapp


正则表达式的值是true,动作就是keep,否则就是drop


服务发现,有一个grafanak8sapp就保留了


、address就变成了一个endpoint


下面也是有grafanak8sapp变成了endPoint


相当于加入了一个监控目标


这是一个nginx,一开始部署的是daemonset,没有grafanak8sapp标签,就drop掉


现在是要给任务匹配target


这9个都是job任务


任务里面的目标,就是通过配置文件的relabel匹配出来,相当于把一组target,名字叫job,现在把kube-state监控的目标,监控的目标就是这几个target,普罗米修斯就可以通过这三个APP连接里取到我要的监控数据

node_cpu是一个函数,里面有一堆标签


jon是kube-state

pod-name是node-exporter-mshlq,函数node-cpu找到这个标签,就可以返回值了

可以指定条件,每隔15秒取一次,扔到时间序列数据库里了



有若干数据维度,通过时间序列的值,就可以画图

node_cou是函数,相当于用一堆标签提供出来的就是函数

更多推荐

2020/05/25 Prometheus监控k8s企业级应用 1

本文发布于:2024-03-07 10:25:18,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1717566.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:企业级   k8s   Prometheus

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!