跳到主要内容

使用 Prometheus 监控 KubeEdge 边缘节点

环境信息

组件版本
containerd1.7.2
k8s1.26.0
KubeEdge1.17.0
Jetson型号NVIDIA Jetson Xavier NX (16GB ram)

关于 KubeEdge 版本说明:由于 v1.17.0 支持使用 InclusterConfig 的边缘 pod,因此 v1.17.0 之前和之后的版本的方法是不同的。本文档将以 v1.17.0 为例来说明操作步骤, v1.17.0 之前版本请参考对应版本文档。

部署 prometheus

我们可以直接使用 kube-prometheusHelm Charts 来进行快速安装,也可以直接手动安装。

需要注意 Kubernetes 版本和 kube-prometheus 的兼容。

git clone https://github.com/prometheus-operator/kube-prometheus.git
cd kube-prometheus
kubectl apply --server-side -f manifests/setup
kubectl wait \
--for condition=Established \
--all CustomResourceDefinition \
--namespace=monitoring
kubectl apply -f manifests/

可以看到上面针对 grafana、alertmanager 和 prometheus 都创建了一个类型为 ClusterIP 的 Service,当然如果我们想要在外网访问这两个服务的话可以通过创建对应的 Ingress 对象或者使用 NodePort 类型的 Service,我们这里为了简单,直接使用 NodePort 类型的服务即可,编辑 grafanaalertmanager-mainprometheus-k8s 这 3 个 Service,将服务类型更改为 NodePort:

kubectl edit svc grafana -n monitoring
kubectl edit svc alertmanager-main -n monitoring
kubectl edit svc prometheus-k8s -n monitoring

由于最新版本的 kube-prometheus 设置了网络策略,即使配置了 NodePort 也无法访问。需要修改 NetworkPolicy,允许 10网段的 IP访问。

kubectl edit  NetworkPolicy prometheus-k8s -n monitoring
kubectl edit NetworkPolicy grafana -n monitoring
kubectl edit NetworkPolicy alertmanager-main -n monitoring

这样就可以通过 NodePort 访问 prometheus 和 grafana 服务了

部署 KubeEdge

开启 InClusterConfig 功能

部署 1.17.0版本注意,需要支持边缘 Pods 使用 InClusterConfig 访问 Kube-APIServer ,所以要配置指定 cloudCore.featureGates.requireAuthorization=true 以及 cloudCore.modules.dynamicController.enable=true。 详情可以查看 KubeEdge 公众号文章

keadm init --advertise-address=10.108.96.24  --set cloudCore.featureGates.requireAuthorization=true,cloudCore.modules.dynamicController.enable=true --kubeedge-version=v1.17.0
  • 启动 EdgeCore 后,按如下修改 edgecore.yaml 后重启 EdgeCore。

    修改 metaServer.enable = true 同时增加 featureGates: requireAuthorization: true

apiVersion: edgecore.config.kubeedge.io/v1alpha2
kind: EdgeCore
featureGates:
requireAuthorization: true
modules:
...
metaManager:
metaServer:
enable: true

修改完重启 edgecore

systemctl daemon-reload
systemctl restart edgecore

创建 clusterrolebinding

发现 node-exporter 里面的容器报错:Unable to authenticate the request due to an error: tokenreviews.authentication.k8s.io is forbidden: User "system:serviceaccount:kubeedge:cloudcore" cannot create resource "tokenreviews" in API group "authentication.k8s.io" at the cluster scope

因为 cloudcore 没有权限,所以创建一个 clusterrolebinding

kubectl create clusterrolebinding cloudcore-promethus-binding --clusterrole=cluster-admin --serviceaccount=kubeedge:cloudcore

创建完 clusterrolebinding 就可以查询到边缘节点的监控信息了。