使用Helm部署Prometheus和Grafana,并可视化Node exporter的度量指标
首先
我想要理解Prometheus和Grafana,并希望收集正在运行的多台机器的指标(如CPU/内存/存储利用率),所以我创建了一个Kubernetes的Helm图表进行构建。
当我第一次接触Prometheus和Grafana时,我使用Docker和Docker Compose,但最终只达到了一半的状态。这次我使用Kubernetes的Helm和Helmfile(本文中未提及)重新构建,迈出了一步。下面是我所做的总结。
环境信息
-
- Kubernetes
v1.27.1 (サーバ&クライアント)
Helm
v3.9.2+g1addefb
节点的构建是由五台机器完成的。
$ kubectl get node -o custom-columns=NAME:.metadata.name,VERSION:.status.nodeInfo.kubeletVersion,OS-IMAGE:.status.nodeInfo.osImage
NAME VERSION OS-IMAGE
control-plane v1.27.1 Debian GNU/Linux 10 (buster)
node01 v1.27.1 Ubuntu 20.04.6 LTS
node02 v1.27.1 Ubuntu 22.04.1 LTS
node03 v1.27.1 Ubuntu 20.04.6 LTS
node04 v1.27.1 Ubuntu 20.04.6 LTS
想做的事情和實現策略
目标是将Prometheus和Grafana部署为Kubernetes资源,并收集并可视化每个节点的指标。
由于Prometheus和Grafana的Helm图表已经准备好,因此您只需根据您的需求设置参数,并通过helm install命令进行安装即可实现。
普罗米修斯
https://github.com/prometheus-community/helm-charts/tree/main/charts/prometheus 这个Helm chart的主要功能是Prometheus Server,但同时还会(基于依赖关系)安装以下4个功能的Helm chart。
-
- alertmanager
-
- kube-state-metrics
-
- prometheus-node-exporter
- prometheus-pushgateway
由于作者知识有限,无法完全解释这四个,但至少prometheus-node-exporter可以收集每个节点的指标,从而为本文的目标达成做出贡献。
※尚未確定,但似乎可以使用kube-state-metrics收集Kubernetes的指標!
Grafana 可视化工具
通过与Prometheus Server的连接,我们可以以可视化的方式展示由Node Exporter等提供的指标数据。虽然您可以通过自己创建查询和仪表盘来实现可视化部分,但由于已经有了Node Exporter的公开仪表盘,使用它会更加高效,所以我们决定在这次使用它。
在整体的视角中的定位
当根据官方网站上的架构图来思考时,我们将使用以下功能。
-
- Job/exporters(左下)
Node exporterを使って各ノードのメトリクスを収集
Prometheus Server(真ん中)
Node exporterにメトリクス等の情報の収集命令を出す
収集した情報をHTTPサービスとして提供する
Grafana(右下)
Prometheus Serverが提供した情報を取得して可視化する

