在 k8s 中部署 Prometheus 和 Grafana

部署 Prometheus 和 Grafana 到 k8s

Intro

上次我们主要分享了 asp.net core 集成 prometheus,以及简单的 prometheus 使用,在实际在 k8s 中部署的时候就不能在使用前面讲的静态配置的方式来部署了,需要使用 Prometheus 的服务发现。

部署规划

Prometheus 和 Grafana 的部署放在一个单独的 namespace —— monitoring 下面,这样的好处在于可以屏蔽掉一些细节,别的 namespace 无感知,也不需要知道它们的存在

可以使用 kubectl create namespace monitoring 来创建命名空间或者 kubectl apply 执行下面的 yaml 配置

apiVersion: v1
kind: Namespace
metadata:name: monitoring

希望 prometheus 和 grafana 可以公网访问,所以需要配置一下端口号,NodePort 31100~31200 保留为基础设施使用的端口,31110 保留为 prometheus 需要的端口,31120 保留为 Grafana 端口,端口规划好后,就可以先配置 nginx 了,增加 nginx 配置如下:

server {listen 443;server_name monitoring.weihanli.xyz;location / {proxy_pass http://172.18.0.2:31110;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}
}
server {listen 443;server_name grafana.weihanli.xyz;location / {proxy_pass http://172.18.0.2:31120;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}
}

Grafana 比较简单,部署一个 service,部署一个 deployment 就可以了,Prometheus 要把配置文件放到 ConfigMap 里单独管理,另外 Prometheus 涉及到要使用 k8s 服务发现,需要创建一个 serviceAccount 以有权限来获取 k8s 中的资源

部署 Grafana

部署 deployment,deployment yaml 如下,可以根据自己需要进行调整

apiVersion: apps/v1
kind: Deployment
metadata:name: grafananamespace: monitoringlabels:app: grafana
spec:replicas: 1revisionHistoryLimit: 2selector:matchLabels:app: grafanaminReadySeconds: 0strategy:type: RollingUpdaterollingUpdate:maxUnavailable: 1maxSurge: 1template:metadata:labels:app: grafanaspec:containers:        - name: grafanaimage: grafana/grafanaimagePullPolicy: IfNotPresentresources:limits:memory: "128Mi"cpu: "50m"readinessProbe:httpGet:path: /api/healthport: 3000initialDelaySeconds: 60periodSeconds: 10livenessProbe:tcpSocket:port: 3000initialDelaySeconds: 60periodSeconds: 10ports:- containerPort: 3000

根据上面的 yaml 定义创建 Grafana 的 deploy,创建之后再创建 service

apiVersion: v1
kind: Service
metadata:name: grafananamespace: monitoring
spec:selector:app: grafanatype: NodePortports:- protocol: TCPport: 3000targetPort: 3000nodePort: 31120

创建之后就可以在 k8s 集群外部访问到 Grafana 了,通过前面 nginx 的配置我们就可以直接通过域名访问了

部署 Prometheus

ServiceAccount

首先我们先创建一个 Service Account,k8s 使用基于角色的 RBAC 授权机制,创建 ServiceAccount 之后还需要创建一个 ClusterRole 和 ClusterRoleBinding,ClusterRole 用于指定权限,ClusteRoleBinding 用来给 serviceAccount 关联角色,为了方便这几个都定义在了一个 yaml 文件中

apiVersion: v1
kind: ServiceAccount
metadata:name: prometheusnamespace: monitoring---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:name: prometheus
rules:
- apiGroups: [""]resources:- nodes- services- endpoints- podsverbs: ["get", "list", "watch"]
- apiGroups: [""]resources:- configmapsverbs: ["get"]
- nonResourceURLs: ["/metrics"]verbs: ["get"]---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: prometheus
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: prometheus
subjects:
- kind: ServiceAccountname: prometheusnamespace: monitoring

ConfigMap

创建 ServiceAccount 之后,我们创建 Prometheus 的配置文件,放在 ConfigMap 中挂载在 Prometheus 里

apiVersion: v1
kind: ConfigMap
metadata:name: prometheus-confignamespace: monitoring
data:default: |# my global configglobal:scrape_interval:     10s # Set the scrape interval to every 15 seconds. Default is every 1 minute.evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.rule_files:# - "first_rules.yml"# - "second_rules.yml"# A scrape configuration containing exactly one endpoint to scrape:scrape_configs:- job_name: 'kubernetes-service-endpoints'kubernetes_sd_configs:- role: endpointsrelabel_configs:- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_should_be_scraped]action: keepregex: true- action: labelmapregex: __meta_kubernetes_pod_label_(.+)- source_labels: [__meta_kubernetes_namespace]action: replacetarget_label: k8s_namespace- source_labels: [__meta_kubernetes_service_name]action: replacetarget_label: k8s_service- source_labels: [__meta_kubernetes_pod_name]separator: ;regex: (.*)replacement: $1target_label: k8s_podaction: replace

执行上面的 yaml 配置以部署 prometheus 需要的配置

我们可以利用 prometheus 的 relabel 的机制将一些元数据信息应用的 metrics 信息上,这样我们就可以知道这个 metrics 信息是来自哪一个 namespace 下面哪一个 service 哪一个 Pod 里,在 Prometheus targets 的界面可以看到所有的 metadata label,或者参考文档上的介绍 https://prometheus.io/docs/prometheus/latest/configuration/configuration#kubernetes_sd_config

__meta_kubernetes_service_annotation_prometheus_io_should_be_scraped 是我后面加上的,不加这个的话,会尝试从所有的 k8s 资源中获取 metrics 信息,这回导致很多没有集成 Prometheus metrics 的资源也会被持续访问,所以增加了这个配置,如果 service 里的 annotation 里有 prometheus.io/should_be_scraped 配置的话 Prometheus 才会去拉取 metrics 信息

需要 Prometheus 抓取 metrics 的 service 配置实力:

apiVersion: v1
kind: Service
metadata:name: reservation-serverannotations:prometheus.io/should_be_scraped: "true"
spec:selector:app: reservation-servertype: NodePortports:- protocol: TCPport: 80targetPort: 80nodePort: 31220

如果后面需要配置不同的 metrics_path,也可以使用类似的模式来增加一个 prometheus.io/metrics-path 类似的配置转换成真正要拉取 metrics 信息的 path 即可

Deployment

前面 Prometheus 部署所需要的 serviceAccount 和 config 我们都已经准备好了,执行下面的 yaml 配置就可以部署应用了

apiVersion: apps/v1
kind: Deployment
metadata:name: prometheusnamespace: monitoringlabels:app: prometheus
spec:replicas: 1revisionHistoryLimit: 2 # how many old ReplicaSets for this Deployment you want to retain, https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#clean-up-policyselector:matchLabels:app: prometheusminReadySeconds: 0strategy:type: RollingUpdaterollingUpdate:maxUnavailable: 1maxSurge: 1template:metadata:labels:app: prometheusspec:serviceAccountName: prometheuscontainers:- name: prometheusimage: prom/prometheusimagePullPolicy: IfNotPresentresources:limits:memory: "512Mi"cpu: "200m"readinessProbe:httpGet:path: /-/readyport: 9090initialDelaySeconds: 60periodSeconds: 10livenessProbe:httpGet:path: /-/healthyport: 9090initialDelaySeconds: 60periodSeconds: 10ports:- containerPort: 80volumeMounts:- name: configmountPath: /etc/prometheus/prometheus.ymlsubPath: defaultvolumes:- name: configconfigMap:name: prometheus-config

Service

deployment 创建之后,只要根据下面的配置创建 service 就可以访问了

apiVersion: v1
kind: Service
metadata:name: prometheusnamespace: monitoring
spec:selector:app: prometheustype: NodePortports:- protocol: TCPport: 9090targetPort: 9090nodePort: 31110

Sample

运行 kubectl get all -n monitoring 查看部署之后的资源情况:

Resources

打开 prometheus 可以执行一个简单的查询,看一下

Prometheus query

在 Grafana 中添加 DataSource,域名使用 service name prometheus 即可,这样可以通过内网去访问,就不需要绕公网走一圈了

新建一个 Dashboard 把刚才的查询通过 Grafana 来做一个展示,新建一个 Panel,输入刚才我们执行的查询

Legend 中可以使用 lable,使用语法可以用 {{label_name}}

可以在右侧方便设置显示最小值,最大值,平均值,当前值和总计

如果要添加筛选条件如只看某一个 app 的数据,可以在查询表达式中添加条件,使用语法 metrics_name{label_name="label_value"}

更多查询语法可以参考官方文档的介绍 https://prometheus.io/docs/prometheus/latest/querying/basics/

More

上面部署的时候没有做数据的挂载,实际部署的时候需要考虑挂载数据目录,这样即使服务重启,数据还是在的,如果不关心数据问题的话可以忽略

Reference

  • https://github.com/OpenReservation/ReservationServer/blob/dev/k8s/prometheus/deployment.yaml

  • https://github.com/OpenReservation/ReservationServer/blob/dev/k8s/prometheus/configMap.yaml

  • https://github.com/OpenReservation/ReservationServer/blob/dev/k8s/grafana/deployment.yaml

  • https://github.com/OpenReservation/ReservationServer/blob/dev/k8s/grafana/service.yaml

  • https://medium.com/kubernetes-tutorials/monitoring-your-kubernetes-deployments-with-prometheus-5665eda54045

  • https://prometheus.io/docs/prometheus/latest/configuration/configuration

  • https://prometheus.io/docs/prometheus/latest/querying/basics/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/306481.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

EntityFramework Core 5.0 VS SQLBulkCopy

【导读】EF Core 5.0伴随着.NET 5.0发布已有一段时日,本节我们来预估当大批量新增数据时,大概是多少区间我们应该考虑SQLBulkCopy而不是EF CoreSQLBulkCopy早出现于.NET Framework 2.0,将数据批量写入利用此类毫无疑问最佳,虽其来…

小心使用 Task.Run 续篇

关于前两天发布的文章:为什么要小心使用 Task.Run,对文中演示的示例到底会不会导致内存泄露,给很多人带来了疑惑。这点我必须向大家道歉,是我对导致内存泄漏的原因没描述和解释清楚,也没用实际的示例证实,是…

java实用教程——组件及事件处理——设置组件的位置(相对于窗口具体位置和布局)

1: 相对于窗口的具体位置 关键点: JButton组件添加到JPanel时,如果想自己位置,需要对JPanel进行如下设置,才能自定义按钮位置 需要将组件添加到画板上去,才可以设置组件的相对具体位置 button1.setBounds…

usb接口定义引脚说明_PerfDogService使用说明

令牌申请教程:https://bbs.perfdog.qq.com/article-detail.html?id55安装包下载:https://perfdog.qq.com/sdk一、 概述PerfDog性能狗服务组件,用户可基于service组件二次开发自己PerfDog性能工具或自动化服务。本文档主要对PerfDogService提…

java实用教程——组件及事件处理——布局管理(五种)

1.流式布局FlowLayout public void pack()调整此窗口的大小,以适合其子组件的首选大小和布局。如果该窗口或其所有者仍不可显示,则两者在计算首选大小之前变得可显示。在计算首选大小之后,将会验证该Window。窗口自动适应大小,使…

个人博客前端模板_腾讯前端开发工程师,教你极速搭建一个个人博客网站

作者: bookerzhao,腾讯 CSIG web前端开发工程师Github 为开源项目提供了用于静态页面展示的 Pages 服务,很多开发者都在上面托管了自己的静态网站和博客,不少开源项目的案例和文档页面也采用了这种方式。不过由于 Pages 的 CDN 节…

云原生时代 给予.NET的机会

.NET诞生于与Java的竞争,微软当年被罚款20亿美元。Java绝不仅仅是一种语言,它是COM的替代者!而COM恰恰是Windows的编程模型。而Java编程很多时候比C编程要容易的多,更致命的是他是跨平台的。微软所推行.NET战略,并且C#…

java实用教程——组件及事件处理——布局的一个小实例

import javax.swing.*; import java.awt.*;public class BasicComponentDemo {Frame frame new Frame("这里测试基本组件");//定义一个按钮Button ok new Button("确认");//定义一个复选框组CheckboxGroup cbg new CheckboxGroup();//定义一个单选框&am…

非极大值抑制_非极大值抑制(non-maximum suppression)

摘自https://blog.csdn.net/qq_38906523/article/details/80195119摘自https://blog.csdn.net/xiexu911/article/details/80609298非极大值抑制NMS在目标检测,定位等领域是一种被广泛使用的方法。对于目标具体位置定位过程,不管是使用sliding Window还是…

TIOBE12月榜单:Java重回第二,Python有望四连冠年度语言

喜欢就关注我们吧!文|白开水TIOBE 公布了 2020 年 12 月的编程语言排行榜。TIOBE 将在下个月公布 2020 年的年度编程语言,一年内排名率增长最高的编程语言将获得这一称号。目前,Python 以 1.90% 数据遥遥领先。其次分别是 C(0.71%…

excel怎么在柱状图上加超链_如何让你的年终总结更符合领导心意,高薪员工必备的excel技能...

临近年底了,好多人都在写年终总结了,惯有的模式就是写一写这一年都做了哪些工作,有什么成绩,未来将如何完善等等......但是如何反应自己一年以来的成绩呢,如果单单是以文字的形式表述怕是不能让领导满意,甚…

java实用教程——组件及事件处理——对话框(dialog)

对话框: import java.awt.event.ActionEvent;import java.awt.event.ActionListener; import java.awt.*; import java.awt.event.*;public class DialogDemo1 {public static void main(String[] args) {Frame frame new Frame("这里测试Dialog");Di…

Vue 凭什么成为 2020 年的一匹黑马

Vue 在前端开发中的火爆程度远超 React 和 Angular ,无论是 BAT 等大厂,还是小型初创公司,Vue 都有着广泛的应用,其相关技术原理也是面试的必考知识点。Vue 的优势太过明显:基于 HTML 的模板语法,响应式的更…

python——学习笔记1

推荐阅读: 爆肝十二万字《python从零到精通教程》 Python菜鸟教程 1.python 的输入输出: 输入:input() 输出:print() 输出不换行:print(x,end"") 数据要和字符串同时输出的时候需要将数据转化为字符串类…

开源C# Winform控件库《SunnyUI》强力推荐

本站(https://dotnet9.com)曾介绍过一款Winform开源控件库《HZHControls》,文章发布后不少朋友热情的咨询相关控件库信息,由此看来Winform在大家心中的地位还是挺高的。今天小编再分享一款新鲜出炉的 Winform 控件库库——SunnyUI,一起跟 Dot…

python——学习笔记2

python的数据结构 字符串: 字符串小写转大写: 字符串大写转小写: 删除空格: 空白是实际文本之前和/或之后的空间,通常您想删除这个空间。 strip()方法从开头或结尾删除任何空格: 替换字符串: replace()方…

庐山真面目之一 微服务的简介和技术栈

一、简介 这些年软件的设计规模越来越庞大,业务需求也越来越复杂,针对系统的性能、高吞吐率、高稳定性、高扩展等特性提出了更高的要求。可以说业务需求是软件架构能力的第一推动力,由于这些因素导致了软件架构思想和相关技术也在发生…

.net 读蓝牙数据_Linux内核曝严重蓝牙漏洞,影响多个版本

谷歌安全研究人员在Linux Kernel中发现了一组蓝牙漏洞(BleedingTooth),该漏洞可能允许攻击者进行零点击攻击,运行任意代码或访问敏感信息。BleedingTooth漏洞分别被命名为CVE-2020-12351,CVE-2020-12352和CVE-2020-24490。其中最严重的漏洞是…

python——学习笔记3

日期: Python 日期和时间 函数: python 传不可变对象实例

算法题目——电梯(HDU-1008)

题目链接&#xff1a;HDU-1008 上楼&#xff1a;输入俩楼层之差 * 6s 停留层的5s 下楼&#xff1a;输入俩楼层之差 * 4s 停留层的5s #include<iostream> #include<vector>using namespace std; int main() {vector<int> vec;//用于存储每次的楼层数 vector…