dotnet-monitor可以在Kubernetes中作为Sidecar运行,Sidecar是一个容器,它与应用程序在同一个Pod中运行,利用Sidecar模式使我们可以诊断及监控应用程序。

如下图所示,这是我们最终要实现的目标,通过可视化界面查看应用程序的指标信息。

应用服务

创建dotnetmonitor.yaml文件,如下所示。

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: dotnet-monitor-example
  5. spec:
  6. replicas: 3
  7. selector:
  8. matchLabels:
  9. app: dotnet-monitor-example
  10. template:
  11. metadata:
  12. annotations:
  13. prometheus.io/scrape: 'true'
  14. prometheus.io/port: "52325"
  15. labels:
  16. app: dotnet-monitor-example
  17. spec:
  18. containers:
  19. - name: server
  20. image: mcr.microsoft.com/dotnet/core/samples:aspnetapp
  21. ports:
  22. - containerPort: 80
  23. volumeMounts:
  24. - mountPath: /tmp
  25. name: tmp
  26. - name: sidecar
  27. image: mcr.microsoft.com/dotnet/monitor
  28. ports:
  29. - containerPort: 52323
  30. resources:
  31. requests:
  32. cpu: 50m
  33. memory: 32Mi
  34. limits:
  35. cpu: 250m
  36. memory: 256Mi
  37. args: ["--no-auth"]
  38. env:
  39. - name: DOTNETMONITOR_Urls
  40. value: "http://+:52323"
  41. volumeMounts:
  42. - name: tmp
  43. mountPath: /tmp
  44. volumes:
  45. - name: tmp
  46. emptyDir: {}

Sidecar和应用程序共享tmp目录,同时将目录映射到emptyDir类型的 Volume中。接下来,创建dotnetmonitor-service.yaml,为应用程序和Sidecar开放端口。

  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4. name: dotnetmonitor
  5. labels:
  6. app: dotnetmonitor
  7. spec:
  8. type: NodePort
  9. ports:
  10. - name: sidecar
  11. protocol: TCP
  12. port: 52323
  13. nodePort: 31623
  14. - name: app
  15. protocol: TCP
  16. port: 80
  17. nodePort: 31624
  18. selector:
  19. app: dotnet-monitor-example

Prometheus配置

创建prometheus-config.yaml文件,通过ConfigMaps管理Prometheus的配置文件,并写入如下内容。

  1. apiVersion: v1
  2. kind: ConfigMap
  3. metadata:
  4. name: prometheus-config
  5. data:
  6. prometheus.yaml: |
  7. global:
  8. scrape_interval: 2s
  9. evaluation_interval: 2s
  10. scrape_configs:
  11. - job_name: 'prometheus'
  12. static_configs:
  13. - targets: ['localhost:9090']
  14. - job_name: default/dotnet-monitor-example/0
  15. honor_timestamps: true
  16. scrape_interval: 10s
  17. scrape_timeout: 10s
  18. metrics_path: /metrics
  19. scheme: http
  20. follow_redirects: true
  21. relabel_configs:
  22. # 使用 Label "__meta_kubernetes_pod_container_name" 的值
  23. - source_labels: [__meta_kubernetes_pod_container_name]
  24. separator: ;
  25. # 正则表达式,用于匹配源标签值使用的
  26. regex: sidecar
  27. # replacement指定的替换后的标签(target_label)对应的数值
  28. replacement: $1
  29. # keep就是保留符合正则表达式targets,并显示出来
  30. action: keep
  31. - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
  32. action: keep
  33. regex: true
  34. - source_labels: [__meta_kubernetes_pod_name]
  35. action: replace
  36. target_label: pod
  37. kubernetes_sd_configs:
  38. - role: endpoints
  39. follow_redirects: true
  40. namespaces:
  41. names:
  42. - default

在Prometheus中如果采用静态服务发现(static_configs)模式注册,那么HPA(HorizontalPodAutoscaler,Pod水平自动伸缩)的变动会导致服务很难快速的注册,如果频繁更改配置文件,那么也是得不偿失的,所以,在此处选择kubernetes服务发现(kubernetes_sd_configs)模式,除此之外Prometheus还支持其他方式的服务发现。

  • static_configs: 静态服务发现
  • dns_sd_configs: DNS 服务发现
  • file_sd_configs: 文件服务发现
  • kubernetes_sd_configs: Kubernetes 服务发现
  • gce_sd_configs: GCE 服务发现
  • ec2_sd_configs: EC2 服务发现
  • openstack_sd_configs: OpenStack 服务发现
  • azure_sd_configs: Azure 服务发现

