使用 Prometheus 和 Grafana 开始监控您的 Kubernetes 集群

在您可以衡量混沌之前,您需要了解系统的稳态是什么样的。在本系列关于混沌工程的第二篇文章中学习如何做到这一点。
57 位读者喜欢这篇文章。
How Kubernetes became the solution for migrating legacy applications

Opensource.com

在我的关于混沌工程的介绍性文章中,我主要涵盖的一件事是了解您的工作 Kubernetes 集群的稳态的重要性。在您可以开始制造混沌之前,您需要知道集群在稳态下是什么样的。

本文将介绍如何使用 Prometheus 获取这些指标Grafana。本教程还使用 Pop!_OS 20.04、Helm 3、Minikube 1.14.2 和 Kubernetes 1.19。

配置 Minikube

安装 Minikube,选择适合您环境的方式。如果您有足够的资源,我建议为您的虚拟机分配比默认内存和 CPU 功率更多的资源

$ minikube config set memory 8192
❗  These changes will take effect upon a minikube delete and then a minikube start
$ minikube config set cpus 6
❗  These changes will take effect upon a minikube delete and then a minikube start

然后启动并检查您的系统状态

$ minikube start
?  minikube v1.14.2 on Debian bullseye/sid
?  minikube 1.19.0 is available! Download it: https://github.com/kubernetes/minikube/releases/tag/v1.19.0
?  To disable this notice, run: 'minikube config set WantUpdateNotification false'

✨  Using the docker driver based on user configuration
?  Starting control plane node minikube in cluster minikube
?  Creating docker container (CPUs=6, Memory=8192MB) ...
?  Preparing Kubernetes v1.19.0 on Docker 19.03.8 ...
?  Verifying Kubernetes components...
?  Enabled addons: storage-provisioner, default-storageclass
?  Done! kubectl is now configured to use "minikube" by default
$ minikube status
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured

安装 Prometheus

集群设置完成后,开始安装。首先按照以下说明安装 Prometheus

首先,在 Helm 中添加存储库

$ helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
"prometheus-community" has been added to your repositories

然后安装您的 Prometheus Helm chart。您应该看到

$ helm install prometheus prometheus-community/prometheus
NAME: prometheus
LAST DEPLOYED: Sun May  9 11:37:19 2021
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
The Prometheus server can be accessed via port 80 on the following DNS name from within your cluster:
prometheus-server.default.svc.cluster.local

通过在同一 shell 中运行以下命令获取 Prometheus 服务器 URL

  export POD_NAME=$(kubectl get pods --namespace default -l "app=prometheus,component=server" -o jsonpath="{.items[0].metadata.name}")
  kubectl --namespace default port-forward $POD_NAME 9090

您可以从集群内部通过此 DNS 名称上的端口 80 访问 Prometheus Alertmanager

prometheus-alertmanager.default.svc.cluster.local

通过在同一 shell 中运行以下命令获取 Alertmanager URL

  export POD_NAME=$(kubectl get pods --namespace default -l "app=prometheus,component=alertmanager" -o jsonpath="{.items[0].metadata.name}")
  kubectl --namespace default port-forward $POD_NAME 9093
#################################################################################
######   WARNING: Pod Security Policy has been moved to a global property.  #####
######            use .Values.podSecurityPolicy.enabled with pod-based      #####
######            annotations                                               #####
######            (e.g. .Values.nodeExporter.podSecurityPolicy.annotations) #####
#################################################################################

您可以从集群内部通过此 DNS 名称上的端口 9091 访问 Prometheus PushGateway

prometheus-pushgateway.default.svc.cluster.local

通过在同一 shell 中运行以下命令获取 PushGateway URL

  export POD_NAME=$(kubectl get pods --namespace default -l "app=prometheus,component=pushgateway" -o jsonpath="{.items[0].metadata.name}")
  kubectl --namespace default port-forward $POD_NAME 9091

For more information on running Prometheus, visit:
https://prometheus.ac.cn/

检查以确认您的 Pod 正在运行

