草庐IT

在 Kubernetes 中实现微服务应用监控

kubesphere 2023-03-28 原文

张坚,科大讯飞开发工程师,云原生爱好者。

本篇文章我们基于 Prometheus 和 Grafana 实现微服务应用监控。

KubeSphere 平台本身提供了监控功能,包括节点状态、集群资源使用率、Etcd、API Server 等监控,不过缺少了应用级别的监控。

引入依赖包

在应用中引入监控所需要的 jar 包,包含 Prometheus 和 Actuator

<dependency>  
    <groupId>org.springframework.boot</groupId>  
    <artifactId>spring-boot-starter-actuator</artifactId>  
</dependency>  

<dependency>
    <groupId>io.micrometer</groupId>  
    <artifactId>micrometer-registry-prometheus</artifactId>  
</dependency>

引入这 2 个包以后就通过 Prometheus 抓取到应用的监控信息。

修改应用配置,暴露监控端口

management:
  endpoints:  
    web:  
      exposure:  
        include: "*"  
      base-path: /
  metrics:  
    tags:  
      application: ${spring.application.name}
  • management.server.port:启用独立的端口来提供监控,未配置的情况下共用应用端口;
  • management.metrics.tags.xxx:在统计信息中添加自定义的标签;
  • management.endpoints.web.exposure.include:用于包含我们要公开的端点列表 , 我们这里设置为* 代表所有。
  • management.endpoints.web.base-path:用于设置 Promethues 的监控路径,默认是通过 /actuator/prometheus 访问,这样配置以后只需要通过 /prometheus 访问

配置完成后重启服务,通过浏览器访问 localhost:8080/prometheus 即可抓取到 Prometheus 的监控数据,效果如下:

修改 Service 配置

kind: Service
apiVersion: v1
metadata:
  name: spring-cloud-provider-service
  namespace: cloud-demo
  labels:
    app: spring-cloud-provider-service
    micrometer-prometheus-discovery: 'true'
spec:
  ports:
    - name: metrics
      protocol: TCP
      port: 8080
      targetPort: 8080
  selector:
    app: spring-cloud-provider

修改后端服务端的 Service

  • 添加了 micrometer-prometheus-discovery: 'true' 这个标签,方便后面 ServiceMonitor 自动抓取
  • 修改 Service 端口映射的名称未 metrics

创建 ServiceMonitor

安装 KubeSphere 平台时已经安装好了 promethus-operator, ServiceMonitor 是 prometheus-operator 后创建的一种自定义资源,Prometheus 可以通过 ServiceMonitor 自动识别带有某些 label 的 service ,并从这些 Service 获取数据。

现在需要让 Promethus 可以抓取到我们暴露的应用监控,所以需要创建一个如下的 ServiceMonitor。

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: micrometer-demo
  namespace: cloud-demo
spec:
  endpoints:
    - interval: 30s
      path: /prometheus
      port: metrics
  namespaceSelector:
  	matchNames:
  	- cloud-demo
    # any: true
  selector:
    matchLabels:
      micrometer-prometheus-discovery: 'true'

这段 YAML 文件的意思是抓取 namespace 为 cloud-demo,并设置了 micrometer-prometheus-discovery: 'true' 的 labels 的所有 Service,抓取的端口为 metrics,抓取路径为 /prometheus

详细说明一下各字段的意义:

  • metadata 下的 namenamespace 将指定 Service Monitor 所需的一些关键元信息。

  • specendpoints 为服务端点,代表 Prometheus 所需的采集 Metrics 的地址。endpoints 为一个数组,同时可以创建多个 endpoints。每个 endpoints 包含三个字段,每个字段的含义如下:

    • interval:指定 Prometheus 对当前 endpoints 采集的周期。单位为秒,在本次示例中设定为 30s
    • path:指定 Prometheus 的采集路径。设置为 /prometheus,这个跟应用中暴露的监听端口保持一致。
    • port:指定采集数据需要通过的端口,设置为 /metrics 设置的端口为 步骤三 创建 Service 时端口所设置的 name
  • specnamespaceSelector 为需要发现的 Service 的范围。namespaceSelector 包含两个互斥字段,字段的含义如下:

    • any:有且仅有一个值 true,当该字段被设置时,将监听所有符合 Selector 过滤条件的 Service 的变动。
    • matchNames:数组值,指定需要监听的 namespace 的范围。例如,只想监听 defaultcloud-demo 两个命名空间中的 Service,那么 matchNames 设置如下:
    namespaceSelector:
      matchNames:
      - default
      - cloud-demo
    
  • specselector 用于选择 Service。
    在本次示例所使用的 Service 有 micrometer-prometheus-discovery: 'true' Label,所以 selector 设置如下:

    selector:
      matchLabels:
        micrometer-prometheus-discovery: 'true'
    

可以通过 kubectl apply -f micrometer-demo.yml 将其部署到集群中。