现在,意味着我们会在Kubernetes中的会保留__meta_kubernetes_pod_container_name值为sidecar的,同时也需要满足__meta_kubernetes_pod_annotation_prometheus_io_scrape属性为true的Pod。

接下来,创建prometheus-rbac-setup.yaml文件,为了使Prometheus可以访问到Kubernetes API,我们需要对Prometheus进行访问授权,在Kubernetes中通过基于角色的访问控制模型(Role-Based Access Control),用于访问Kubernetes的资源。首先我们定义角色(ClusterRole)并设置相应的访问权限;为Prometheus创建账号(ServiceAccount);最后将账号与角色进行绑定(ClusterRoleBinding)。

  1. apiVersion: rbac.authorization.k8s.io/v1
  2. kind: ClusterRole
  3. metadata:
  4. name: prometheus
  5. rules:
  6. - apiGroups: [""]
  7. resources:
  8. - nodes
  9. - nodes/proxy
  10. - services
  11. - endpoints
  12. - pods
  13. verbs: ["get", "list", "watch"]
  14. - apiGroups:
  15. - extensions
  16. resources:
  17. - ingresses
  18. verbs: ["get", "list", "watch"]
  19. - nonResourceURLs: ["/metrics"]
  20. verbs: ["get"]
  21. ---
  22. apiVersion: v1
  23. kind: ServiceAccount
  24. metadata:
  25. name: prometheus
  26. namespace: default
  27. ---
  28. apiVersion: rbac.authorization.k8s.io/v1
  29. kind: ClusterRoleBinding
  30. metadata:
  31. name: prometheus
  32. roleRef:
  33. apiGroup: rbac.authorization.k8s.io
  34. kind: ClusterRole
  35. name: prometheus
  36. subjects:
  37. - kind: ServiceAccount
  38. name: prometheus
  39. namespace: default

创建prometheus-deployment.yaml文件。

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. labels:
  5. name: prometheus
  6. name: prometheus
  7. spec:
  8. replicas: 1
  9. selector:
  10. matchLabels:
  11. app: prometheus
  12. template:
  13. metadata:
  14. labels:
  15. app: prometheus
  16. spec:
  17. serviceAccountName: prometheus
  18. containers:
  19. - name: prometheus
  20. image: prom/prometheus:latest
  21. command:
  22. - "/bin/prometheus"
  23. args:
  24. - "--config.file=/etc/prometheus/prometheus.yml"
  25. ports:
  26. - containerPort: 9090
  27. protocol: TCP
  28. volumeMounts:
  29. - mountPath: "/etc/prometheus"
  30. name: prometheus-config
  31. volumes:
  32. - name: prometheus-config
  33. configMap:
  34. name: prometheus-config

创建prometheus-service.yaml文件。

  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4. name: prometheus
  5. labels:
  6. name: prometheus
  7. spec:
  8. type: NodePort
  9. ports:
  10. - name: prometheus
  11. protocol: TCP
  12. port: 9090
  13. targetPort: 9090
  14. nodePort: 32732
  15. selector:
  16. app: prometheus

如下所示,展示了Prometheus仪表盘

Grafana

Grafana的内容不做展开了,当然你可以直接查看或使用我的dashboard文件。

https://github.com/hueifeng/dotnet-monitor-on-k8s

参考

部署Prometheus

https://dotnetos.org/blog/2021-11-22-dotnet-monitor-grafana/