$ kubectl get pods -n default
NAME                                             READY   STATUS    RESTARTS   AGE
prometheus-alertmanager-ccf8f68cd-hcrqr          2/2     Running   0          3m22s
prometheus-kube-state-metrics-685b975bb7-mhv54   1/1     Running   0          3m22s
prometheus-node-exporter-mfcwj                   1/1     Running   0          3m22s
prometheus-pushgateway-74cb65b858-7ffhs          1/1     Running   0          3m22s
prometheus-server-d9fb67455-2g2jw                2/2     Running   0          3m22s

接下来,在 Prometheus 服务器 Pod 上公开您的端口,以便您可以看到 Prometheus Web 界面。为此,您需要服务名称和端口。您还需要想出一个名称,以便使用 Minikube 服务命令打开服务。

获取 prometheus-server 的服务名称

$ kubectl get svc -n default
NAME                            TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes                      ClusterIP   10.96.0.1        <none>        443/TCP        13m
prometheus-alertmanager         ClusterIP   10.106.68.12     <none>        80/TCP         8m22s
prometheus-kube-state-metrics   ClusterIP   10.104.167.239   <none>        8080/TCP       8m22s
prometheus-node-exporter        ClusterIP   None             <none>        9100/TCP       8m22s
prometheus-pushgateway          ClusterIP   10.99.90.233     <none>        9091/TCP       8m22s
prometheus-server               ClusterIP   10.103.195.104   <none>        9090/TCP       8m22s

将服务公开为 Node-port 类型。提供目标端口 9090 和您想要调用的服务器名称。节点端口是服务器监听端口。这是 Helm chart 的摘录

    ## Port for Prometheus Service to listen on
    ##
    port: 9090

命令是

$ kubectl expose service prometheus-server --type=NodePort --target-port=9090 --name=prom-server
service/prom-server exposed

接下来,您需要 Minikube 打开服务和浏览器

jess@Athena:~$ minikube service prom-server
|-----------|-------------|-------------|---------------------------|
| NAMESPACE |    NAME     | TARGET PORT |            URL            |
|-----------|-------------|-------------|---------------------------|
| default   | prom-server |          80 | http://192.168.49.2:32169 |
|-----------|-------------|-------------|---------------------------|
?  Opening service default/prom-server in default browser...

您的浏览器应该打开并显示 Prometheus 服务。

恭喜!您现在已经在您的集群上安装了 Prometheus。

安装 Grafana

接下来,安装 Grafana 并将其配置为与 Prometheus 一起工作。按照以下步骤公开服务以配置 Grafana 并从 Prometheus 收集数据,以收集您的稳态。

首先获取您的 Helm chart

$ helm repo add grafana https://grafana.github.io/helm-charts
"grafana" has been added to your repositories

搜索您的 chart

$ helm search repo grafana
NAME                                          	CHART VERSION	APP VERSION	DESCRIPTION                                       
bitnami/grafana       5.2.11      7.5.5      	Grafana is an open source, feature rich metrics...
bitnami/grafana-operator       0.6.5      3.10.0   Kubernetes Operator based on the Operator SDK f...
grafana/grafana    6.9.0        	7.5.5      	The leading tool for querying and visualizing t...
stable/grafana    5.5.7        	7.1.1      	DEPRECATED - The leading tool for querying and ...

由于 stable/grafana 已被弃用,请安装 bitnami/grafana。然后安装您的 chart

helm install grafana bitnami/grafana
NAME: grafana
LAST DEPLOYED: Sun May  9 12:09:53 2021
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
** Please be patient while the chart is being deployed **
  1. 通过运行以下命令获取应用程序 URL
    echo "Browse to http://127.0.0.1:8080"
    kubectl port-forward svc/grafana 8080:3000 &
    
  2. 获取管理员凭据
    echo "User: admin"
    echo "Password: $(kubectl get secret grafana-admin --namespace default -o jsonpath="{.data.GF_SECURITY_ADMIN_PASSWORD}" | base64 --decode)"
    

正如您在 Helm 安装输出中看到的那样,Grafana 的目标端口是 3000,因此您将使用该端口公开服务以查看 Grafana 的 Web 前端。在公开服务之前,请确认您的服务正在运行

