如何使用Helm和Prometheus算子设置DigitalOcean Kubernetes群集监控

除跟踪和日志记录外,监视和警报是Kubernetes可观察性的重要组成部分。通过为Kubernetes集群设置监视,您可以深入了解资源使用情况,并帮助您分析和调试应用程序错误。一个...

介绍

除跟踪和日志记录外,监视和警报是Kubernetes可观察性的重要组成部分。 通过为Kubernetes群集设置监视,您可以跟踪资源使用情况并分析和调试应用程序错误。

监控系统通常由包含度量数据的时间序列数据库和可视化层组成。 此外,警报层可以创建和管理警报,并根据需要将警报交给集成和外部服务。 最后,一个或多个组件生成或公开将由该监视存储,可视化和处理警报的度量数据。

一种流行的监控解决方案是开源的PrometheusGrafanaAlertmanager

  • Prometheus是一个时间序列数据库和监视工具,它通过轮询指标端点并抓取和处理这些端点公开的数据来工作。 它允许您使用时间序列数据查询语言PromQL查询此数据。
  • Grafana是一种数据可视化和分析工具,允许您为指标数据构建仪表板和图表。
  • Alertmanager通常与Prometheus一起部署,形成的警报层,处理由Prometheus生成的警报,并对它们进行重复数据删除,分组和路由,以及电子邮件或PagerDuty等集成。

此外,诸如kube-state-metricsnode_exporter之类的工具公开集群级Kubernetes对象指标以及CPU和内存使用等机器级指标。

在Kubernetes集群上实现此监视可能很复杂,但幸运的是,可以使用Helm包管理器和CoreOS的Prometheus Operator以及kube-prometheus项目来管理其中一些复杂性。 这些项目在Prometheus和Grafana的标准配置和仪表板中烘焙,并抽象出一些较低级别的Kubernetes对象定义。 Helm prometheus-operator图表允许您通过安装Prometheus Operator和上面列出的其他组件以及用于监控Kubernetes集群的一组默认仪表板,规则和警报来启动并运行完整的集群监控解决方案。

在本教程中,我们将演示如何在DigitalOcean Kubernetes集群上安装prometheus-operator Helm图表。 在本教程结束时,您将在群集中安装完整的监视。

先决条件

要学习本教程,您需要:

第1步 - 创建自定义值文件

在我们安装prometheus-operator Helm图表之前,我们将创建一个自定义值文件,该文件将使用特定于DigitalOcean的配置参数覆盖某些图表的默认值。 要了解有关覆盖默认图表值的更多信息,请参阅Helm文档的Helm Install部分。

首先,使用nano或您喜欢的编辑器在本地计算机上创建并打开名为custom-values.yaml的文件:

nano custom-values.yaml

复制并粘贴以下自定义值,这些自定义值为Prometheus,Grafana和Alertmananger组件启用持久存储,并禁用对未在DigitalOcean Kubernetes上公开的Kubernetes控制平面组件的监视:

定制values.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 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-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检查发行版kubectl get pods

kubectl --namespace monitoring get pods -l "release=doks-cluster-monitoring"

你应该看到以下内容:

NAME                                                         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 chart将Grafana公开为ClusterIP服务,这意味着它只能通过集群内部IP地址访问。 要在Kubernetes集群之外访问Grafana,您可以使用kubectl patch将服务更新到面向公共的类型(如NodePortLoadBalancer ,或使用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)             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 ,然后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 -> 3000
Forwarding from [::1]:8000 -> 3000

这表示本地端口8000正在成功转发到Grafana Pod。

在Web浏览器中访问http://localhost:8000 您应该看到以下Grafana登录页面:

Grafana登录页面

输入admin作为您在custom-values.yaml配置的用户名和密码。 然后,点击登录

您将被带到以下家庭仪表板

Grafana主页

在左侧导航栏中,选择Dashboards按钮,然后单击Manage

Grafana仪表板选项卡

您将进入以下仪表板管理界面,该界面列出了由prometheus-operator Helm图表安装的仪表板:

Grafana仪表板列表

这些仪表板由kubernetes-mixin生成,这是一个开源项目,允许您创建一组标准化的集群监控Grafana仪表板和Prometheus警报。 要了解更多信息,请咨询Kubernetes Mixin GitHub回购

单击Kubernetes / Nodes仪表板,该仪表板显示给定节点的CPU,内存,磁盘和网络使用情况:

Grafana节点仪表板

描述每个仪表板以及如何使用它来可视化集群的度量数据超出了本教程的范围。 要了解有关分析系统性能的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)             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

您应该看到以下输出:

Forwarding from 127.0.0.1:9090 -> 9090
Forwarding from [::1]:9090 -> 9090

这表示本地端口9090正在成功转发到Prometheus Pod。

在Web浏览器中访问http://localhost:9090 您应该看到以下Prometheus Graph页面:

Prometheus图页

从这里,您可以使用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)             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

我们要将本地端口9093doks-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 -> 9093
Forwarding from [::1]:9093 -> 9093

这表示本地端口9093正在成功转发到Alertmanager Pod。

在Web浏览器中访问http://localhost:9093 您应该看到以下Alertmanager Alerts页面:

Alertmanager警报页面

从这里,您可以探索触发警报并可选择使其静音。 要了解有关Alertmanager的更多信息,请参阅官方Alertmanager文档

结论

在本教程中,您使用一组标准仪表板,Prometheus规则和警报将Prometheus,Grafana和Alertmanager监控安装到DigitalOcean Kubernetes集群中。 由于这是使用Helm完成的,因此您可以使用helm upgradehelm rollbackhelm delete来升级,回滚或删除监视。 要了解有关这些功能的更多信息,请参阅如何使用Helm软件包管理器在Kubernetes集群上安装软件

prometheus-operator图表可帮助您使用Helm快速启动和运行群集监控。 您可能希望手动构建,部署和配置Prometheus Operator。 为此,请咨询Prometheus操作员kube-prometheus GitHub回购。