企业级应用 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
发布评论