介绍
除跟踪和日志记录外,监视和警报是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项目来管理其中一些复杂性。 这些项目在Prometheus和Grafana的标准配置和仪表板中烘焙,并抽象出一些较低级别的Kubernetes对象定义。 Helm prometheus-operator
图表允许您通过安装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 Install部分。
首先,使用nano
或您喜欢的编辑器在本地计算机上创建并打开名为custom-values.yaml
的文件:
nano custom-values.yaml
复制并粘贴以下自定义值,这些自定义值为Prometheus,Grafana和Alertmananger组件启用持久存储,并禁用对未在DigitalOcean Kubernetes上公开的Kubernetes控制平面组件的监视:
# 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 portprometheus-node-exporter: service: port: 30206 targetPort: 30206# Disable Etcd metricskubeEtcd: enabled: false# Disable Controller metricskubeControllerManager: enabled: false# Disable Scheduler metricskubeScheduler: enabled: false
在此文件中,我们覆盖了其values.yaml文件中与图表一起打包的一些默认值。
我们首先为Prometheus,Grafana和Alertmanager启用持久存储,以便它们的数据在Pod重启时保持不变。 在幕后,它使用DigitalOcean Block Storage存储类为每个组件定义了5 Gi
持久卷声明(PVC)。 您应该修改这些PVC的大小以满足您的监控存储需求。 要了解有关PVC的更多信息,请参阅官方Kubernetes文档中的Persistent Volumes 。
接下来,将your_admin_password
替换为您将用于使用admin用户登录Grafana metrics仪表板的安全密码。
然后,我们将为节点导出器配置不同的端口。 节点导出器在每个Kubernetes节点上运行,并为Prometheus提供操作系统和硬件指标。 我们必须更改其默认端口以绕过DigitalOcean Kubernetes防火墙默认值,这将阻止端口9100但允许端口在30000-32767范围内。 或者,您可以为节点导出程序配置自定义防火墙规则。 要了解具体方法,请参阅官方DigitalOcean云防火墙文档中的如何配置防火墙规则 。
最后,我们将禁用三个Kubernetes 控制平面组件的度量收集,这些组件不会在DigitalOcean Kubernetes上公开指标:Kubernetes Scheduler和Controller Manager,以及etcd集群数据存储。
要查看prometheus-operator
图表的可配置参数的完整列表,请参阅图表repo README中的“ 配置”部分或默认值文件。
完成编辑后,保存并关闭文件。 我们现在可以使用Helm安装图表。
第2步 – 安装prometheus-operator
图表
prometheus-operator
Helm图表将把以下监控组件安装到您的DigitalOcean Kubernetes集群中:
- Prometheus Operator,一个Kubernetes 运算符 ,允许您配置和管理Prometheus集群。 Kubernetes Operators将特定于域的逻辑集成到使用Kubernetes打包,部署和管理应用程序的过程中。 要了解有关Kubernetes运算符的更多信息,请参阅CoreOS运算符概述 。 要了解有关Prometheus操作员的更多信息,请参阅Prometheus操作员和Prometheus操作员GitHub仓库的 这篇介绍性文章 。 Prometheus Operator将作为部署安装。
- Prometheus,作为StatefulSet安装。
- Alertmanager,一种处理Prometheus服务器发送的警报并将其路由到PagerDuty或电子邮件等集成的服务。 要了解有关Alertmanager的更多信息,请参阅Prometheus文档中的警报 。 Alertmanager将作为StatefulSet安装。
- Grafana,一个时间序列数据可视化工具,允许您为Prometheus指标可视化和创建仪表板。 Grafana将作为部署安装。
- node-exporter,一个在集群节点上运行的Prometheus导出器,为Prometheus提供操作系统和硬件指标。 请参阅node-exporter GitHub repo以了解更多信息。 node-exporter将作为DaemonSet安装。
- kube-state-metrics,一个附加代理,用于监听Kubernetes API服务器并生成有关部署和Pod等Kubernetes对象状态的指标。 您可以通过咨询kube-state-metrics GitHub repo来了解更多信息。 kube-state-metrics将作为部署安装。
默认情况下,除了由节点导出器,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
并传入我们在第1步中创建的自定义值文件。 最后,我们指定我们要从Helm stable
目录安装prometheus-operator
图表。
您应该看到以下输出:
NAME: doks-cluster-monitoringLAST DEPLOYED: Mon Apr 22 10:30:42 2019NAMESPACE: monitoringSTATUS: DEPLOYEDRESOURCES:==> v1/PersistentVolumeClaimNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGEdoks-cluster-monitoring-grafana Pending do-block-storage 10s==> v1/ServiceAccountNAME SECRETS AGEdoks-cluster-monitoring-grafana 1 10sdoks-cluster-monitoring-kube-state-metrics 1 10s. . .==> v1beta1/ClusterRoleBindingNAME AGEdoks-cluster-monitoring-kube-state-metrics 9spsp-doks-cluster-monitoring-prometheus-node-exporter 9sNOTES: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 howto create & configure Alertmanager and Prometheus instances using the Operator.
这表明Prometheus Operator,Prometheus,Grafana以及上面列出的其他组件已成功安装到您的DigitalOcean Kubernetes群集中。
按照helm install
输出中的注释,使用kubectl get pods
检查发行版kubectl get pods
:
kubectl --namespace monitoring get pods -l "release=doks-cluster-monitoring"
你应该看到以下内容:
NAME READY STATUS RESTARTS AGEdoks-cluster-monitoring-grafana-9d7f984c5-hxnw6 2/2 Running 0 3m36sdoks-cluster-monitoring-kube-state-metrics-dd8557f6b-9rl7j 1/1 Running 0 3m36sdoks-cluster-monitoring-pr-operator-9c5b76d78-9kj85 1/1 Running 0 3m36sdoks-cluster-monitoring-prometheus-node-exporter-2qvxw 1/1 Running 0 3m36sdoks-cluster-monitoring-prometheus-node-exporter-7brwv 1/1 Running 0 3m36sdoks-cluster-monitoring-prometheus-node-exporter-jhdgz 1/1 Running 0 3m36s
这表明所有监视组件都已启动并正在运行,您可以使用Grafana及其预配置的仪表板开始探索Prometheus指标。
第3步 – 访问Grafana和探索指标数据
prometheus-operator
Helm chart将Grafana公开为ClusterIP
服务,这意味着它只能通过集群内部IP地址访问。 要在Kubernetes集群之外访问Grafana,您可以使用kubectl patch
将服务更新到面向公共的类型(如NodePort
或LoadBalancer
,或使用kubectl port-forward
将本地端口kubectl port-forward
到Grafana Pod端口。
在本教程中,我们将转发端口,但是要了解有关kubectl patch
和Kubernetes服务类型的更多信息,您可以使用官方Kubernetes文档中的kubectl补丁和服务来咨询更新API对象 。
首先列出monitoring
命名空间中正在运行的服务:
kubectl get svc -n monitoring
您应该看到以下服务:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEalertmanager-operated ClusterIP None <none> 9093/TCP,6783/TCP 34mdoks-cluster-monitoring-grafana ClusterIP 10.245.105.130 <none> 80/TCP 34mdoks-cluster-monitoring-kube-state-metrics ClusterIP 10.245.140.151 <none> 8080/TCP 34mdoks-cluster-monitoring-pr-alertmanager ClusterIP 10.245.197.254 <none> 9093/TCP 34mdoks-cluster-monitoring-pr-operator ClusterIP 10.245.14.163 <none> 8080/TCP 34mdoks-cluster-monitoring-pr-prometheus ClusterIP 10.245.201.173 <none> 9090/TCP 34mdoks-cluster-monitoring-prometheus-node-exporter ClusterIP 10.245.72.218 <none> 30206/TCP 34mprometheus-operated ClusterIP None <none> 9090/TCP 34m
我们将把本地端口8000
转发到doks-cluster-monitoring-grafana
服务的端口80
,然后doks-cluster-monitoring-grafana
到正在运行的Grafana Pod的端口3000
。 这些Service和Pod端口在stable/grafana
Helm图表值文件中配置 :
kubectl port-forward -n monitoring svc/doks-cluster-monitoring-grafana 8000:80
您应该看到以下输出:
Forwarding from 127.0.0.1:8000 -> 3000Forwarding from [::1]:8000 -> 3000
这表示本地端口8000
正在成功转发到Grafana Pod。
在Web浏览器中访问http://localhost:8000
。 您应该看到以下Grafana登录页面:
输入admin作为您在custom-values.yaml
配置的用户名和密码。 然后,点击登录 。
您将被带到以下家庭仪表板 :
在左侧导航栏中,选择Dashboards按钮,然后单击Manage :
您将进入以下仪表板管理界面,该界面列出了由prometheus-operator
Helm图表安装的仪表板:
这些仪表板由kubernetes-mixin
生成,这是一个开源项目,允许您创建一组标准化的集群监控Grafana仪表板和Prometheus警报。 要了解更多信息,请咨询Kubernetes Mixin GitHub回购 。
单击Kubernetes / Nodes仪表板,该仪表板显示给定节点的CPU,内存,磁盘和网络使用情况:
描述每个仪表板以及如何使用它来可视化集群的度量数据超出了本教程的范围。 要了解有关分析系统性能的USE方法的更多信息,可以参考Brendan Gregg的“利用率饱和度和误差(USE)方法”页面。 Google的SRE Book是另一个有用的资源,特别是第6章: 监控分布式系统 。 要了解如何构建自己的Grafana仪表板,请查看Grafana的“ 入门”页面。
在下一步中,我们将按照类似的过程连接并探索Prometheus监控系统。
第4步 – 访问Prometheus和Alertmanager
要连接到Prometheus kubectl port-forward
,我们再次必须使用kubectl port-forward
来转发本地端口。 如果您已经完成了对Grafana的探索,可以通过按CTRL-C
关闭端口向前隧道。 或者,您可以打开新的shell和端口转发连接。
首先列出monitoring
命名空间中正在运行的服务:
kubectl get svc -n monitoring
您应该看到以下服务:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEalertmanager-operated ClusterIP None <none> 9093/TCP,6783/TCP 34mdoks-cluster-monitoring-grafana ClusterIP 10.245.105.130 <none> 80/TCP 34mdoks-cluster-monitoring-kube-state-metrics ClusterIP 10.245.140.151 <none> 8080/TCP 34mdoks-cluster-monitoring-pr-alertmanager ClusterIP 10.245.197.254 <none> 9093/TCP 34mdoks-cluster-monitoring-pr-operator ClusterIP 10.245.14.163 <none> 8080/TCP 34mdoks-cluster-monitoring-pr-prometheus ClusterIP 10.245.201.173 <none> 9090/TCP 34mdoks-cluster-monitoring-prometheus-node-exporter ClusterIP 10.245.72.218 <none> 30206/TCP 34mprometheus-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
您应该看到以下输出:
Forwarding from 127.0.0.1:9090 -> 9090Forwarding from [::1]:9090 -> 9090
这表示本地端口9090
正在成功转发到Prometheus Pod。
在Web浏览器中访问http://localhost:9090
。 您应该看到以下Prometheus Graph页面:
从这里,您可以使用Prometheus查询语言PromQL来选择和聚合存储在其数据库中的时间序列度量。 要了解有关PromQL的更多信息,请参阅Prometheus官方文档中的查询Prometheus 。
在“ 表达式”字段中,键入machine_cpu_cores
并单击“ 执行” 。 您应该看到一个时间序列列表,其中包含度量标准machine_cpu_cores
,用于报告给定节点上的CPU核心数。 您可以查看哪个节点生成了度量标准,哪个作业在度量标签中删除了度量标准。
最后,在顶部导航栏中,单击Status ,然后单击Targets以查看Prometheus已配置为scrape的目标列表。 您应该看到与第2步开头描述的监视端点列表对应的目标列表。
要了解有关Promtheus以及如何查询群集指标的更多信息,请参阅Prometheus官方文档 。
我们将按照类似的过程连接到AlertManager,后者管理由Prometheus生成的警报。 您可以通过单击Prometheus顶部导航栏中的“ 警报”来浏览这些警报。
要连接到Alertmanager Pod,我们将再次使用kubectl port-forward
转发本地端口。 如果您已经完成了探索Prometheus,可以通过按CTRL-C
关闭端口前向隧道。 或者,您可以打开新的shell和端口转发连接。
首先列出monitoring
命名空间中正在运行的服务:
kubectl get svc -n monitoring
您应该看到以下服务:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEalertmanager-operated ClusterIP None <none> 9093/TCP,6783/TCP 34mdoks-cluster-monitoring-grafana ClusterIP 10.245.105.130 <none> 80/TCP 34mdoks-cluster-monitoring-kube-state-metrics ClusterIP 10.245.140.151 <none> 8080/TCP 34mdoks-cluster-monitoring-pr-alertmanager ClusterIP 10.245.197.254 <none> 9093/TCP 34mdoks-cluster-monitoring-pr-operator ClusterIP 10.245.14.163 <none> 8080/TCP 34mdoks-cluster-monitoring-pr-prometheus ClusterIP 10.245.201.173 <none> 9090/TCP 34mdoks-cluster-monitoring-prometheus-node-exporter ClusterIP 10.245.72.218 <none> 30206/TCP 34mprometheus-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
您应该看到以下输出:
Forwarding from 127.0.0.1:9093 -> 9093Forwarding from [::1]:9093 -> 9093
这表示本地端口9093
正在成功转发到Alertmanager Pod。
在Web浏览器中访问http://localhost:9093
。 您应该看到以下Alertmanager Alerts页面:
从这里,您可以探索触发警报并可选择使其静音。 要了解有关Alertmanager的更多信息,请参阅官方Alertmanager文档 。
结论
在本教程中,您使用一组标准仪表板,Prometheus规则和警报将Prometheus,Grafana和Alertmanager监控安装到DigitalOcean Kubernetes集群中。 由于这是使用Helm完成的,因此您可以使用helm upgrade
, helm rollback
和helm delete
来升级,回滚或删除监视。 要了解有关这些功能的更多信息,请参阅如何使用Helm软件包管理器在Kubernetes集群上安装软件 。
prometheus-operator
图表可帮助您使用Helm快速启动和运行群集监控。 您可能希望手动构建,部署和配置Prometheus Operator。 为此,请咨询Prometheus操作员和kube-prometheus GitHub回购。