草庐IT

Kubernetes(k8s)部署Promehteus(kube-prometheus&kube-prometheus-stack)监控

技术栈 2023-03-28 原文

一、概述

在1.8版本以后heapster由metrics-server替代;从k8s的v1.11版本开始已经全面转向以Prometheus为核心的新监控体系架构;kube-prometheus 中包含了 prometheus 监控所用到的所有组件,当然也包含 prometheus-operator。

Helm中心仓库的PrometheusOperator Chart,在2020年9月已经不维护了,新的Chart在Prometheus Community的Repo中,叫 kube-prometheus-stack,使用时需要先添加该Repo。

heapster-》metrics-server-》prometheus-operator -》kube-prometheus-》kube-prometheus-stack

1)metrics-server简介

metrics-server 通过kubelet(cAdvisor)获取监控数据,主要作用是为kube-scheduler,HPA等k8s核心组件,以及kubectl top命令和Dashboard等UI组件提供数据来源。

【注意】如果要部署prometheus,就不用部署了metrics-server了,否则冲突,推荐只部署prometheus,所以这里也只讲prometheus的部署。

2)Prometheus简介

Prometheus是一个开源监控系统,它前身是SoundCloud的警告工具包。从2012年开始,许多公司和组织开始使用Prometheus。

Prometheus的主要特征有:

  • 多维度数据模型
  • 灵活的查询语言
  • 不依赖分布式存储,单个服务器节点是自主的
  • 以HTTP方式,通过pull模型拉去时间序列数据
  • 也通过中间网关支持push模型
  • 通过服务发现或者静态配置,来发现目标服务对象
  • 支持多种多样的图表和界面展示,grafana也支持它

组件
Prometheus生态包括了很多组件,它们中的一些是可选的:

  • 主服务Prometheus Server负责抓取和存储时间序列数据
  • 客户库负责检测应用程序代码
  • 支持短生命周期的PUSH网关
  • 基于Rails/SQL仪表盘构建器的GUI
  • 多种导出工具,可以支持Prometheus存储数据转化为HAProxy、StatsD、Graphite等工具所需要的数据存储格式
  • 警告管理器
  • 命令行查询工具
  • 其他各种支撑工具

3)Prometheus Operator

Prometheus Operator的本职就是一组用户自定义的CRD资源以及Controller的实现,Prometheus Operator负责监听这些自定义资源的变化,并且根据这些资源的定义自动化的完成如Prometheus Server自身以及配置的自动化管理工作。以下是Prometheus Operator的架构图:

4)metrics-server&Promehteus对比&特性

  • 使用metric-server收集数据给k8s集群内使用,如kubectl,hpa,scheduler等
  • 使用prometheus-operator部署prometheus,存储监控数据
  • 使用kube-state-metrics收集k8s集群内资源对象数据
  • 使用node_exporter收集集群中各节点的数据
  • 使用prometheus收集apiserver,scheduler,controller-manager,kubelet组件数据
  • 使用alertmanager实现监控报警
  • 使用grafana实现数据可视化

5)Prometheus Operator VS kube-prometheus

最开始是Heapster+cAdvisor方式监控,这是Prometheus Operator出现之前的k8s监控方案。后来出现了Prometheus Operator,但是目前Prometheus Operator已经不包含完整功能,完整的解决方案已经变为kube-prometheus。

  • Prometheus Operator 是CoreOS的一个开源项目,用来增强Prometheus在Kubernetes中的管理运维能力。利用Kubernetes的自定义资源定义 (Custom Resource Definition)的特性,实现声明式管理运维Prometheus监控告警系统。
  • kube-prometheus 为基于 Prometheus 和 Prometheus Operator 的完整集群监控堆栈提供示例配置。这包括部署多个 Prometheus 和 Alertmanager 实例、指标导出器(例如用于收集节点指标的 node_exporter)、抓取将 Prometheus 链接到各种指标端点的目标配置,以及用于通知集群中潜在问题的示例警报规则。
  • 两个项目的关系:前者只包含了Prometheus Operator,后者既包含了Operator,又包含了Prometheus相关组件的部署及常用的Prometheus自定义监控,具体包含下面的组件
    1. The Prometheus Operator:创建CRD自定义的资源对象
    2. Highly available Prometheus:创建高可用的Prometheus
    3. Highly available Alertmanager:创建高可用的告警组件
    4. Prometheus node-exporter:创建主机的监控组件
    5. Prometheus Adapter for Kubernetes Metrics APIs:创建自定义监控的指标工具(例如可以通过nginx的request来进行应用的自动伸缩)
    6. kube-state-metrics:监控k8s相关资源对象的状态指标
    7. Grafana:进行图像展示

