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 提供数据。我们仍然需要通知 Prometheus 去哪里寻找这些数据。Prometheus 使用Service Discovery发现要抓取的目标。
你的 Kubernetes 集群已经拥有标签和注释,以及用于跟踪更改及其元素状态的出色机制。因此,Prometheus 使用 Kubernetes API 来发现目标。
你可以向 Prometheus 公开的 Kubernetes 服务发现包括:
- node
- endpoint
- service
- pod
- ingress
Prometheus 从应用程序信息中单独检索机器级指标。公开内存、磁盘空间、CPU 使用率和带宽指标的唯一方法是使用节点导出器。此外,还需要公开有关 cgroup 的指标。
幸运的是,cAdvisor 导出器已经嵌入到 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 服务器提交请求。该文件包含:
- 允许 Prometheus 访问所有 pod 和节点的权限。
- 定义应废弃哪些元素的 Prometheus configMap。
- Prometheus 部署说明。
- 一种服务,可让你访问 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 集群的每个元素的具体说明应该进行定制,以匹配你的监控要求和集群设置。
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 收集的指标,可用选项之一是 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?现在你已在 Kubernetes 集群上成功安装 Prometheus Monitoring,你可以跟踪系统的整体运行状况、性能和行为。无论你的操作有多么庞大和复杂,Prometheus 等基于指标的监控系统都是用于维护基于分布式微服务的架构的重要 DevOps 工具。