如何使用Helm和PrometheusOperator设置DigitalOceanKubernetes集群监控
介绍
除了跟踪和日志记录之外,监控和警报也是 Kubernetes 可观察性堆栈的重要组成部分。 为 Kubernetes 集群设置监控可让您跟踪资源使用情况并分析和调试应用程序错误。
监控系统通常由包含度量数据的时间序列数据库和可视化层组成。 此外,警报层创建和管理警报,并在必要时将它们移交给集成和外部服务。 最后,一个或多个组件生成或公开度量数据,这些数据将被此监控堆栈存储、可视化和处理以用于警报。
一种流行的监控解决方案是开源的 Prometheus、Grafana 和 Alertmanager 堆栈:
- Prometheus 是一个时间序列数据库和监控工具,它通过轮询指标端点并抓取和处理这些端点公开的数据来工作。 它允许您使用时间序列数据查询语言 PromQL 来查询这些数据。
- Grafana 是一种数据可视化和分析工具,可让您为指标数据构建仪表板和图表。
- Alertmanager,通常与 Prometheus 一起部署,形成堆栈的警报层,处理 Prometheus 生成的警报,并对它们进行重复数据删除、分组和路由到电子邮件或 PagerDuty 等集成。
此外,kube-state-metrics 和 node_exporter 等工具公开了集群级 Kubernetes 对象指标以及 CPU 和内存使用率等机器级指标。
在 Kubernetes 集群上实现这个监控堆栈可能很复杂,但幸运的是,其中一些复杂性可以通过 Helm 包管理器和 CoreOS 的 Prometheus Operator 和 kube-prometheus[ X234X] 项目。 这些项目为 Prometheus 和 Grafana 提供标准配置和仪表板,并抽象出一些较低级别的 Kubernetes 对象定义。 Helm prometheus-operator chart 允许您通过安装 Prometheus Operator 和上面列出的其他组件以及一组默认的仪表板、规则和有用的警报来启动和运行完整的集群监控解决方案用于监控 Kubernetes 集群。
在本教程中,我们将演示如何在 DigitalOcean Kubernetes 集群上安装 prometheus-operator
Helm 图表。 在本教程结束时,您将在集群中安装完整的监控堆栈。
先决条件
要遵循本教程,您将需要:
- DigitalOcean Kubernetes 集群。
kubectl
命令行界面安装在您的本地机器上并配置为连接到您的集群。 您可以在其官方文档中阅读更多关于安装和配置kubectl
的信息。- Helm 包管理器(2.10+)安装在本地机器上,Tiller 安装在集群上,详见如何使用 Helm 包管理器在 Kubernetes 集群上安装软件。
第 1 步 - 创建自定义值文件
在我们安装 prometheus-operator
Helm 图表之前,我们将创建一个自定义值文件,该文件将使用特定于 DigitalOcean 的配置参数覆盖图表的一些默认值。 要了解有关覆盖默认图表值的更多信息,请参阅 Helm 文档的 Helm 安装 部分。
首先,使用 nano
或您喜欢的编辑器在本地计算机上创建并打开一个名为 custom-values.yaml
的文件:
nano custom-values.yaml
复制并粘贴以下自定义值,为 Prometheus、Grafana 和 Alertmananger 组件启用持久存储,并禁用对未在 DigitalOcean Kubernetes 上公开的 Kubernetes 控制平面组件的监控:
自定义值.yaml
# Define persistent storage for Prometheus (PVC) prometheus: prometheusSpec: storageSpec: volumeClaimTemplate: spec: accessModes: ["ReadWriteOnce"] storageClassName: do-block-storage resources: requests: storage: 5Gi # Define persistent storage for Grafana (PVC) grafana: # Set password for Grafana admin user adminPassword: your_admin_password persistence: enabled: true storageClassName: do-block-storage accessModes: ["ReadWriteOnce"] size: 5Gi # Define persistent storage for Alertmanager (PVC) alertmanager: alertmanagerSpec: storage: volumeClaimTemplate: spec: accessModes: ["ReadWriteOnce"] storageClassName: do-block-storage resources: requests: storage: 5Gi # Change default node-exporter port prometheus-node-exporter: service: port: 30206 targetPort: 30206 # Disable Etcd metrics kubeEtcd: enabled: false # Disable Controller metrics kubeControllerManager: enabled: false # Disable Scheduler metrics kubeScheduler: enabled: false
在这个文件中,我们覆盖了一些与图表一起打包在其 values.yaml 文件 中的默认值。
我们首先为 Prometheus、Grafana 和 Alertmanager 启用持久存储,以便它们的数据在 Pod 重新启动时保持不变。 在幕后,这使用 DigitalOcean Block Storage 存储类为每个组件定义了一个 5 Gi
持久卷声明 (PVC)。 您应该修改这些 PVC 的大小以满足您的监控存储需求。 要了解有关 PVC 的更多信息,请参阅 Kubernetes 官方文档中的 Persistent Volumes。
接下来,将 your_admin_password 替换为安全密码,您将使用该密码以 admin 用户登录 Grafana 指标仪表板。
然后我们将为 node-exporter 配置一个不同的端口。 Node-exporter 在每个 Kubernetes 节点上运行,并向 Prometheus 提供操作系统和硬件指标。 我们必须更改其默认端口以绕过 DigitalOcean Kubernetes 防火墙默认设置,这将阻止端口 9100,但允许 30000-32767 范围内的端口。 或者,您可以为 node-exporter 配置自定义防火墙规则。 要了解如何操作,请参阅 DigitalOcean Cloud Firewalls 官方文档中的 如何配置防火墙规则。
最后,我们将禁用三个 Kubernetes 控制平面组件 的指标收集,它们不会在 DigitalOcean Kubernetes 上公开指标:Kubernetes 调度程序和控制器管理器,以及 etcd 集群数据存储。
要查看 prometheus-operator
图表的可配置参数的完整列表,请参阅图表存储库自述文件或默认值文件中的 Configuration 部分。
完成编辑后,保存并关闭文件。 我们现在可以使用 Helm 安装图表。
第 2 步 — 安装 prometheus-operator
图表
prometheus-operator
Helm 图表会将以下监控组件安装到您的 DigitalOcean Kubernetes 集群中:
- Prometheus Operator,一个 Kubernetes Operator,允许您配置和管理 Prometheus 集群。 Kubernetes Operators 将特定领域的逻辑集成到使用 Kubernetes 打包、部署和管理应用程序的过程中。 要了解有关 Kubernetes Operators 的更多信息,请参阅 CoreOS Operators Overview。 要了解有关 Prometheus Operator 的更多信息,请参阅关于 Prometheus Operator 和 Prometheus Operator GitHub 存储库 的这篇介绍性帖子 。 Prometheus Operator 将作为 Deployment 安装。
- Prometheus,作为 StatefulSet 安装。
- Alertmanager,一种处理 Prometheus 服务器发送的警报并将其路由到 PagerDuty 或电子邮件等集成的服务。 要了解有关 Alertmanager 的更多信息,请参阅 Prometheus 文档中的 Alerting。 Alertmanager 将作为 StatefulSet 安装。
- Grafana,一种时间序列数据可视化工具,可让您为 Prometheus 指标可视化和创建仪表板。 Grafana 将作为部署安装。
- node-exporter,一个在集群节点上运行的 Prometheus 导出器,为 Prometheus 提供操作系统和硬件指标。 请参阅 node-exporter GitHub 存储库 了解更多信息。 node-exporter 将作为 DaemonSet 安装。
- kube-state-metrics,一个附加代理,它监听 Kubernetes API 服务器并生成有关 Kubernetes 对象(如 Deployment 和 Pod)状态的指标。 您可以通过查阅 kube-state-metrics GitHub 存储库 了解更多信息。 kube-state-metrics 将作为部署安装。
默认情况下,连同 node-exporter、kube-state-metrics 和上面列出的其他组件生成的抓取指标,Prometheus 将配置为从以下组件抓取指标:
- kube-apiserver,Kubernetes API 服务器。
- CoreDNS,Kubernetes集群DNS服务器。
- kubelet,与 kube-apiserver 交互以管理节点上的 Pod 和容器的主节点代理。
- cAdvisor,一个节点代理,它发现正在运行的容器并收集它们的 CPU、内存、文件系统和网络使用指标。
在您的本地机器上,让我们首先安装 prometheus-operator
Helm 图表并传入我们在上面创建的自定义值文件:
helm install --namespace monitoring --name doks-cluster-monitoring -f custom-values.yaml stable/prometheus-operator
这里我们运行 helm install
并将所有组件安装到我们同时创建的 monitoring
命名空间中。 这使我们能够将监控堆栈与 Kubernetes 集群的其余部分完全分离。 我们将 Helm 版本命名为 doks-cluster-monitoring
并传入我们在 Step 1 中创建的自定义值文件。 最后,我们指定要从 Helm stable
目录 安装 prometheus-operator
图表。
您应该看到以下输出:
OutputNAME: doks-cluster-monitoring LAST DEPLOYED: Mon Apr 22 10:30:42 2019 NAMESPACE: monitoring STATUS: DEPLOYED RESOURCES: ==> v1/PersistentVolumeClaim NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE doks-cluster-monitoring-grafana Pending do-block-storage 10s ==> v1/ServiceAccount NAME SECRETS AGE doks-cluster-monitoring-grafana 1 10s doks-cluster-monitoring-kube-state-metrics 1 10s . . . ==> v1beta1/ClusterRoleBinding NAME AGE doks-cluster-monitoring-kube-state-metrics 9s psp-doks-cluster-monitoring-prometheus-node-exporter 9s NOTES: The Prometheus Operator has been installed. Check its status by running: kubectl --namespace monitoring get pods -l "release=doks-cluster-monitoring" Visit https://github.com/coreos/prometheus-operator for instructions on how to create & configure Alertmanager and Prometheus instances using the Operator.
这表明 Prometheus Operator、Prometheus、Grafana 和上面列出的其他组件已成功安装到您的 DigitalOcean Kubernetes 集群中。
按照 helm install
输出中的注释,使用 kubectl get pods
检查发布的 Pod 的状态:
kubectl --namespace monitoring get pods -l "release=doks-cluster-monitoring"
您应该看到以下内容:
OutputNAME READY STATUS RESTARTS AGE doks-cluster-monitoring-grafana-9d7f984c5-hxnw6 2/2 Running 0 3m36s doks-cluster-monitoring-kube-state-metrics-dd8557f6b-9rl7j 1/1 Running 0 3m36s doks-cluster-monitoring-pr-operator-9c5b76d78-9kj85 1/1 Running 0 3m36s doks-cluster-monitoring-prometheus-node-exporter-2qvxw 1/1 Running 0 3m36s doks-cluster-monitoring-prometheus-node-exporter-7brwv 1/1 Running 0 3m36s doks-cluster-monitoring-prometheus-node-exporter-jhdgz 1/1 Running 0 3m36s
这表明所有监控组件都已启动并正在运行,您可以开始使用 Grafana 及其预配置的仪表板探索 Prometheus 指标。
第 3 步 — 访问 Grafana 并探索指标数据
prometheus-operator
Helm 图表将 Grafana 公开为 ClusterIP
服务,这意味着它只能通过集群内部 IP 地址访问。 要在 Kubernetes 集群之外访问 Grafana,您可以使用 kubectl patch
将服务更新为面向公众的类型,例如 NodePort
或 LoadBalancer
或 kubectl port-forward
将本地端口转发到 Grafana Pod 端口。
在本教程中,我们将转发端口,但要了解有关 kubectl patch
和 Kubernetes 服务类型的更多信息,您可以参考 使用 kubectl patch 和 Services 就地更新 API 对象来自官方 Kubernetes 文档。
首先列出 monitoring
命名空间中正在运行的服务:
kubectl get svc -n monitoring
您应该看到以下服务:
OutputNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE alertmanager-operated ClusterIP None <none> 9093/TCP,6783/TCP 34m doks-cluster-monitoring-grafana ClusterIP 10.245.105.130 <none> 80/TCP 34m doks-cluster-monitoring-kube-state-metrics ClusterIP 10.245.140.151 <none> 8080/TCP 34m doks-cluster-monitoring-pr-alertmanager ClusterIP 10.245.197.254 <none> 9093/TCP 34m doks-cluster-monitoring-pr-operator ClusterIP 10.245.14.163 <none> 8080/TCP 34m doks-cluster-monitoring-pr-prometheus ClusterIP 10.245.201.173 <none> 9090/TCP 34m doks-cluster-monitoring-prometheus-node-exporter ClusterIP 10.245.72.218 <none> 30206/TCP 34m prometheus-operated ClusterIP None <none> 9090/TCP 34m
我们要将本地端口 8000
转发到 doks-cluster-monitoring-grafana
服务的端口 80
,然后转发到正在运行的 Grafana Pod 的端口 3000
。 这些 Service 和 Pod 端口在 stable/grafana
Helm 图表 值文件 中配置:
kubectl port-forward -n monitoring svc/doks-cluster-monitoring-grafana 8000:80
您应该看到以下输出:
OutputForwarding from 127.0.0.1:8000 -> 3000 Forwarding from [::1]:8000 -> 3000
这表明本地端口 8000
正在成功转发到 Grafana Pod。
在您的网络浏览器中访问 http://localhost:8000
。 您应该看到以下 Grafana 登录页面:
输入 admin 作为您在 custom-values.yaml
中配置的用户名和密码。 然后,点击 登录 。
您将被带到以下 Home Dashboard:
在左侧导航栏中,选择Dashboards按钮,然后点击Manage:
您将被带到以下仪表板管理界面,其中列出了 prometheus-operator
Helm 图表安装的仪表板:
这些仪表板由 kubernetes-mixin
生成,这是一个开源项目,允许您创建一组标准化的集群监控 Grafana 仪表板和 Prometheus 警报。 要了解更多信息,请参阅 Kubernetes Mixin GitHub 存储库 。
单击 Kubernetes / Nodes 仪表板,它可以可视化给定节点的 CPU、内存、磁盘和网络使用情况:
描述每个仪表板以及如何使用它来可视化集群的指标数据超出了本教程的范围。 要了解有关分析系统性能的 USE 方法的更多信息,您可以查阅 Brendan Gregg 的 The Utilization Saturation and Errors (USE) Method 页面。 Google 的 SRE Book 是另一个有用的资源,特别是第 6 章:监控分布式系统。 要了解如何构建自己的 Grafana 仪表板,请查看 Grafana 的 入门 页面。
在下一步中,我们将按照类似的流程连接并探索 Prometheus 监控系统。
第 4 步 - 访问 Prometheus 和 Alertmanager
要连接到 Prometheus Pod,我们再次必须使用 kubectl port-forward
转发本地端口。 如果您完成了对 Grafana 的探索,您可以通过点击 CTRL-C
关闭端口转发隧道。 或者,您可以打开一个新的 shell 和端口转发连接。
首先列出 monitoring
命名空间中正在运行的服务:
kubectl get svc -n monitoring
您应该看到以下服务:
OutputNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE alertmanager-operated ClusterIP None <none> 9093/TCP,6783/TCP 34m doks-cluster-monitoring-grafana ClusterIP 10.245.105.130 <none> 80/TCP 34m doks-cluster-monitoring-kube-state-metrics ClusterIP 10.245.140.151 <none> 8080/TCP 34m doks-cluster-monitoring-pr-alertmanager ClusterIP 10.245.197.254 <none> 9093/TCP 34m doks-cluster-monitoring-pr-operator ClusterIP 10.245.14.163 <none> 8080/TCP 34m doks-cluster-monitoring-pr-prometheus ClusterIP 10.245.201.173 <none> 9090/TCP 34m doks-cluster-monitoring-prometheus-node-exporter ClusterIP 10.245.72.218 <none> 30206/TCP 34m prometheus-operated ClusterIP None <none> 9090/TCP 34m
我们要将本地端口 9090
转发到 doks-cluster-monitoring-pr-prometheus
服务的端口 9090
:
kubectl port-forward -n monitoring svc/doks-cluster-monitoring-pr-prometheus 9090:9090
您应该看到以下输出:
OutputForwarding from 127.0.0.1:9090 -> 9090 Forwarding from [::1]:9090 -> 9090
这表明本地端口 9090
正在成功转发到 Prometheus Pod。
在您的网络浏览器中访问 http://localhost:9090
。 您应该会看到以下 Prometheus Graph 页面:
从这里您可以使用 PromQL(Prometheus 查询语言)来选择和聚合存储在其数据库中的时间序列指标。 要了解有关 PromQL 的更多信息,请参阅 Prometheus 官方文档中的 Querying Prometheus。
在 Expression 字段中,输入 machine_cpu_cores
并点击 Execute。 您应该会看到一个时间序列列表,其指标为 machine_cpu_cores
,报告给定节点上的 CPU 内核数。 您可以在指标标签中查看哪个节点生成了指标以及哪个作业抓取了指标。
最后,在顶部导航栏中,点击 Status 然后点击 Targets 可以看到 Prometheus 已经配置为抓取的目标列表。 您应该会看到与 Step 2 开头描述的监控端点列表相对应的目标列表。
要了解有关 Promtheus 以及如何查询集群指标的更多信息,请参阅官方 Prometheus 文档 。
我们将按照类似的流程连接到管理 Prometheus 生成的警报的 AlertManager。 您可以通过单击 Prometheus 顶部导航栏中的 Alerts 来探索这些警报。
要连接到 Alertmanager Pod,我们将再次使用 kubectl port-forward
转发本地端口。 如果您完成了对 Prometheus 的探索,您可以通过点击 CTRL-C
来关闭端口转发隧道。 或者,您可以打开一个新的 shell 和端口转发连接。
首先列出 monitoring
命名空间中正在运行的服务:
kubectl get svc -n monitoring
您应该看到以下服务:
OutputNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE alertmanager-operated ClusterIP None <none> 9093/TCP,6783/TCP 34m doks-cluster-monitoring-grafana ClusterIP 10.245.105.130 <none> 80/TCP 34m doks-cluster-monitoring-kube-state-metrics ClusterIP 10.245.140.151 <none> 8080/TCP 34m doks-cluster-monitoring-pr-alertmanager ClusterIP 10.245.197.254 <none> 9093/TCP 34m doks-cluster-monitoring-pr-operator ClusterIP 10.245.14.163 <none> 8080/TCP 34m doks-cluster-monitoring-pr-prometheus ClusterIP 10.245.201.173 <none> 9090/TCP 34m doks-cluster-monitoring-prometheus-node-exporter ClusterIP 10.245.72.218 <none> 30206/TCP 34m prometheus-operated ClusterIP None <none> 9090/TCP 34m
我们要将本地端口 9093
转发到 doks-cluster-monitoring-pr-alertmanager
服务的端口 9093
。
kubectl port-forward -n monitoring svc/doks-cluster-monitoring-pr-alertmanager 9093:9093
您应该看到以下输出:
OutputForwarding from 127.0.0.1:9093 -> 9093 Forwarding from [::1]:9093 -> 9093
这表明本地端口 9093
正在成功转发到 Alertmanager Pod。
在您的网络浏览器中访问 http://localhost:9093
。 您应该看到以下 Alertmanager Alerts 页面:
从这里,您可以探索触发警报并可选择将其静音。 要了解有关 Alertmanager 的更多信息,请参阅 官方 Alertmanager 文档 。
结论
在本教程中,您在 DigitalOcean Kubernetes 集群中安装了 Prometheus、Grafana 和 Alertmanager 监控堆栈,其中包含一组标准的仪表板、Prometheus 规则和警报。 由于这是使用 Helm 完成的,因此您可以使用 helm upgrade
、helm rollback
和 helm delete
来升级、回滚或删除监控堆栈。 要了解有关这些功能的更多信息,请参阅 如何使用 Helm 包管理器在 Kubernetes 集群上安装软件。
prometheus-operator
图表可帮助您使用 Helm 快速启动和运行集群监控。 您可能希望手动构建、部署和配置 Prometheus Operator。 为此,请咨询普罗米修斯运算符和 [kube-prometheus](< https://github.com/coreos/kube-prometheus ) GitHub 存储库。