k8s-8部署Prometheus+Grafana
采用文章大佬–为了提高自己的k8s熟练,按照这位大佬的文章做了一遍
https://www.yuque.com/cuiliang-s1qrv/k8s/yyiswl
一、Prometheus介绍
如果已安装metrics-server需要先卸载,否则冲突
- Prometheus(普罗米修斯)是一套开源的监控&报警&时间序列数据库的组合,起始是由SoundCloud公司开发的。随着发展,越来越多公司和组织接受采用Prometheus,社会也十分活跃,他们便将它独立成开源项目。现在最常见的Kubernetes容器管理系统中,通常会搭配Prometheus进行监控。
- Prometheus基本原理是通过HTTP协议周期性抓取被监控组件的状态,这样做的好处是任意组件只要提供HTTP接口就可以接入监控系统,不需要任何SDK或者其他的集成过程。这样做非常适合虚拟化环境比如VM或者Docker
。 - 输出被监控组件信息的HTTP接口被叫做exporter
。目前互联网公司常用的组件大部分都有exporter可以直接使用,比如Varnish、Haproxy、Nginx、MySQL、Linux
系统信息 (包括磁盘、内存、CPU、网络等等) - 与其他监控系统相比,Prometheus的主要特点是:
- 一个多维数据模型(时间序列由指标名称定义和设置键/值尺寸);
- 非常高效的存储;
- 一种灵活的查询语言;
- 不依赖分布式存储,单个服务器节点;
- 时间集合通过HTTP上的PULL模型进行;
- 通过中间网关支持推送时间;
- 通过服务发现或静态配置发现目标;
- 多种模式的图形和仪表板支持。
二、Grafana介绍
Grafana是一个跨平台的开源的度量分析和可视化工具,可以通过将采集的数据查询然后可视化的展示,并及时通知。它主要有以下六大特点:
- 展示方式:快速灵活的客户端图表,面板插件有许多不同方式的可视化指标和日志,官方库中具有丰富的仪表盘插件,比如热图、折线图、图表等多种展示方式;
- 数据源:Graphite,InfluxDB,OpenTSDB,Prometheus,Elasticsearch,CloudWatch和KairosDB等;
- 通知提醒:以可视方式定义最重要指标的警报规则,Grafana将不断计算并发送通知,在数据达到阈值时通过Slack、PagerDuty等获得通知;
- 混合展示:在同一图表中混合使用不同的数据源,可以基于每个查询指定数据源,甚至自定义数据源;
- 注释:使用来自不同数据源的丰富事件注释图表,将鼠标悬停在事件上会显示完整的事件元数据和标记;
- 过滤器:Ad-hoc过滤器允许动态创建新的键/值过滤器,这些过滤器会自动应用于使用该数据源的所有查询。
三、组件说明
- MetricServer:是kubernetes集群资源使用情况的聚合器,收集数据给kubernetes集群内使用,如kubectl,hpa,scheduler等。
- PrometheusOperator:是一个系统监测和警报工具箱,用来存储监控数据。
- NodeExporter:用于各node的关键度量指标状态数据。
- KubeStateMetrics:收集kubernetes集群内资源对象数据,制定告警规则。
- Prometheus:采用pull方式收集apiserver,scheduler,controller-manager,kubelet组件数据,通过http协议传输。
- Grafana:是可视化数据统计和监控平台。
四、安装部署
1. git项目至本地
# git clone https://github.com/coreos/kube-prometheus.git
2. 修改资源清单文件
root@k8s-master:~/k8s-Prometheus# cd kube-prometheus/
root@k8s-master:~/k8s-Prometheus/kube-prometheus# ls
build.sh CONTRIBUTING.md example.jsonnet go.mod jsonnetfile.json kustomization.yaml manifests scripts
CHANGELOG.md developer-workspace examples go.sum jsonnetfile.lock.json LICENSE README.md tests
code-of-conduct.md docs experimental jsonnet kubescape-exceptions.json Makefile RELEASE.md
修改文件一
-
修改 kube-prometheus/manifests/grafana-service.yaml 文件,使用 nodepode 方式
root@k8s-master:~/k8s-Prometheus/kube-prometheus/manifests# root@k8s-master:~/k8s-Prometheus/kube-prometheus/manifests# pwd /root/k8s-Prometheus/kube-prometheus/manifests root@k8s-master:~/k8s-Prometheus/kube-prometheus/manifests# vim grafana-service.yaml
1 apiVersion: v1 2 kind: Service 3 metadata: 4 labels: 5 app.kubernetes.io/component: grafana 6 app.kubernetes.io/name: grafana 7 app.kubernetes.io/part-of: kube-prometheus 8 app.kubernetes.io/version: 9.0.4 9 name: grafana 10 namespace: monitoring 11 spec: 12 type: NodePort 13 ports: 14 - name: http 15 port: 3000 16 targetPort: http 17 nodePort: 30100 18 selector: 19 app.kubernetes.io/component: grafana 20 app.kubernetes.io/name: grafana 21 app.kubernetes.io/part-of: kube-prometheus
修改文件二
修改 kube-prometheus/manifests/prometheus-service.yaml,改为nodepode方式
1 apiVersion: v1
2 kind: Service
3 metadata:
4 labels:
5 app.kubernetes.io/component: prometheus
6 app.kubernetes.io/instance: k8s
7 app.kubernetes.io/name: prometheus
8 app.kubernetes.io/part-of: kube-prometheus
9 app.kubernetes.io/version: 2.37.0
10 name: prometheus-k8s
11 namespace: monitoring
12 spec:
13 type: NodePort
14 ports:
15 - name: web
16 port: 9090
17 targetPort: web
18 nodePort: 30200
19 selector:
20 app.kubernetes.io/component: prometheus
21 app.kubernetes.io/instance: k8s
22 app.kubernetes.io/name: prometheus
23 app.kubernetes.io/part-of: kube-prometheus
24 sessionAffinity: ClientIP
修改文件三
- 修改 kube-prometheus/manifests/alertmanager-service.yaml,改为 nodepode
1 apiVersion: v1
2 kind: Service
3 metadata:
4 labels:
5 app.kubernetes.io/component: alert-router
6 app.kubernetes.io/instance: main
7 app.kubernetes.io/name: alertmanager
8 app.kubernetes.io/part-of: kube-prometheus
9 app.kubernetes.io/version: 0.24.0
10 name: alertmanager-main
11 namespace: monitoring
12 spec:
13 type: NodePort
14 ports:
15 - name: web
16 port: 9093
17 targetPort: web
18 nodePort: 30300
19 selector:
20 app.kubernetes.io/component: alert-router
21 app.kubernetes.io/instance: main
22 app.kubernetes.io/name: alertmanager
23 app.kubernetes.io/part-of: kube-prometheus
24 sessionAffinity: ClientIP
3. 创建资源对象
-
创建monitoring名称空间 `# kubectl create namespace monitoring` - 创建crd资源 `# kubectl apply -f kube-prometheus/manifests/setup/` - 创建其他资源 `# kubectl apply -f kube-prometheus/manifests/`
遇到报错
error: unable to recognize "kube-prometheus/manifests/prometheus-prometheus.yaml": no matches for kind "Prometheus" in version "monitoring.coreos.com/v1"
解决报错
没有采用上面命令,采用的下面解决报错命令
https://blog.csdn.net/weixin_48351036 #解决问题文章
解决办法:
``
$ kubectl create -f manifests/setup
$ until kubectl get servicemonitors --all-namespaces ; do date; sleep 1; echo ""; done
$ kubectl create -f manifests/
4. 验证查看
查看pod状态
kubectl get pod -n monitoring
查看top信息
5. web访问验证
访问prometheus http://196.196.196.11:30200/targets,查看节点状态
访问 grafana http://196.196.196.11:30100/login,默认用户名和密码是admin/admin
配置数据源
使用默认配置,点击测试
导入默认仪表盘
添加数据源
配置文档
https://jingyan.baidu.com/article/9faa7231ae65c2063c28cba9.html
添加数据源
首先在左边菜单找到setting设置按钮,然后在设备选项里面找到数据源data source点击进去
然后在界面点击add data source按钮,进入添加数据源的页面
然后在数据源添加的界面选择你的数据源类型,这里用的是prometheus数据源,点击它就行
然后设置数据源中的一些参数及数据源服务地址,主要是设置url,其他可以默认
然后点击save & test按钮,然后提示data source is working,就代表添加成功了,关掉该页面
END
添加仪表盘模版
点击左侧的加号的符号,然后在里面点击import导入按钮
然后输入模版的code,可以去官网找你喜欢的模版,然后复制code在这里添加即可
模板导入后,会进行数据源的选择,这里选择prometheus,然后点击import按钮就成功导入了
点击home选择仪表盘查看
配置prometheus
两个监控任务没有对应的目标
-
新建prometheus-kubeSchedulerService.yaml并apply创建资源
apiVersion: v1 kind: Service metadata: namespace: kube-system name: kube-scheduler labels: k8s-app: kube-scheduler #与servicemonitor中的selector匹配 spec: selector: component: kube-scheduler # 与scheduler的pod标签一直 ports: - name: http-metrics port: 10251 targetPort: 10251 protocol: TCP
新建prometheus-kubeControllerManagerService.yaml并apply创建资源
apiVersion: v1
kind: Service
metadata:
namespace: kube-system
name: kube-controller-manager
labels:
k8s-app: kube-controller-manager
spec:
selector:
component: kube-controller-manager
ports:
- name: http-metrics
port: 10252
targetPort: 10252
protocol: TCP
查看prometheus-serviceMonitorKubeScheduler.yaml 文件,并apply创建资源
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
labels:
k8s-app: kube-scheduler
name: kube-scheduler
namespace: monitoring
spec:
endpoints:
- bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token
interval: 30s # 每30秒采集一次信息
port: https-metrics # 对应service的端口名
scheme: https
tlsConfig:
insecureSkipVerify: true
jobLabel: k8s-app
namespaceSelector:
matchNames:
- kube-system
# selector匹配的资源标签为k8s-app=kube-scheduler
selector:
matchLabels:
k8s-app: kube-scheduler
再次查看targets信息
六、部署pushgateway
- pushgetway目录下,创建这三个yaml文件。
root@k8s-master:~/k8s-Prometheus/kube-prometheus# pwd
/root/k8s-Prometheus/kube-prometheus
root@k8s-master:~/k8s-Prometheus/kube-prometheus# mkdir pushgetway
root@k8s-master:~/k8s-Prometheus/kube-prometheus# cd pushgetway/
root@k8s-master:~/k8s-Prometheus/kube-prometheus/pushgetway#
vim prometheus-pushgatewayServiceMonitor.yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
labels:
prometheus: k8s
name: prometheus-pushgateway
namespace: monitoring
spec:
endpoints:
- honorLabels: true
port: http
jobLabel: k8s-app
selector:
matchLabels:
app: prometheus-pushgateway
第二个文件
vim prometheus-pushgatewayService.yaml
apiVersion: v1
kind: Service
metadata:
labels:
app: prometheus-pushgateway
name: prometheus-pushgateway
namespace: monitoring
spec:
type: NodePort
ports:
- name: http
port: 9091
nodePort: 30400
targetPort: metrics
selector:
app: prometheus-pushgateway
# type: ClusterIP
第三个文件
vim prometheus-pushgatewayDeployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: prometheus-pushgateway
name: prometheus-pushgateway
namespace: monitoring
spec:
replicas: 1
selector:
matchLabels:
app: prometheus-pushgateway
template:
metadata:
labels:
app: prometheus-pushgateway
spec:
containers:
- image: prom/pushgateway:v0.8.0
livenessProbe:
httpGet:
path: /#/status
port: 9091
initialDelaySeconds: 10
timeoutSeconds: 10
name: prometheus-pushgateway
ports:
- containerPort: 9091
name: metrics
readinessProbe:
httpGet:
path: /#/status
port: 9091
initialDelaySeconds: 10
timeoutSeconds: 10
resources:
limits:
cpu: 50m
memory: 100Mi
requests:
cpu: 50m
memory: 100Mi
然后使用
kubectl apply -f .
nds: 10
name: prometheus-pushgateway
ports:
- containerPort: 9091
name: metrics
readinessProbe:
httpGet:
path: /#/status
port: 9091
initialDelaySeconds: 10
timeoutSeconds: 10
resources:
limits:
cpu: 50m
memory: 100Mi
requests:
cpu: 50m
memory: 100Mi
[外链图片转存中...(img-4VBPkFaF-1659189962398)]
###### 然后使用
```shell
kubectl apply -f .