使用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が提供した情報を取得して可視化する

undefined

使用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

undefined

用户名和密码存储在名为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....

确认数据来源的合作

スクリーンショット 2023-09-10 8.50.20.png
スクリーンショット 2023-09-10 8.55.16.png

仪表盘的导入确认

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

スクリーンショット 2023-09-10 8.57.10.png

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

スクリーンショット 2023-09-10 9.03.40.png
bannerAds