二、安装kube-prometheus

前面我们学习了Heapster+cAdvisor方式监控,这是Prometheus Operator出现之前的k8s监控方案。后来出现了Prometheus Operator,但是目前Prometheus Operator已经不包含完整功能,完整的解决方案已经变为kube-prometheus。项目地址为:https://github.com/coreos/kube-prometheus

1)安装git

$ yum install -y git

2)下载kube-prometheus

# 下载
$ git clone https://github.com/prometheus-operator/kube-prometheus.git
$ cd kube-prometheus/manifests
# yaml文件比较多,下面进行归档
$ mkdir -p serviceMonitor prometheus adapter node-exporter blackbox kube-state-metrics grafana alertmanager operator other/{nfs-storage,ingress}
$ mv alertmanager-* alertmanager/ && mv blackbox-exporter-* blackbox/ &&  mv grafana-* grafana/ && mv kube-state-metrics-* kube-state-metrics/ && mv node-exporter-*  node-exporter/ && mv prometheus-adapter-* adapter/ && mv prometheus-* prometheus/ && mv kubernetes-serviceMonitor* serviceMonitor/
$ 

2)修改镜像源

国外镜像源某些镜像无法拉取,我们这里修改prometheus-operator,prometheus,alertmanager,kube-state-metrics,node-exporter,prometheus-adapter的镜像源为国内镜像源。我这里使用的是中科大的镜像源。

# 查找
$ grep -rn 'quay.io' *
# 批量替换
$ sed -i 's/quay.io/quay.mirrors.ustc.edu.cn/g' `grep "quay.io" -rl *`
# 再查找
$ grep -rn 'quay.io' *
$ grep -rn 'image: ' *

3)修改类型为NodePort

为了可以从外部访问prometheus,alertmanager,grafana,我们这里修改promethes,alertmanager,grafana的service类型为NodePort类型。

1、修改prometheus的service

# 设置对外访问端口:30080
$ cat prometheus-service.yaml

2、修改grafana的service

# 设置对外访问端口:30081
$ cat grafana-service.yaml

3、修改alertmanager的service

# 设置对外访问端口:30082
$ cat alertmanager-service.yaml

4、安装CRD和prometheus-operator

【温馨提示】CustomResourceDefinition:自定义资源

$ kubectl apply -f setup/

下载prometheus-operator镜像需要花费几分钟,这里等待几分钟,直到prometheus-operator变成running状态

$ kubectl get pod -n monitoring

5、安装prometheus, alertmanager, grafana, kube-state-metrics, node-exporter等资源

$ kubectl apply -f .

稍等一段时间再查看,查看命名空间monitoring下面的pod状态,直到monitoring命名空间下所有pod都变为running状态,就大功告成了。

$ kubectl get pod -n monitoring

如果上面下载镜像失败,可以使用以下地址下载,当然也可以去hub.docker.com下载。

链接:https://pan.baidu.com/s/1JUx_m-JAJ8gUeJE-Gmhzig
提取码:8888

6、工作流程

Prometheus Server定期从配置好的Exporters/Jobs中拉metrics,或者来着pushgateway发过来的metrics,或者其它的metrics,收集完后运行定义好的alert.rules,记录时间序列或者向Alertmanager推送警报。

