如何使用Prometheus监控Kubernetes(分步指南)

Prometheus监控Kubernetes教程介绍Prometheus 是一个开源的仪器框架。Prometheus 每秒可以吸收大量数据,非常适合复杂的工作负载。
使用 Prometheus监控你的服务器、VM、数据库,并利用这些数据来分析你的应用程序和基础架构的性能。
如何使用Prometheus监控Kubernetes?本文介绍了如何在 Kubernetes 集群中设置 Prometheus 监控。
先决条件

  • Kubernetes 集群
  • kubectl本地计算机上完全配置的命令行界面
使用 Prometheus 监控 Kubernetes 集群Prometheus 是一个基于拉的系统。它scrape根据部署文件中定义的配置发送 HTTP 请求,即所谓的。对此scrape请求的响应与抓取本身的指标一起存储并解析在存储中。
存储是 Prometheus 服务器上的自定义数据库,可以处理大量涌入的数据。可以使用单个服务器同时监控数千台机器。
注意:随着大量数据的进入,磁盘空间很快就会成为一个问题。收集到的数据具有很大的短期价值。如果你计划保留大量的长期记录,则配置额外的持久存储卷可能是个好主意。
数据需要适当地公开和格式化,以便 Prometheus 可以收集它。Prometheus 可以直接从应用程序的客户端库或使用导出器访问数据。
Prometheus如何监控Kubernetes?导出器用于你无法完全控制的数据(例如,内核指标)。导出器是放置在你的应用程序旁边的一个软件。其目的是接受来自 Prometheus 的 HTTP 请求,确保数据采用支持的格式,然后将请求的数据提供给 Prometheus 服务器。
如何使用Prometheus监控Kubernetes(分步指南)

文章图片
你的所有应用程序现在都可以向 Prometheus 提供数据。我们仍然需要通知 Prometheus 去哪里寻找这些数据。Prometheus 使用Service Discovery发现要抓取的目标。
你的 Kubernetes 集群已经拥有标签和注释,以及用于跟踪更改及其元素状态的出色机制。因此,Prometheus 使用 Kubernetes API 来发现目标。
你可以向 Prometheus 公开的 Kubernetes 服务发现包括:
  • node
  • endpoint
  • service
  • pod
  • ingress
Prometheus 从应用程序信息中单独检索机器级指标。公开内存、磁盘空间、CPU 使用率和带宽指标的唯一方法是使用节点导出器。此外,还需要公开有关 cgroup 的指标。
幸运的是,cAdvisor 导出器已经嵌入到 Kubernetes 节点级别并且可以很容易地暴露出来。
如何使用Prometheus监控Kubernetes(分步指南)

文章图片
系统收集数据后,你可以使用 PromQL 查询语言访问它,将其导出到Grafana 等图形界面,或使用它通过Alertmanager发送警报  。
在 Kubernetes 上安装 Prometheus Monitoring如何使用Prometheus监控Kubernetes?Prometheus 监控可以通过使用一组 YAML(另一种标记语言)文件安装在 Kubernetes 集群上。这些文件包含允许 Prometheus 通过抓取集群元素来访问资源和拉取信息的配置、权限和服务。
YAML 文件易于跟踪、编辑,并且可以无限期地重复使用。本教程中提供的文件可以在 GitHub 等在线存储库中轻松免费获得。
注意:下面的.yml文件以其当前形式不打算在生产环境中使用。相反,你应该充分编辑这些文件以满足你的系统要求。
创建监控命名空间
Prometheus如何监控Kubernetes?Kubernetes 中的所有资源都在一个命名空间中启动。除非指定一个,否则系统使用默认命名空间。为了更好地控制集群监控过程,我们将指定一个监控命名空间。
命名空间的名称需要是与 DNS 兼容的标签。为了便于参考,我们将命名空间命名为:monitoring
有两种方法可以创建用于从 Kubernetes API 检索指标的监控命名空间。
选项1:
在你的命令行界面中输入这个简单的命令并在你的主机上创建监控命名空间:
kubectl create namespace monitoring

选项 2:
创建并应用 .yml 文件:
apiVersion: v1 kind: Namespace metadata: name: monitoring