使用Prometheus的H
添加Helm存储库
按照README文件中所述,我们将添加prometheus-community的Helm仓库。
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
设置PersistentVolume相关的参数
关于prometheus-server和prometheus-node-exporter,使用PersistentVolume是默认设置。因此,例如,需要创建变量定义文件,并指定StorageClass。
server:
persistentVolume:
storageClass: <prometheus-server用のSC名>
alertmanager:
persistence:
storageClass: <prometheus-node-exporter用のSC名>
如果在没有StorageClass的环境中,可以通过以下设置来避免使用PersistentVolume。但请注意,如果使用这个设置,当删除Pod时,可能会导致各个服务收集的指标等信息也一并消失,请注意!
server:
persistentVolume:
enabled: false
alertmanager:
persistence:
enabled: false
部署
执行以下命令。
helm install --create-namespace --namespace prometheus \
prometheus prometheus-community/prometheus \
-f values-prometheus-local.yaml \
--version 24.1.0
我会等几分钟,以确认Pod是否已经部署好。可以看到Node exporter已作为DaemonSet资源部署在每个节点上。
(在我的环境中,Node exporter也被部署在控制平面,但默认情况下应该只在工作节点上创建)
$ kubectl get pod -n prometheus -o custom-columns=NAME:.metadata.name,READY:.status.containerStatuses[0].ready,STATUS:.status.phase,NODE:.spec.nodeName
NAME READY STATUS NODE
prometheus-alertmanager-0 true Running node01
prometheus-kube-state-metrics-b4557d966-9f2r9 true Running node01
prometheus-prometheus-node-exporter-6tn6r true Running node04
prometheus-prometheus-node-exporter-dpp5w true Running control-plane
prometheus-prometheus-node-exporter-gwqg6 true Running node03
prometheus-prometheus-node-exporter-vfhlt true Running node01
prometheus-prometheus-node-exporter-xcvs9 true Running node02
prometheus-prometheus-pushgateway-79ff799669-mgzjc true Running node01
prometheus-server-7f8bb747c4-wwk5t true Running node02
此外,Service资源是按照以下方式创建的。我们将按照以下步骤将prometheus-server的Service与Grafana进行集成。
$ kubectl get svc -n prometheus
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
prometheus-alertmanager ClusterIP 10.107.241.238 <none> 9093/TCP 6d14h
prometheus-alertmanager-headless ClusterIP None <none> 9093/TCP 6d14h
prometheus-kube-state-metrics ClusterIP 10.104.23.189 <none> 8080/TCP 6d14h
prometheus-prometheus-node-exporter ClusterIP 10.107.210.162 <none> 9100/TCP 6d14h
prometheus-prometheus-pushgateway ClusterIP 10.103.56.16 <none> 9091/TCP 6d14h
prometheus-server ClusterIP 10.101.118.171 <none> 80/TCP 6d14h
部署Grafana的Helm图表
添加Helm存储库
按照README中写的,我们将添加grafana的Helm仓库。
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
数据源,仪表板的参数设置。
在部署Grafana时,我想要将已经部署的Prometheus Server与其协作,并且能够在仪表盘上看到通过Node exporter收集到的指标数据。这些设置可以在Grafana部署后的WebUI上进行,但这种方法可能会导致设置在更新Grafana时消失,因此并不明智。
因此,我准备一个如下的变量定义文件,以便始终保持设置的持久化。
# クラスター外からアクセスできるようにする一つの手段
service:
type: NodePort
# (1) Prometheus Serverとの連携
datasources:
datasources.yaml:
apiVersion: 1
datasources:
- name: "Prometheus"
type: prometheus
access: proxy
url: http://prometheus-server.prometheus.svc.cluster.local
# (2) Dashboardの基本設定
dashboardProviders:
dashboardproviders.yaml:
apiVersion: 1
providers:
- name: 'default'
orgId: 1
folder: ''
type: file
disableDeletion: false
editable: true
options:
path: /var/lib/grafana/dashboards/default
# (3) Node exporterのDashboardを追加する設定
dashboards:
default:
node-exporter:
datasource: Prometheus
url: https://grafana.com/api/dashboards/1860/revisions/32/download
我会简单地解释以下内容。
(1) 与Prometheus服务器的协作
这是与Prometheus Server的Service资源(prometheus-server)进行协作的配置。由于Namespace为prometheus,所以可以通过指定http://prometheus-server.prometheus.svc.cluster.local在集群内进行访问。
(2) 仪表盘的基本设置
以下是一部分我不太理解的内容,但我还是决定直接使用它。
(3) 添加Node Exporter的仪表盘设置。
以下提供了一个名为“Node Exporter Full”的仪表板。
将此网站右下方的“Download JSON”URL复制到url: 中,并在部署时进行导入。
部署
执行以下命令。
helm install --create-namespace --namespace grafana \
grafana grafana/grafana \
-f values-grafana-local.yaml \
--version 6.59.0
我会确认Grafana正在运行。
$ kubectl get pod -n grafana
NAME READY STATUS RESTARTS AGE
grafana-5c4798c889-fnwr8 1/1 Running 0 2m13s
由于Grafana的Service资源作为NodePort运行,因此会分配任意的3xxxx系列端口号。
$ kubectl get svc -n grafana
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
grafana NodePort 10.110.8.136 <none> 80:3xxxx/TCP 2m44s
在网页浏览器中连接到Grafana并进行确认。
登录
在Web浏览器中访问以下URL。(其中3xxxx是随机分配给Grafana服务资源的端口号)
http://[节点的IP地址]:3xxxx

用户名和密码存储在名为grafana的Secret资源中,可以使用以下命令进行确认。
$ kubectl get secret -n grafana grafana -o jsonpath="{.data.admin-user}" | base64 -d
(出力結果)
admin
$ kubectl get secret -n grafana grafana -o jsonpath="{.data.admin-password}" | base64 -d
(出力結果)
xxxx....
确认数据来源的合作


仪表盘的导入确认
点击左侧菜单中的“仪表盘”,然后确认“Node Exporter Full”已导入到General文件夹中。

点击“Node Exporter Full”,如果显示出以下类型的仪表板,则表示成功!
