在边缘设备上部署Prometheus,实现远程监控K3s集群!

共 3769字,需浏览 8分钟

 ·

2021-01-28 18:24

作者简介

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-chartshelm repo add stable https://charts.helm.sh/stablehelm repo update
kubectl create ns prometheushelm 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 flaskfrom flask import jsonimport 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。

扫码添加k3s中文社区助手

加入官方中文技术社区

官网:https://k3s.io

浏览 48
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报