作者简介
Janakiram MSV是Janakiram & Associates的首席分析师,也是国际信息技术学院的兼职教师。他也是Google Qualified Developer、亚马逊认证解决方案架构师、亚马逊认证开发者、亚马逊认证SysOps管理员和微软认证Azure专业人员。
Janakiram是云原生计算基金会(CNCF)的大使,也是首批Kubernetes认证管理员和Kubernetes认证应用开发者之一。他曾在微软、AWS、Gigaom Research等知名公司工作。

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 updatekubectl 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'
@app.route('/metrics')
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集群的健康状况啦!
推荐阅读
保姆级教程!使用k3d实现K3s高可用!
一文搞定全场景K3s离线安装
除了边缘场景,你还能在哪里使用K3s?
About k3s
k3s 是首个进入 CNCF 沙箱项目的 K8S 发行版,同时也是当前全球用户量最大的 CNCF 认证轻量级 K8S 发行版。自2019年3月发布以来,备受全球开发者们关注,至今GitHub Star数已超过 15,700,成为了开源社区最受欢迎的边缘计算 K8S 解决方案。截至目前,K3s全球下载量超过100万次,每周平均被安装超过2万次,其中30%的下载量来自中国。
k3s 专为在资源有限的环境中运行 Kubernetes 的研发和运维人员设计,将满足日益增长的在边缘计算环境中运行在 x86、ARM64 和 ARMv7 处理器上的小型、易于管理的 Kubernetes 集群需求。k3s 的发布,为开发者们提供了以“Rancher 2.X + k3s”为核心的从数据中心到云到边到端的 K8S 即服务(Kubernetes-as-a-Service),推动 Kubernetes Everywhere。