解决 Prometheus 不能获取 Kubernetes 集群上 Windows 节点的 Metrics
背景
接上一篇 快速搭建 Windows Kubernetes , 我们发现原来在 Windows Kubernetes 会有一些与在 Linux 上使用不一样的体验,俗称坑,例如 hostAliases。对于我们希望真的把 Windows 放入生产,感觉除了基本的 Pod、Volume、Service 、Log 以外,我们还需要监控。一般来讲我们会用 Prometheus 来做监控,然后通过 Grafana 来展示,但是 Prometheus 的 Node Exporter 是为 *nix 设计的,所以在 Windows 上我们的自己想办法了。在 Prometheus Node Exporter 里推荐使用 WMI exporter ,感兴趣的童鞋可以去试试,本文主要还是想从一个原始的角度去分析处理,来理解怎么去写一个 Prometheus 的采集程序。
前提
- 一套 Windows Kuberentes
- 一个 Prometheus 环境
步骤
- 首先得找到 Kubelet 在 Windows 上暴露出来得数据格式, 因为 cadivsor 并不支持 Windows, 社区有位同志写了一个相对简单的实现来支持; 他这个的实现还是保持 Linux 上的一样,是从
<Node_IP>:10255/stats/summary
上 expose metrics, metrics-server 与kubectl top
的数据也是来源于此,大致如下:
{
"node": {
"nodeName": "35598k8s9001",
"startTime": "2018-08-26T07:25:08Z",
"cpu": {
"time": "2018-09-10T01:44:52Z",
"usageCoreNanoSeconds": 8532520000000
},
"memory": {
"time": "2018-09-10T01:44:52Z",
"availableBytes": 14297423872,
"usageBytes": 1978798080,
"workingSetBytes": 734490624,
"rssBytes": 0,
"pageFaults": 0,
"majorPageFaults": 0
},
"fs": {
"time": "2018-09-10T01:44:52Z",
"availableBytes": 15829303296,
"capacityBytes": 32212250624,
"usedBytes": 16382947328
},
"runtime": {
"imageFs": {
"time": "2018-09-10T01:44:53Z",
"availableBytes": 15829303296,
"capacityBytes": 32212250624,
"usedBytes": 16382947328,
"inodesUsed": 0
}
}
},
"pods": [
{
"podRef": {
"name": "stdlogserverwin-5fbcc5648d-ztqsq",
"namespace": "default",
"uid": "f461a0b4-ab36-11e8-93c4-0017fa0362de"
},
"startTime": "2018-08-29T02:55:15Z",
"containers": [
{
"name": "stdlogserverwin",
"startTime": "2018-08-29T02:56:24Z",
"cpu": {
"time": "2018-09-10T01:44:54Z",
"usageCoreNanoSeconds": 749578125000
},
"memory": {
"time": "2018-09-10T01:44:54Z",
"workingSetBytes": 83255296
},
"rootfs": {
"time": "2018-09-10T01:44:54Z",
"availableBytes": 15829303296,
"capacityBytes": 32212250624,
"usedBytes": 0
},
"logs": {
"time": "2018-09-10T01:44:53Z",
"availableBytes": 15829303296,
"capacityBytes": 32212250624,
"usedBytes": 16382947328,
"inodesUsed": 0
},
"userDefinedMetrics": null
}
],
"cpu": {
"time": "2018-08-29T02:56:24Z",
"usageNanoCores": 0,
"usageCoreNanoSeconds": 749578125000
},
"memory": {
"time": "2018-09-10T01:44:54Z",
"availableBytes": 0,
"usageBytes": 0,
"workingSetBytes": 83255296,
"rssBytes": 0,
"pageFaults": 0,
"majorPageFaults": 0
},
"volume": [
{
"time": "2018-08-29T02:55:16Z",
"availableBytes": 17378648064,
"capacityBytes": 32212250624,
"usedBytes": 14833602560,
"inodesFree": 0,
"inodes": 0,
"inodesUsed": 0,
"name": "default-token-wv5fc"
}
],
"ephemeral-storage": {
"time": "2018-09-10T01:44:54Z",
"availableBytes": 15829303296,
"capacityBytes": 32212250624,
"usedBytes": 16382947328
}
}
]
}
- 从上面可以看到,它包含了本机和 pod 的一些 metrics, 相对 cadvisor 能提供的少了一些,但是基本监控是没问题的。接下来我们需要写一个小程序把数据转换成 Prometheus 能解析的数据。接下来用 python 写个小栗子, 先声明下我们要 expose 的 stats 对象
class Node:
def __init__(self, name, cpu, memory):
self.name = name
self.cpu = cpu
self.memory = memory
class Pod:
def __init__(self, name, namespace,cpu, memory):
self.name = name
self.namespace = namespace
self.cpu = cpu
self.memory = memory
class Stats:
def __init__(self, node, pods):
self.node = node
self.pods = pods
- 使用 Prometheus 的 python-client 来写一个 polling 的程序,去转换 kubelet stats 数据。
from urllib.request import urlopen
from stats import Node
from stats import Pod
from stats import Stats
import json
import asyncio
import prometheus_client as prom
import logging
import random
def getMetrics(url):
#获取数据集
response = urlopen(url)
string = response.read().decode('utf-8')
json_obj = json.loads(string)
#用之前定义好的 stats 的对象来做 mapping
node = Node('','','')
node.name = json_obj['node']['nodeName']
node.cpu = json_obj['node']['cpu']['usageCoreNanoSeconds']
node.memory = json_obj['node']['memory']['usageBytes']
pods_array = json_obj['pods']
pods_list = []
for item in pods_array:
pod = Pod('','','','')
pod.name = item['podRef']['name']
pod.namespace = item['podRef']['namespace']
pod.cpu = item['cpu']['usageCoreNanoSeconds']
pod.memory = item['memory']['workingSetBytes']
pods_list.append(pod)
stats = Stats('','')
stats.node = node
stats.pods = pods_list
return stats
#写个简单的日志输出格式
format = "%(asctime)s - %(levelname)s [%(name)s] %(threadName)s %(message)s"
logging.basicConfig(level=logging.INFO, format=format)
#声明我们需要导出的 metrics 及对应的 label 供未来查询使用
g1 = prom.Gauge('node_cpu_usageCoreNanoSeconds', 'CPU useage of the node', labelnames=['node_name'])
g2 = prom.Gauge('node_mem_usageBytes', 'Memory useage of the node', labelnames=['node_name'])
g3 = prom.Gauge('pod_cpu_usageCoreNanoSeconds', 'Memory useage of the node', labelnames=['pod_name','pod_namespace'])
g4 = prom.Gauge('pod_mem_usageBytes', 'Memory useage of the node', labelnames=['pod_name','pod_namespace'])
async def expose_stats(url):
while True:
stats = getMetrics(url)
#以打印 node 本身的监控信息为例
logging.info("nodename: {} value {}".format(stats.node.name, stats.node.cpu))
# 为当前要 poll 的 metrics 赋值
g1.labels(node_name=stats.node.name).set(stats.node.cpu)
g2.labels(node_name=stats.node.name).set(stats.node.memory)
pods_array = stats.pods
for item in pods_array:
g3.labels(pod_name=item.name,pod_namespace=item.namespace).set(item.memory)
g4.labels(pod_name=item.name,pod_namespace=item.namespace).set(item.cpu)
await asyncio.sleep(1)
if __name__ == '__main__':
loop = asyncio.get_event_loop()
# 启动一个 http server 来做 polling
prom.start_http_server(8000)
t0_value = 50
#可以在每一台 Windows 机器上都启动一个这样的程序,也可以远程部署脚本来做 exposing
url = 'http://localhost:10255/stats/summary'
tasks = [loop.create_task(expose_stats(url))]
try:
loop.run_forever()
except KeyboardInterrupt:
pass
finally:
loop.close()
- 写完以后就可以启动这个程序了,访问他的 8000 端口就能看到相关的数据
![](https://www.cnblogs.com/images/cnblogs_com/bigdaddyblog/1310139/o_WeChat Image_20180928165327.png)
- 接下来需要在 prometheus 里加入配置,增加一个收集对象,如下例:
- job_name: python_app
scrape_interval: 15s
scrape_timeout: 10s
metrics_path: /
scheme: http
static_configs:
- targets:
- localhost:8000
- 这样在 Prometheus 的页面上能查询到相关的信息了
![](https://www.cnblogs.com/images/cnblogs_com/bigdaddyblog/1310139/o_WeChat Image_20180928165226.png)
提问
解决 Prometheus 不能获取 Kubernetes 集群上 Windows 节点的 Metrics的更多相关文章
- Prometheus 监控外部 Kubernetes 集群
转载自:https://www.qikqiak.com/post/monitor-external-k8s-on-prometheus/ 在实际环境中很多企业是将 Prometheus 单独部署在集群 ...
- 解决项目迁移至Kubernetes集群中的代理问题
解决项目迁移至Kubernetes集群中的代理问题 随着Kubernetes技术的日益成熟,越来越多的企业选择用Kubernetes集群来管理项目.新项目还好,可以选择合适的集群规模从零开始构建项目: ...
- kubernetes 集群添加node节点
kubernetes 集群添加node节点 注意,我们并不需要把新增的node ip加入到证书里重新生成!!! 下面我们以添加node03为例 一.添加集群里个节点的hostname并设置好对应主机名 ...
- Rancher2.x 一键式部署 Prometheus + Grafana 监控 Kubernetes 集群
目录 1.Prometheus & Grafana 介绍 2.环境.软件准备 3.Rancher 2.x 应用商店 4.一键式部署 Prometheus 5.验证 Prometheus + G ...
- 基于TLS证书手动部署kubernetes集群(上)
一.简介 Kubernetes是Google在2014年6月开源的一个容器集群管理系统,使用Go语言开发,Kubernetes也叫K8S. K8S是Google内部一个叫Borg的容器集群管理系统衍生 ...
- (转)基于TLS证书手动部署kubernetes集群(上)
转:https://www.cnblogs.com/wdliu/archive/2018/06/06/9147346.html 一.简介 Kubernetes是Google在2014年6月开源的一个容 ...
- 在kubernetes集群上用helm安装Datadog(Monitoring)
Datadog is a monitoring service that gathers monitoring data from your containers within your Azure ...
- prometheus operator(Kubernetes 集群监控)
一.Prometheus Operator 介绍 Prometheus Operator 是 CoreOS 开发的基于 Prometheus 的 Kubernetes 监控方案,也可能是目前功能最全面 ...
- Kubernetes集群向指定节点上创建容器
如果需要限制Pod到指定的Node上运行,则可以给Node打标签并给Pod配置NodeSelector. 给节点添加标签 首先查看节点信息 [root@k8s-master ~]# kubectl g ...
随机推荐
- PostgreSQL模式匹配的方法 LIKE等
PostgreSQL 提供了三种实现模式匹配的方法:传统 SQL 的 LIKE 操作符.SQL99 新增的 SIMILAR TO 操作符. POSIX 风格的正则表达式.另外还有一个模式匹配函数 su ...
- WPF listview item mouse enter/over popup
This is because the routing strategy of the Loaded event is Direct, which means that the routed even ...
- windows程序中拷贝文件的选择
最近需要在Windows下拷贝大量小文件(数量在十万级别以上).写了些拷贝文件的小程序,竟然发现不同的选择,拷贝的速度有天壤之别! 现有这样的测试数据:1500+小文件,总大小10M左右.现用不同方法 ...
- Apache Cordova开发环境搭建(一)-Visual Studio
原文:Apache Cordova开发环境搭建(一)-Visual Studio 一.使用Visual Studio开发Apache Cordova手机App 1.版本要求,Visual Studio ...
- Python Pandas 分析郁达夫《故都的秋》
最近刚学这块,如果有错误的地方还请大家担待. 本文用到的Python包: Ipython, Numpy, Pandas, Matplotlib 故都的秋原文参考:http://www.xiexingc ...
- php 如何利用 soap调用.Net的WebService asmx文件
原文:php 如何利用 soap调用.Net的WebService asmx文件 最近,帮一个同行测试用.net写的WebService接口,C#调用通过,现在需要测试一下php版本对它的调用,经过各 ...
- C++/CLI 中使用 ref 和 out
void fun(int^ % i){} // C# ref void fun([out]int^ % i) {} // C# out
- 关于Android应用内存泄露问题
在Java中内存泄漏是指某个(某些)对象已经不再被使用,应该被GC所回收的空间,但有一个对象持有这个对象的引用从而阻止这个对象被回收.比如我们通常会这样创建一个View, TextView tv = ...
- 解决Delphi的Indy10组件包TIdHttpServer控件解码HTTP请求时参数乱码的问题
Delphi6下使用Indy10组件包,其中的TIdHttpServer控件在处理HTTP请求的时候 不能正确解码含有汉字的参数,如: http://127.0.0.1/test?cmd=open&a ...
- Markdown的选择
直击现场 我一直在思索用什么格式存储文档比较好.之前一直在用google docs,但是它的格式不公开,上传/下载的时候需要转换格式,转换的时候必然会丢失一些信息.于是后来想,那还是纯本文或者mark ...
转载自:https://www.qikqiak.com/post/monitor-external-k8s-on-prometheus/ 在实际环境中很多企业是将 Prometheus 单独部署在集群 ...
解决项目迁移至Kubernetes集群中的代理问题 随着Kubernetes技术的日益成熟,越来越多的企业选择用Kubernetes集群来管理项目.新项目还好,可以选择合适的集群规模从零开始构建项目: ...
kubernetes 集群添加node节点 注意,我们并不需要把新增的node ip加入到证书里重新生成!!! 下面我们以添加node03为例 一.添加集群里个节点的hostname并设置好对应主机名 ...
目录 1.Prometheus & Grafana 介绍 2.环境.软件准备 3.Rancher 2.x 应用商店 4.一键式部署 Prometheus 5.验证 Prometheus + G ...
一.简介 Kubernetes是Google在2014年6月开源的一个容器集群管理系统,使用Go语言开发,Kubernetes也叫K8S. K8S是Google内部一个叫Borg的容器集群管理系统衍生 ...
转:https://www.cnblogs.com/wdliu/archive/2018/06/06/9147346.html 一.简介 Kubernetes是Google在2014年6月开源的一个容 ...
Datadog is a monitoring service that gathers monitoring data from your containers within your Azure ...
一.Prometheus Operator 介绍 Prometheus Operator 是 CoreOS 开发的基于 Prometheus 的 Kubernetes 监控方案,也可能是目前功能最全面 ...
如果需要限制Pod到指定的Node上运行,则可以给Node打标签并给Pod配置NodeSelector. 给节点添加标签 首先查看节点信息 [root@k8s-master ~]# kubectl g ...
PostgreSQL 提供了三种实现模式匹配的方法:传统 SQL 的 LIKE 操作符.SQL99 新增的 SIMILAR TO 操作符. POSIX 风格的正则表达式.另外还有一个模式匹配函数 su ...
This is because the routing strategy of the Loaded event is Direct, which means that the routed even ...
最近需要在Windows下拷贝大量小文件(数量在十万级别以上).写了些拷贝文件的小程序,竟然发现不同的选择,拷贝的速度有天壤之别! 现有这样的测试数据:1500+小文件,总大小10M左右.现用不同方法 ...
原文:Apache Cordova开发环境搭建(一)-Visual Studio 一.使用Visual Studio开发Apache Cordova手机App 1.版本要求,Visual Studio ...
最近刚学这块,如果有错误的地方还请大家担待. 本文用到的Python包: Ipython, Numpy, Pandas, Matplotlib 故都的秋原文参考:http://www.xiexingc ...
原文:php 如何利用 soap调用.Net的WebService asmx文件 最近,帮一个同行测试用.net写的WebService接口,C#调用通过,现在需要测试一下php版本对它的调用,经过各 ...
void fun(int^ % i){} // C# ref void fun([out]int^ % i) {} // C# out
在Java中内存泄漏是指某个(某些)对象已经不再被使用,应该被GC所回收的空间,但有一个对象持有这个对象的引用从而阻止这个对象被回收.比如我们通常会这样创建一个View, TextView tv = ...
Delphi6下使用Indy10组件包,其中的TIdHttpServer控件在处理HTTP请求的时候 不能正确解码含有汉字的参数,如: http://127.0.0.1/test?cmd=open&a ...
直击现场 我一直在思索用什么格式存储文档比较好.之前一直在用google docs,但是它的格式不公开,上传/下载的时候需要转换格式,转换的时候必然会丢失一些信息.于是后来想,那还是纯本文或者mark ...