执行成功后可以在集群的 CRD 下面搜索 ServiceMonitor 并打开可以找到我们部署的 ServiceMonitor 配置。如图所示:

创建自定义监控

访问 集群-> 监控告警-> 自定义监控进入,如图所示:

我们点击创建 可以看到 KubeSphere 已经集成了部分监控面板,这里我们选择 Grafana。

在下一步后系统会让我们上传 JSON 模版,我们可以通过 Grafana 官网下载一些通用的模版配置,这里我们使用的是 [Spring Boot 2.1 Statistics](Spring Boot 2.1 Statistics | Grafana Labs)。在右侧可以下载 JSON 文件。

导入 JSON 后我们就可以看到相关监控指标了。

使用这种方式有个最大问题就是多个应用无法切换,像我们之前部署了 3 个应用在一张图中显示就很乱,所以需要通过外部 Grafana 展示监控数据。

使用外部 Grafana 集成

为了方便,我们直接使用 KubeSphere 提供的应用商店功能安装外部 Grafana。

  1. 添加应用仓库

进入企业空间 -> 应用管理 -> 应用仓库,点击添加,加入 bitnami 应用仓库。

  1. 安装 Grafana
  • 我们依次打开企业空间-项目-点击要安装到的具体项目-点击应用-点击右侧的创建按钮;

  • 弹出对话框中点击从应用模版,从应用仓库列表中选择我们刚刚添加的 bitnami 的仓库,搜索 Grafana 点击后安装即可。

安装完成后我们在服务里给 grafana 的服务开启 NodePort 外部访问,比如我这里的的访问地址为:http://172.30.10.73:28328/

  1. 设置 Grafana 数据源
  • 我们使用管理员账号 admin 登录进 Grafana,默认密码可以在项目的保密字典中的 cloud-grafana-admin 中找到;

  • 登录后我们点击左侧的小齿轮-datasource 在打开页面中选择 Add data source 然后选择 Prometheus 在 URL 中填入我们上面说到的 Prometheus 的 URL 地址。如图所示:

Prometheus 可以通过如下方式找到 kubectl get svc -n kubesphere-monitoring-system

  • 填写后拖到最下面,点击 save&test。
  1. 导入 Dashbord

之后我们就可以看到配置的应用监控了。

多个应用之间可以通过左上角进行切换,符合预期。

附录

本文由博客一文多发平台 OpenWrite 发布!

有关在 Kubernetes 中实现微服务应用监控的更多相关文章

  1. ruby - 在 Ruby 中实现 `call_user_func_array` - 2

    我怎样才能完成http://php.net/manual/en/function.call-user-func-array.php在ruby中?所以我可以这样做:classAppdeffoo(a,b)putsa+benddefbarargs=[1,2]App.send(:foo,args)#doesn'tworkApp.send(:foo,args[0],args[1])#doeswork,butdoesnotscaleendend 最佳答案 尝试分解数组App.send(:foo,*args)

  2. ruby - 将差异补丁应用于字符串/文件 - 2

    对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

  3. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  4. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  5. ruby-on-rails - Rails 应用程序中的 Rails : How are you using application_controller. rb 是新手吗? - 2

    刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr

  6. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

  7. ruby-on-rails - 如何在 Ruby on Rails 中实现无向图? - 2

    我需要在RubyonRails中实现无向图G=(V,E)并考虑构建一个Vertex和一个Edge模型,其中Vertex有_多条边。由于边恰好连接两个顶点,您将如何在Rails中执行此操作?您是否知道任何有助于实现此类图表的gem或库(对重新发明轮子不感兴趣;-))? 最佳答案 不知道有任何现有库在ActiveRecord之上提供图形逻辑。您可能必须实现自己的Vertex、EdgeActiveRecord支持的模型(请参阅Rails安装的rails/activerecord中的vertex.rb和edge.rb/test/fixtur

  8. ruby-on-rails - 如何在 Ruby on Rails 中实现由 JSF 2.0 (Primefaces) 驱动的 UI 魔法 - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。问题1)我想知道ruby​​onrails是否有功能类似于primefaces的gem。我问的原因是如果您使用primefaces(http://www.primefaces.org/showcase-labs/ui/home.jsf),开发人员无需担心javascript或jquery的东西。据我所知,JSF是一个规范,基于规范的各种可用实现,prim

  9. ruby-on-rails - 如何在 Gem 中获取 Rails 应用程序的根目录 - 2

    是否可以在应用程序中包含的gem代码中知道应用程序的Rails文件系统根目录?这是gem来源的示例:moduleMyGemdefself.included(base)putsRails.root#returnnilendendActionController::Base.send:include,MyGem谢谢,抱歉我的英语不好 最佳答案 我发现解决类似问题的解决方案是使用railtie初始化程序包含我的模块。所以,在你的/lib/mygem/railtie.rbmoduleMyGemclassRailtie使用此代码,您的模块将在

  10. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

随机推荐