7、组件说明

  • node_exporter:用来监控运算节点上的宿主机的资源信息,需要部署到所有运算节点
  • kube-state-metric:prometheus采集k8s资源数据的exporter,能够采集绝大多数k8s内置资源的相关数据,例如pod、deploy、service等等。同时它也提供自己的数据,主要是资源采集个数和采集发生的异常次数统计
  • blackbox_exporter:监控业务容器存活性
  • prometheus-adapter:由于本身prometheus属于第三方的 解决方案,原生的k8s系统并不能对Prometheus的自定义指标进行解析,就需要借助于k8s-prometheus-adapter将这些指标数据查询接口转换为标准的Kubernetes自定义指标。

8、验证

$ kubectl get svc -n monitoring

浏览器访问
prometheus:http://192.168.0.113:30080/

grafana:http://192.168.0.113:30081/login
默认账号/密码:admin/admin

alertmanager:http://192.168.0.113:30082/

9、Grafana添加数据源

1、修改prometheus地址


10、导入DashBoards

dashboards地址:https://grafana.com/grafana/dashboards/
1)从官网下载模板,导入模板

2)kubernetes模板导入(k8s模板




三、使用Helm3安装kube-prometheus-stack

# 添加repo
$ helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
$ helm repo update
$ helm search repo prometheus-community/prometheus

1)下载kube-prometheus-stack包

# 拉包
$ helm pull prometheus-community/kube-prometheus-stack
# 解包
$ tar -xf kube-prometheus-stack-19.2.3.tgz

查看所需要的镜像,最好提前下载镜像,要不然很大可能会因为下载镜像失败而安装失败。

$ grep -A3 'image:' kube-prometheus-stack/values.yaml

这里提供镜像下载地址,当前也可以去hub.docker.com网站上下载,或者其它地方下载,如果下载不到对应的版本号,可以下载最新的,然后tag一个就行了。

链接:https://pan.baidu.com/s/1NDHckhvVgDngq98BXlHLFw
提取码:8888

2)导入镜像(所有节点都执行)

$ docker image load -i k8s.gcr.io-ingress-nginx-kube-webhook-certgen-v1.0.tar
$ docker image load -i quay.io-prometheus-alertmanager-v0.22.2.tar
$ docker image load -i quay.io-prometheus-operator-prometheus-operator-v0.50.0.tar
$ docker image load -i quay.io-prometheus-prometheus-v2.28.1.tar

3)安装kube-prometheus-stack

# 创建命名空间
$ kubectl create ns kube-prometheus-stack
$ helm install mykube-prometheus-stack kube-prometheus-stack \
  -n kube-prometheus-stack \
  --set prometheus-node-exporter.hostRootFsMount=false \
  --set prometheus.ingress.enabled=true \
  --set prometheus.ingress.hosts='{prometheus.k8s.local}' \
  --set prometheus.ingress.paths='{/}' \
  --set prometheus.ingress.pathType=Prefix \
  --set alertmanager.ingress.enabled=true \
  --set alertmanager.ingress.hosts='{alertmanager.k8s.local}' \
  --set alertmanager.ingress.paths='{/}' \
  --set alertmanager.ingress.pathType=Prefix \
  --set grafana.ingress.enabled=true \
  --set grafana.ingress.hosts='{grafana.k8s.local}' \
  --set grafana.ingress.paths='{/}' \
  --set grafana.ingress.pathType=Prefix

这里我没跑起来,机器跑的东西太多,已经不能支撑跑kube-prometheus-stack了,有兴趣的小伙伴可以试试~

发现K8s v1.21+,PSP已经被废弃,不建议使用,完全移除在v1.25版本。再不学习它就学不到了。PSP官方讲解

4)清理

$ helm uninstall mykube-prometheus-stack -n kube-prometheus-stack

更多实战监控知识,请耐心等待~

有关Kubernetes(k8s)部署Promehteus(kube-prometheus&kube-prometheus-stack)监控的更多相关文章

  1. ruby-on-rails - rails : "missing partial" when calling 'render' in RSpec test - 2

    我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou

  2. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  3. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  4. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  5. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  6. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  7. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  8. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  9. ruby - 主要 :Object when running build from sublime 的未定义方法 `require_relative' - 2

    我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby​​1.9+ 关于ruby-主要:Objectwhenrun

  10. ruby - 无法让 RSpec 工作—— 'require' : cannot load such file - 2

    我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳

随机推荐