kubernetes监控终极方案-kube-promethues
kube-promethues简介
前面我们学习了Heapster+cAdvisor方式监控,这是Prometheus Operator出现之前的k8s监控方案。后来出现了Prometheus Operator,但是目前Prometheus Operator已经不包含完整功能,完整的解决方案已经变为kube-prometheus。项目地址为:https://github.com/coreos/kube-prometheus
这个仓库包括:kubernetes清单、granfana dashboard以及promethues rules。同时还包括容易上手的安装脚本。
组件包括:
- The Prometheus Operator
- 高可用Prometheus
- 高可用Alertmanager
- Prometheus node-exporter
- Prometheus Adapter for Kubernetes Metrics APIs
- kube-state-metrics
- Grafana
kube-promethues架构
上图是Prometheus-Operator
官方提供的架构图,其中Operator
是最核心的部分,作为一个控制器,他会去创建Prometheus
、ServiceMonitor
、AlertManager
以及PrometheusRule
4个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。
kube-promethues部署
下载安装源码
git clone https://github.com/coreos/kube-prometheus.git
安装文件都在kube-prometheus/manifests/ 目录下。
官方把所有文件都放在一起,这里我复制了然后分类下
mkdir prometheus
cp kube-prometheus/manifests/* prometheus/
cd prometheus/
mkdir -p operator node-exporter alertmanager grafana kube-state-metrics prometheus serviceMonitor adapter
mv *-serviceMonitor* serviceMonitor/
mv 0prometheus-operator* operator/
mv grafana-* grafana/
mv kube-state-metrics-* kube-state-metrics/
mv alertmanager-* alertmanager/
mv node-exporter-* node-exporter/
mv prometheus-adapter* adapter/
mv prometheus-* prometheus/
注意:新版本的默认label变了,需要修改选择器为beta.kubernetes.io/os,不然安装的时候会卡住。
修改选择器
sed -ri '/linux/s#kubernetes.io#beta.&#' \
alertmanager/alertmanager-alertmanager.yaml \
prometheus/prometheus-prometheus.yaml \
node-exporter/node-exporter-daemonset.yaml \
kube-state-metrics/kube-state-metrics-deployment.yaml
镜像使用dockerhub上的
sed -ri '/quay.io/s#quay.io/prometheus#prom#' \
alertmanager/alertmanager-alertmanager.yaml \
prometheus/prometheus-prometheus.yaml \
node-exporter/node-exporter-daemonset.yaml
使用能拉取到的谷歌镜像
find -type f -exec sed -ri 's#k8s.gcr.io#gcr.azk8s.cn/google_containers#' {} \;
当前文件目录:
1、生成namespace
kubectl apply -f .
2、安装operater
kubectl apply -f operator/
3、依次安装其他组件
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/
4、查看整体状态
kubectl -n monitoring get all
[root@vm10-0-0-12 prometheus]# kubectl -n monitoring get all
NAME READY STATUS RESTARTS AGE
pod/alertmanager-main-0 2/2 Running 0 27h
pod/alertmanager-main-1 2/2 Running 0 27h
pod/alertmanager-main-2 2/2 Running 0 27h
pod/grafana-7b86fd9ffd-sslwf 1/1 Running 0 27h
pod/kube-state-metrics-688965c565-knjbz 4/4 Running 0 27h
pod/node-exporter-4vtgl 2/2 Running 0 27h
pod/node-exporter-5bnfw 2/2 Running 0 27h
pod/node-exporter-9nnsp 2/2 Running 0 27h
pod/node-exporter-fd8ng 2/2 Running 0 27h
pod/node-exporter-nh5q9 2/2 Running 0 27h
pod/node-exporter-z69fb 2/2 Running 0 27h
pod/prometheus-adapter-66fc7797fd-qpt4d 1/1 Running 0 27h
pod/prometheus-k8s-0 3/3 Running 1 27h
pod/prometheus-k8s-1 3/3 Running 1 27h
pod/prometheus-operator-78678c7494-6954s 1/1 Running 0 27h NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/alertmanager-main ClusterIP 10.254.160.2 <none> 9093/TCP 27h
service/alertmanager-operated ClusterIP None <none> 9093/TCP,9094/TCP,9094/UDP 27h
service/grafana LoadBalancer 10.254.2.98 120.92.212.201 3000:31423/TCP 27h
service/kube-state-metrics ClusterIP None <none> 8443/TCP,9443/TCP 27h
service/node-exporter ClusterIP None <none> 9100/TCP 27h
service/prometheus-adapter ClusterIP 10.254.225.221 <none> 443/TCP 27h
service/prometheus-k8s LoadBalancer 10.254.23.154 120.92.92.56 9090:32361/TCP 27h
service/prometheus-operated ClusterIP None <none> 9090/TCP 27h
service/prometheus-operator ClusterIP None <none> 8080/TCP 27h NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
daemonset.apps/node-exporter 6 6 6 6 6 beta.kubernetes.io/os=linux 27h NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/grafana 1/1 1 1 27h
deployment.apps/kube-state-metrics 1/1 1 1 27h
deployment.apps/prometheus-adapter 1/1 1 1 27h
deployment.apps/prometheus-operator 1/1 1 1 27h NAME DESIRED CURRENT READY AGE
replicaset.apps/grafana-7b86fd9ffd 1 1 1 27h
replicaset.apps/kube-state-metrics-688965c565 1 1 1 27h
replicaset.apps/kube-state-metrics-758f8b9855 0 0 0 27h
replicaset.apps/prometheus-adapter-66fc7797fd 1 1 1 27h
replicaset.apps/prometheus-operator-78678c7494 1 1 1 27h NAME READY AGE
statefulset.apps/alertmanager-main 3/3 27h
statefulset.apps/prometheus-k8s 2/2 27h
kube-promethues配置
1、kube-controller-manager 和 kube-scheduler组件配置
我们可以看到大部分的配置都是正常的,只有两三个没有管理到对应的监控目标,比如 kube-controller-manager 和 kube-scheduler 这两个系统组件,这就和 ServiceMonitor 的定义有关系了,我们先来查看下 kube-scheduler 组件对应的 ServiceMonitor 资源的定义:(prometheus-serviceMonitorKubeScheduler.yaml)
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
labels:
k8s-app: kube-scheduler
name: kube-scheduler
namespace: monitoring
spec:
endpoints:
- interval: 30s # 每30s获取一次信息
port: http-metrics # 对应service的端口名
jobLabel: k8s-app
namespaceSelector: # 表示去匹配某一命名空间中的service,如果想从所有的namespace中匹配用any: true
matchNames:
- kube-system
selector: # 匹配的 Service 的labels,如果使用mathLabels,则下面的所有标签都匹配时才会匹配该service,如果使用matchExpressions,则至少匹配一个标签的service都会被选择
matchLabels:
k8s-app: kube-scheduler
上面是一个典型的 ServiceMonitor 资源文件的声明方式,上面我们通过selector.matchLabels
在 kube-system 这个命名空间下面匹配具有k8s-app=kube-scheduler
这样的 Service,但是我们系统中根本就没有对应的 Service,所以我们需要手动创建一个 Service:(prometheus-kubeSchedulerService.yaml)
cat prometheus-kubeSchedulerService.yaml
apiVersion: v1
kind: Service
metadata:
namespace: kube-system
name: kube-scheduler
labels:
k8s-app: kube-scheduler
spec:
type: ClusterIP
clusterIP: None
ports:
- name: port
port: 10251
protocol: TCP
---
apiVersion: v1
kind: Endpoints
metadata:
labels:
k8s-app: kube-scheduler
name: kube-scheduler
namespace: kube-system
subsets:
- addresses:
- ip: 10.0.0.5
- ip: 10.0.0.15
- ip: 10.0.0.20
ports:
- name: http-metrics
port: 10251
protocol: TCP
同理prometheus-kubeControllerManagerService.yaml也需要修改一下:
apiVersion: v1
kind: Service
metadata:
namespace: kube-system
name: kube-controller-manager
labels:
k8s-app: kube-controller-manager
spec:
selector:
component: kube-controller-manager
type: ClusterIP
clusterIP: None
ports:
- name: http-metrics
port: 10252
targetPort: 10252
protocol: TCP ---
apiVersion: v1
kind: Endpoints
metadata:
labels:
k8s-app: kube-controller-manager
name: kube-controller-manager
namespace: kube-system
subsets:
- addresses:
- ip: 10.0.0.5
- ip: 10.0.0.15
- ip: 10.0.0.20
ports:
- name: http-metrics
port: 10252
protocol: TCP
2、coredns配置
我在测试环境和线上环境都遇到了coredns无法发现的问题。
出现这个问题的原因在于/data/monitor/kube-prometheus/manifests/prometheus-serviceMonitorCoreDNS.yaml这个文件:
上面的matchLabels为kube-dns,而实际上不是这个label:
pod/coredns-58d6869b44-ddczz 1/1 Running 0 4d4h 10.8.5.2 10.0.0.5 <none> <none>
pod/coredns-58d6869b44-zrkx4 1/1 Running 0 4d4h 10.8.4.2 10.0.0.15 <none> <none> service/coredns ClusterIP 10.254.0.10 <none> 53/UDP,53/TCP,9153/TCP 4d4h k8s-app=coredns
实际上是coredns,所以需要修改。
同时,rules里面也需要修改。
修改完成后:
恢复正常。
3、自定义监控项
除了 Kubernetes 集群中的一些资源对象、节点以及组件需要监控,有的时候我们可能还需要根据实际的业务需求去添加自定义的监控项,添加一个自定义监控的步骤也是非常简单的。
- 第一步建立一个 ServiceMonitor 对象,用于 Prometheus 添加监控项
- 第二步为 ServiceMonitor 对象关联 metrics 数据接口的一个 Service 对象
- 第三步确保 Service 对象可以正确获取到 metrics 数据
比如,在我这套环境中,业务那边在测试微服务,启动了2个pod。
同时他开放了7000端口作为数据接口:
新建serviceMonitor文件:
cat prometheus-serviceMonitorJx3recipe.yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: jx3recipe
namespace: monitoring
labels:
k8s-app: jx3recipe
spec:
jobLabel: k8s-app
endpoints:
- port: port
interval: 30s
scheme: http
selector:
matchLabels:
run: jx3recipe
namespaceSelector:
matchNames:
- default
新建service文件
cat prometheus-jx3recipeService.yaml
apiVersion: v1
kind: Service
metadata:
name: jx3recipe
namespace: default
labels:
run: jx3recipe
spec:
type: ClusterIP
clusterIP: None
ports:
- name: port
port: 7000
protocol: TCP ---
apiVersion: v1
kind: Endpoints
metadata:
name: jx3recipe
namespace: default
labels:
run: jx3recipe
subsets:
- addresses:
- ip: 10.8.0.19
nodeName: jx3recipe-01
- ip: 10.8.2.17
nodeName: jx3recipe-02
ports:
- name: port
port: 7000
protocol: TCP
这里有个问题,我把EP写死了,可能容器重启后,IP地址改变的话,就不行了,所以这里有点问题。
kubectl apply -f prometheus-jx3recipeService.yaml
kubectl apply -f prometheus-serviceMonitorJx3recipe.yaml
在promethues的targets里面可以看到效果:
随便挑个item查看数据:
一切OK,后续我们就可以使用grafana定制dashboard了。
kube-promethues对外暴露
上面环境搭建完成后,服务都是对内的,我们需要对外进行暴露,由于环境是搭建在金山云上,所以直接使用公有云的LB即可。
grafana暴露
只需要把service的type改为LB。
直接通过外网IP访问即可。http://120.92.*.*:3000访问grafana。
进入后可以看到已经自带了很多dashboard,比较丰富,包括cluster、node、pod以及k8s的各个组件的监控数据。
Node
promethues本身
当然,我们还可以从grafana导入一些更加炫酷的dashboard,便于我们实时掌握资源使用情况。
相关文件已经上传到了github上,可以直接导入使用:
https://github.com/loveqx/k8s-study
kubernetes监控终极方案-kube-promethues的更多相关文章
- 【译】Kubernetes监控实践(2):可行监控方案之Prometheus和Sensu
本文介绍两个可行的K8s监控方案:Prometheus和Sensu.两个方案都能全面提供系统级的监控数据,帮助开发人员跟踪K8s关键组件的性能.定位故障.接收预警. 拓展阅读:Kubernetes监控 ...
- Kubernetes 监控方案之 Prometheus Operator(十九)
目录 一.Prometheus 介绍 1.1.Prometheus 架构 1.2.Prometheus Operator 架构 二.Helm 安装部署 2.1.Helm 客户端安装 2.2.Tille ...
- Kubernetes审计日志方案
前言 当前Kubernetes(K8S)已经成为事实上的容器编排标准,大家关注的重点也不再是最新发布的功能.稳定性提升等,正如Kubernetes项目创始人和维护者谈到,Kubernetes已经不再是 ...
- 最全Kubernetes审计日志方案
前言 当前Kubernetes(K8S)已经成为事实上的容器编排标准,大家关注的重点也不再是最新发布的功能.稳定性提升等,正如Kubernetes项目创始人和维护者谈到,Kubernetes已经不再是 ...
- Kubernetes监控:部署Heapster、InfluxDB和Grafana
本节内容: Kubernetes 监控方案 Heapster.InfluxDB和Grafana介绍 安装配置Heapster.InfluxDB和Grafana 访问 grafana 访问 influx ...
- 云原生应用 Kubernetes 监控与弹性实践
前言 云原生应用的设计理念已经被越来越多的开发者接受与认可,而Kubernetes做为云原生的标准接口实现,已经成为了整个stack的中心,云服务的能力可以通过Cloud Provider.CRD C ...
- Android 跳转权限设置界面的终极方案
转载请标明出处,维权必究:https://www.cnblogs.com/tangZH/p/10338377.html 有时候APP需要获取某些权限,要让用户手动打开,那么问题来了,若是直接提醒用户出 ...
- iOS 【终极方案】精准获取webView内容高度,自适应高度
前言:是这样的,刚写完上一篇文章还没缓过神来,上一篇文章我还提到了,想和大家聊聊原生+H5如何无缝连接的故事.结果我朋友就给我发了两篇他的作品.他的做法也都有独到之处.好的文章都是这样,让你每次看都能 ...
- 解决sql server2008数据库安装之后,web程序80端口被占用问题(终极方案)
解决sql server2008数据库安装之后,web程序80端口被占用问题(终极方案) 前言:原来电脑上的Apache一直使用正常,在安装sql server2008后,突然发现Apache无法启动 ...
随机推荐
- 创建Spring boot project报错:Project build error: Non-resolvable parent POM for xxx:0.0.1-SNAPSHOT: Could not transfer artifact org.springframework.boot:spring-boot-starter-parent
刚开始创建Spring boot项目时,pom.xml文件时报如下图错误: 在网上百度的说让更新下Maven的update project,我试了没用,最后将version版本改了就行了,我原来版本是 ...
- Linq 等式运算符:SequenceEqual(转载)
https://www.bbsmax.com/A/nAJvbKywJr/ 引用类型比较的是引用,需要自己实现IEqualityComparer 比较器. IList<string> str ...
- Xmind8安装和破解(Windows下)
如果本文对你有用,请爱心点个赞,提高排名,帮助更多的人.谢谢大家!❤ 如果解决不了,可以在文末进群交流. 一.准备工作:软件.补丁下载及安装 Xmind8官方下载地址:https://www.xmi ...
- InitContainer
InitContainer 初始化容器 在Pod中,容器是共享存储资源和网络资源的,所以Init Container容器产生的数据是可以被其他容器作用到的.初始化容器有点类似于postStart 钩子 ...
- Python并发编程-concurrent包
Python并发编程-concurrent包 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.concurrent.futures包概述 3.2版本引入的模块. 异步并行任务编程 ...
- ITIL 4Foundation认证
2019年5月参加了ITIL 4Foundation培训和认证.最新的ITIL4版本中,结合了Lean.Agile和DevOps的思想.经过学习后,在思想上有很大的收货. 在此记录自己的成长.
- windows(hexo)使用git时出现:warning: LF will be replaced by CRLF
hexo出现warning: LF will be replaced by CRLF git config --global core.autocrlf false //禁用自动转换
- NOIP2018 旅行 和 赛道修建
填很久以前的坑. 旅行 给一棵 n 个点的基环树,求字典序最小的DFS序. n ≤ 5000 题解 O(n2) 做法非常显然,枚举断掉环上哪条边然后贪心即可.当然我去年的骚操作只能得88分. O(n ...
- 【CLAA系列】CLAA协议学习(CS方向)
工作上用Lora,需要开发相关模块,分享一下学习的内容: Lora: 博主是做IT的,对Lora不了解.简单理解为LPWAN(Low Power Wide Area Network)中一种技术,目前主 ...
- 如何有效使用Project(1)——编制进度计划、保存基准
1.前言: 软件产品的研发.升级.定制等,一般都是以项目的形式进行,此时项目进度计划以及资源使用情况就变成了项目经理关注的重点.如何让项目计划有效可控,及时暴露问题?如何查看资源的负荷情况,看资源分配 ...