这种方法很方便,因为你可以在以后的实例中部署相同的文件。通过在命令终端中输入以下命令,将文件应用到集群:
kubectl -f apply namespace monitoring.yml

无论使用何种方法,请使用以下命令列出现有命名空间:
kubectl get namespaces

Prometheus监控Kubernetes教程:配置 Prometheus 部署文件以下部分包含在 Kubernetes 集群及其元素上成功设置 Prometheus 抓取的必要元素。
这些部分可以实现为按顺序执行的单独.yml文件。创建每个文件后,可以通过输入以下命令来应用它:
kubectl -f apply [ name_of_file].yml

在此示例中,所有元素都放置在一个.yml文件中并同时应用。
我们示例中的prometheus.yml文件指示kubectl向 Kubernetes API 服务器提交请求。该文件包含:
  1. 允许 Prometheus 访问所有 pod 和节点的权限。
  2. 定义应废弃哪些元素的 Prometheus  configMap。
  3. Prometheus 部署说明。
  4. 一种服务,可让你访问 Prometheus 用户界面。
集群角色、服务账号和集群角色绑定
Prometheus如何监控Kubernetes?命名空间旨在限制默认角色的权限,如果我们想要检索集群范围的数据,我们需要让 Prometheus 访问该集群的所有资源。提供集群范围访问的基本 Prometheus .yml 文件具有以下元素:
1. 定义集群角色
每个规则上的动词定义了角色可以对 apiGroups 采取的操作。
apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRole metadata: name: prometheus rules: - apiGroups: [ ""] resources: - nodes - services - endpoints - pods verbs: [ "get", "list", "watch"] - apiGroups: - extensions resources: - ingresses verbs: [ "get", "list", "watch"]

2. 创建服务帐号
此外,我们需要创建一个服务帐户以将此角色应用于:
apiVersion: v1 kind: ServiceAccount metadata: name: prometheus namespace: monitoring

3. 应用 ClusterRoleBinding
最后,我们需要应用一个ClusterRoleBinding。此操作会将服务帐户绑定到之前创建的集群角色。
apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRoleBinding metadata: name: prometheus roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: prometheus subjects: - kind: ServiceAccount name: prometheus namespace: monitoring

通过将这些资源添加到我们的文件中,我们授予了 Prometheus 集群范围内监控命名空间的访问权限。
Prometheus ConfigMap配置映射
如何使用Prometheus监控Kubernetes?文件的这一部分提供了抓取过程的说明。Kubernetes 集群的每个元素的具体说明应该进行定制,以匹配你的监控要求和集群设置。
如何使用Prometheus监控Kubernetes(分步指南)

文章图片
1. 全局抓取规则
apiVersion: v1 data: prometheus.yml: | global: scrape_interval: 10s

2. 抓取节点此服务发现公开构成 Kubernetes 集群的节点。kubelet 运行在每个节点上,是有价值信息的来源。
2.1 抓取 kubelet
scrape_configs: - job_name: 'kubelet' kubernetes_sd_configs: - role: node scheme: https tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt insecure_skip_verify: true# Required with Minikube.

2.2 Scrape cAdvisor(容器级信息)
Prometheus如何监控Kubernetes?该kubelet只提供约本身,而不是容器的信息。要从容器级别接收信息,我们需要使用导出器。所述cAdvisor已经嵌入且仅需要一个metrics_path:/度量/ cadvisor为Prometheus收集容器数据:
- job_name: 'cadvisor' kubernetes_sd_configs: - role: node scheme: https tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt insecure_skip_verify: true# Required with Minikube. metrics_path: /metrics/cadvisor

3. 抓取 APIServer使用端点角色定位每个应用程序实例。文件的这一部分允许你在 Kubernetes 集群中抓取 API 服务器。
- job_name: 'k8apiserver' kubernetes_sd_configs: - role: endpoints scheme: https tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt insecure_skip_verify: true# Required if using Minikube. bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token relabel_configs: - source_labels: [ __meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name] action: keep regex: default; kubernetes; https