使用dotnet-monitor分析在Kubernetes的应用程序:Sidecar模式的更多相关文章

  1. 【翻译】.NET 6 中的 dotnet monitor

    原文:Announcing dotnet monitor in .NET 6 我们在 2020 年 6 月首次推出了dotnet monitor 作为实验工具,并在去年(2020年)努力将其转变为生产 ...

  2. 部署Dotnet Core应用到Kubernetes(一)

    最近闲了点,写个大活:部署Dotnet应用到K8s.   写在前边的话 一直想完成这个主题.但这个主题实在太大了,各种拖延症的小宇宙不时爆发一下,结果就拖到了现在.   这个主题,会是一个系列.在这个 ...

  3. 使用dotnet-monitor sidecar模式 dump docker运行的dotnet程序.

    前情概要 随着容器和云技术的发展, 大量的应用运行在云上的容器中, 它们的好处是毋庸置疑的, 例如极大的提高了我们的研发部署速度, 快速的扩缩容等等, 但是也存在一些小小的问题, 例如难以调试. 基于 ...

  4. Kubernetes K8S在IPVS代理模式下Service服务的ClusterIP类型访问失败处理

    Kubernetes K8S使用IPVS代理模式,当Service的类型为ClusterIP时,如何处理访问service却不能访问后端pod的情况. 背景现象 Kubernetes K8S使用IPV ...

  5. ASP.NET Core 中文文档 第二章 指南(8) 使用 dotnet watch 开发 ASP.NET Core 应用程序

    原文:Developing ASP.NET Core applications using dotnet watch 作者:Victor Hurdugaci 翻译:谢炀(Kiler) 校对:刘怡(Al ...

  6. 使用 dotnet watch 开发 ASP.NET Core 应用程序

    使用 dotnet watch 开发 ASP.NET Core 应用程序 原文:Developing ASP.NET Core applications using dotnet watch作者:Vi ...

  7. Docker Kubernetes Service 网络服务代理模式详解

    Docker Kubernetes  Service 网络服务代理模式详解 Service service是实现kubernetes网络通信的一个服务 主要功能:负载均衡.网络规则分布到具体pod 注 ...

  8. Android:日常学习笔记(2)——分析第一个Android应用程序

    Android:日常学习笔记(2)——分析第一个Android应用程序 Android项目结构 整体目录结构分析 说明: 除了APP目录外,其他目录都是自动生成的.APP目录的下的内容才是我们的工作重 ...

  9. 分析现有 WPF / Windows Forms 程序能否顺利迁移到 .NET Core 3.0

    本文转自 https://blog.csdn.net/WPwalter/article/details/82859449 使用 .NET Core 3.0 Desktop API Analyzer 分 ...

随机推荐

  1. Public Round #1

    传送门 [PR #1]删数 题意:写的很清楚了,略 思路: 首先转化为差分数组,两个连续数相同,删掉,乘二放进去. 发现能互相转化的两个数,符号,值\(/lowbit\)都一样. 把能相互转化的数归为 ...

  2. SpringMVC请求流程源码分析

    一.SpringMVC使用 1.工程创建 创建maven工程. 添加java.resources目录. 引入Spring-webmvc 依赖. <dependency> <group ...

  3. [学习笔记] pd_ds黑科技

    https://www.cnblogs.com/jiqimin/p/11226809.html 丢个链接,跑路 // Author: wlzhouzhuan #pragma GCC optimize( ...

  4. 测试人生 | 薪资翻倍涨至50W是种什么样的体验?

    本文为霍格沃兹测试开发学社优秀学员跳槽笔记,测试开发进阶学习文末加群. 本人已经工作7年了,做的都是功能测试以及写一些简单的自动化脚本,加上之前没有学习的意识,导致专业技术水平与工作年限不匹配,在上家 ...

  5. 如何优雅的使用MyBatis?

    ​本文目录 什么是 MyBatis ? 映射器(mappers) typeAliases 类型别名减少类完全限制名的冗余 处理枚举类型 多行插入 重用 SQL 代码段,消除重复 字符串替换#{}和${ ...

  6. 这就是艺术「GitHub 热点速览 v.22.25」

    作者:HelloGitHub-小鱼干 不知道写了那么久代码的你,是否还记得"代码写诗"这个词,它是用来形容代码的优雅.但是本周的项目,虽然你看到的是代码的成品,也会惊讶于它的艺术感 ...

  7. 比我的脸还干的gan货——Python Flask Web 框架入门

    Flask是一个轻量级的基于Python的web框架. 本文适合有一定HTML.Python.网络基础的同学阅读. 1. 简介 这份文档中的代码使用 Python 3 运行.是的,所以读者需要自己在电 ...

  8. MySql中数据表增加字段很慢怎么办

    正确的做法是这样,对于数据量很大的表,需要添加所有或者修改字段的做法是如下: 1.先创建一张一样的表 create table new_tb like tb_old; 2.修改创建表的字段 alter ...

  9. sqlserver 把c#代码的string[] 的ids转换成一个数据table表

    declare @string varchar(200),@sql varchar(1000)set @string = '1,2,3,4,5,6'set @sql = 'select code='' ...

  10. vmstate 命令详解2022

    vmstat 是一个查看虚拟内存(Virtual Memory)使用状况的工具,但是怎样通过 vmstat 来发现系统中的瓶颈呢? 1. 使用vmstat 使用前我们先看下命令介绍及参数定义 Usag ...