在边缘设备上部署Prometheus,实现远程监控K3s集群!
作者简介
Seed Studio的Wio Terminal是一款功能强大的设备,它拥有一个兼容Arduino的微型控制器和一个2.4英寸的LCD。它还拥有一个内置的WiFi和BLE无线电,可以实现无线连接。
Wio Terminal这些特性启发了我,为什么不构建一个迷你的Prometheus仪表盘呢?可以显示运行在边缘的Kubernetes集群的重要统计数据。经过一番努力,我将这个想法变成了一个简单原型。
虽然本教程适用于任何Kubernetes集群,但是它是在Seed Studio的Odyssey Blue J4105 Mini PC上运行的三节点K3s集群上测试的。
架构设计
Prometheus暴露了一个REST API端点,可以通过查询来提取任何可用的指标。该API对任何有效的Prometheus查询都会以JSON负载进行响应。我们将利用该API来提取一些关键指标的值。
尽管Wio Terminal可以使用HTTP和JSON库来查询和解析响应,但是sketch的大小可能会导致设备不堪重负。因此,最好将繁重的工作转移到外部计算环境,该环境仅发送包含基本指标的、简化的、轻量的JSON。作为Wio Terminal和Prometheus之间的桥梁/adapter的wrapper将被部署为Kubernetes Pod,并通过NodePort/LoadBalancer进行服务暴露。Wio Terminal会定期调用这个服务来获取所需的值。
综上,我们这个项目只需要3个组件——Wio Terminal、wrapper服务以及运行在Kubernetes上的Prometheus deployment。
完整的源代码和配置可以查看下方Github链接:
https://github.com/janakiramm/wio-prometheus
安装和配置Prometheus
在你的Kubernetes集群中,可以通过Helm chart来安装Prometheus。这是在集群中部署Prometheus和Grafana的最高效的机制。
首先更新Helm 仓库,然后在Prometheus命名空间中安装chart。
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo add stable https://charts.helm.sh/stable
helm repo update
kubectl create ns prometheus
helm install prometheus prometheus-community/kube-prometheus-stack --namespace prometheus
验证pod和服务是否安装正确。
kubectl --namespace prometheus get pods -l "release=prometheus"
kubectl --namespace prometheus get svc -l "release=prometheus"
我通过使用下面的命令将Prometheus服务转换为LoadBalancer。
kubectl -n prometheus patch svc prometheus-kube-prometheus-prometheus -p '{"spec": {"type": "LoadBalancer"}}'
如果你还没有配置LoadBalancer,将其类型更改为NodePort。
编写Prometheus Wrapper
Prometheus wrapper服务是一个简单的Flask web应用程序,它可以抽象查询并且会在JSON中返回一个集合的响应。
以下代码段展示了服务如何封装查询以获得集群的节点数:
import flask
from flask import json
import requests
import json
app = flask.Flask(__name__)
data={}
PROMETHEUS = 'http://10.0.0.242:9090/api/v1/query'
def metrics():
getMetrics()
response = app.response_class(
response=json.dumps(data),
status=200,
mimetype='application/json'
)
return response
def getMetrics():
global data
response = requests.get(PROMETHEUS,
params={'query': 'count(kube_node_info)'})
results = response.json()
print("nodes:"+results['data']['result'][0]['value'][1])
data["nodes"]=results['data']['result'][0]['value'][1]
if __name__ == "__main__":
print("Loading server")
app.run(host='0.0.0.0')
我们可以添加多个查询到这个服务中以暴露额外的指标。关于wrapper服务的完整代码,请参考GitHub上的这个文件:
https://github.com/janakiramm/wio-prometheus/blob/main/Kubernetes/build/app.py
我将服务变成了一个Docker镜像,并把它作为一个无状态部署暴露在K3s集群中。这些工件的YAML规范可以在deploy目录下找到。
如下图所示:
调用wrapper服务端点会返回以下JSON负载:
curl -s 10.0.0.243/metrics | jq
既然服务已经部署完毕,让我们为Wio Terminal构建仪表盘。
Wio Terminal的Ardunio Sketch
要构建仪表盘,我们需要使用Ardunio WiFi library、Arduino HTTP client、JSON库以及TFT LCD library。
在上传sketch到Wio Terminal之前,需要在arduino_secrets.h.中更新WiFi SSID和密码。将serverAddress[ ]和port设置为合理的值。
检查Arduino的Serial Monitor,确保Sketch能够连接到WiFi和Wrapper服务端点。
现在,你可以通过这个始终在线的迷你仪表盘远程跟踪K3s集群的健康状况啦!
推荐阅读
扫码添加k3s中文社区助手
加入官方中文技术社区
官网:https://k3s.io