4. 为 Kubernetes 服务抓取 Pod(不包括 API 服务器)删除支持所有 Kubernetes 服务的 pod,并忽略 API 服务器指标。
- job_name: 'k8services' kubernetes_sd_configs: - role: endpoints relabel_configs: - source_labels: - __meta_kubernetes_namespace - __meta_kubernetes_service_name action: drop regex: default; kubernetes - source_labels: - __meta_kubernetes_namespace regex: default action: keep - source_labels: [ __meta_kubernetes_service_name] target_label: job

5. Pod Role通过使用容器名称作为作业标签,发现具有名称指标的所有 pod 端口。
- job_name: 'k8pods' kubernetes_sd_configs: - role: pod relabel_configs: - source_labels: [ __meta_kubernetes_pod_container_port_name] regex: metrics action: keep - source_labels: [ __meta_kubernetes_pod_container_name] target_label: job kind: ConfigMap metadata: name: prometheus-config

6. 配置副本集定义你需要的副本数量,以及要应用于定义的 pod 集的模板。
apiVersion: apps/v1beta2 kind: Deployment metadata: name: prometheus spec: selector: matchLabels: app: prometheus replicas: 1 template: metadata: labels: app: prometheus spec: serviceAccountName: prometheus containers: - name: prometheus image: prom/prometheus:v2.1.0 ports: - containerPort: 9090 name: default volumeMounts: - name: config-volume mountPath: /etc/prometheus volumes: - name: config-volume configMap: name: prometheus-config

7.定义节点端口如何使用Prometheus监控Kubernetes?Prometheus 当前正在集群中运行。将以下部分添加到我们的prometheus.yml文件将使我们能够访问 Prometheus 收集的数据。
kind: Service apiVersion: v1 metadata: name: prometheus spec: selector: app: prometheus type: LoadBalancer ports: - protocol: TCP port: 9090 targetPort: 9090 nodePort: 30909

Prometheus监控Kubernetes教程:应用 prometheus.yml 文件文件中定义的配置映射为部署中的每个 pod 提供配置数据:
kubectl apply -f prometheus.yml

使用prometheus.yml文件中定义的单个节点 URL 和 nodePort从浏览器访问 Prometheus。例如:
http:/ / 192.153.99.106:30909

通过输入你节点的 URL 或 IP,并从 yml 文件中指定端口,你已成功获得对 Prometheus Monitoring 的访问权限。
如何使用Prometheus监控Kubernetes(分步指南)

文章图片
注意:如果你需要一个全面的仪表板系统来绘制 Prometheus 收集的指标,可用选项之一是 Grafana。它使用数据源来检索用于创建图形的信息。
如何监控 kube-state-metrics?(可选的)Prometheus如何监控Kubernetes?你现在可以完全监控你的 Kubernetes 基础设施以及你的应用程序实例。但是,这不包括 Kubernetes 拥有的有关集群中资源的信息的指标。
kube-state-metrics 是一个导出器,它允许 Prometheus 也抓取该信息。为 kube-state-metrics 导出器创建一个 YAML 文件:
--- apiVersion: apps/v1beta2 kind: Deployment metadata: name: kube-state-metrics spec: selector: matchLabels: app: kube-state-metrics replicas: 1 template: metadata: labels: app: kube-state-metrics spec: serviceAccountName: prometheus containers: - name: kube-state-metrics image: quay.io/coreos/kube-state-metrics:v1.2.0 ports: - containerPort: 8080 name: monitoring --- kind: Service apiVersion: v1 metadata: name: kube-state-metrics spec: selector: app: kube-state-metrics type: LoadBalancer ports: - protocol: TCP port: 8080 targetPort: 8080

通过输入以下命令应用该文件:
kubectl apply -f kube-state-metrics.yml

应用该文件后,通过输入节点 IP/URL 和之前定义的 nodePort 来访问 Prometheus。
Prometheus监控Kubernetes教程结论【如何使用Prometheus监控Kubernetes(分步指南)】如何使用Prometheus监控Kubernetes?现在你已在 Kubernetes 集群上成功安装 Prometheus Monitoring,你可以跟踪系统的整体运行状况、性能和行为。无论你的操作有多么庞大和复杂,Prometheus 等基于指标的监控系统都是用于维护基于分布式微服务的架构的重要 DevOps 工具。

    推荐阅读