$ kubectl get pods -A
NAMESPACE     NAME                                             READY   STATUS    RESTARTS   AGE
default       grafana-6b84bbcd8f-xt6vd                         1/1     Running   0          4m21s

公开服务

$ kubectl expose service grafana --type=NodePort --target-port=3000 --name=grafana-server
service/grafana-server exposed

启用服务以使用 Minikube 服务打开浏览器

jess@Athena:~$ minikube service grafana-server
|-----------|----------------|-------------|---------------------------|
| NAMESPACE |      NAME      | TARGET PORT |            URL            |
|-----------|----------------|-------------|---------------------------|
| default   | grafana-server |        3000 | http://192.168.49.2:30549 |
|-----------|----------------|-------------|---------------------------|
?  Opening service default/grafana-server in default browser...

您将看到欢迎屏幕,您可以在其中登录。

使用 kubectl 设置凭据以登录 Grafana。命令出现在安装的输出中;以下是正在使用的命令

$ echo "User: admin"
User: admin
$ echo "Password: $(kubectl get secret grafana-admin --namespace default -o jsonpath="{.data.GF_SECURITY_ADMIN_PASSWORD}" | base64 --decode)"
Password: G6U5VeAejt

使用您的新凭据登录,您将看到 Grafana 仪表板。

恭喜!您现在已经在您的 Minikube 集群中安装了可工作的 Grafana,并且可以登录。下一步是将 Grafana 配置为与 Prometheus 一起工作,以收集数据并显示您的稳态。

使用 Prometheus 配置 Grafana

现在您可以登录到您的 Grafana 实例,您需要设置数据收集和仪表板。由于这是一个完全基于 Web 的配置,我将通过屏幕截图来介绍设置过程。首先添加您的 Prometheus 数据收集。单击显示屏左侧的齿轮图标以打开配置设置,然后选择数据源

在下一个屏幕上,单击添加数据源

选择 Prometheus

由于您已将 Prometheus 实例配置为在端口 80 上公开,请使用服务名称 prometheus-server 和服务器端口 80

滚动到屏幕底部,然后单击保存并测试,保存并测试您的新数据源。您应该看到一个绿色横幅,显示数据源工作正常

返回页面顶部,然后单击仪表板

导入所有三个仪表板选项。

单击左侧的放大镜图标以确认已导入所有三个仪表板。

现在一切都已配置完成,单击 Prometheus 2.0 Stats,您应该看到类似于这样的内容。

恭喜!您已经设置了从 Prometheus 收集有关您的集群的基本数据收集。

导入更多监控仪表板

您可以从 Grafana Labs 的 社区仪表板 集合中导入其他更详细的仪表板。我为这个快速教程选择了两个我最喜欢的仪表板:Dash-minikubeKubernetes Cluster Monitoring

要导入仪表板,您需要从仪表板集合中获取其 ID。首先,单击左侧的加号 (+) 以创建仪表板,然后单击下拉列表中的导入,并输入 ID。对于 Dash-minikube,其 ID 为 10219。

单击加载,然后在下一个屏幕上输入数据源。由于这使用 Prometheus,请输入您的 Prometheus 数据源。

单击导入,新的仪表板将出现。

现在您有了一个新的仪表板来跟踪您的 Minikube 统计信息。如果您使用 Kubernetes Cluster Monitoring(ID 2115)按照相同的步骤操作,您将看到一个更详细的监控仪表板。

现在您可以使用 Grafana 和 Prometheus 数据收集和可视化来跟踪您的稳态。

最终想法

借助这些开源工具,您可以收集集群的稳态并保持对其良好脉搏的掌握。这在混沌工程中非常重要,因为它允许您检查破坏性、不稳定状态下的所有内容,并使用该数据来测试您关于在中断期间其状态可能发生什么情况的假设。

接下来阅读什么
User profile image.
技术游民,从事我能找到的任何工作。IT 领域筒仓预防的倡导者,与所有团队共享信息的重要性。相信教育所有人并开源开发。热爱所有科技事物。关于 K8s、混沌以及我能找到的任何新鲜事物!Mastodon ID

评论已关闭。

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.