如何在Kubernetes上安装Prometheus并将其用于监控

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
可观测监控 Prometheus 版,每月50GB免费额度
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 如何在Kubernetes上安装Prometheus并将其用于监控

介绍

Prometheus是一个开源的仪器框架,可以每秒吸收大量数据。该属性使普罗米修斯非常适合监控复杂的工作负载。

使用Prometheus监控您的服务器虚拟机数据库,并利用这些数据来分析应用程序和基础设施的性能。

本文解释了如何在Kubernetes集群中安装和设置Prometheus监控。

先决条件

  • Kubernetes集群
  • 本地机器上完全配置的kubectl命令行界面

在Kubernetes上安装Prometheus监控

Prometheus监控可以通过使用一组YAML(但另一种标记语言)文件安装在Kubernetes集群上。这些文件包含配置、权限和服务,允许普罗米修斯通过抓取集群的元素来访问资源和提取信息。

YAML文件易于跟踪、编辑,并且可以无限期重用。

注意:以下的.yaml文件,以其当前形式,不打算在生产环境中使用。相反,您应该调整这些文件,以适应您的系统要求。

第1步:创建监控命名空间

Kubernetes中的所有资源都是在命名空间中启动的。除非指定一个,否则系统使用默认命名空间。为了更好地控制集群监控过程,请指定一个监控命名空间。

命名空间的名称需要与DNS兼容的标签。为了便于参考,我们将命名命名空间:monitor

有两种方法可以创建监控命名空间,以便从Kubernetes API检索指标。

选项1:

在命令行界面中输入此简单命令,并在主机上创建监控命名空间:

kubectl create namespace monitoring

输出确认命名空间的创建。

选项2:

1.创建并应用一个.yml文件:

apiVersion: v1
kind: Namespace
metadata:
  name: monitoring

此方法很方便,因为您可以在未来的实例中部署相同的文件。

2. 通过在命令终端中输入以下命令,将文件应用于集群:

kubectl -f apply namespace monitoring.yml

3.使用以下命令列出现有的命名空间:

kubectl get ns

注意:了解如何删除Kubernetes命名空间

第2步:创建持久卷和持久卷索赔

Prometheus的部署需要专用存储空间来存储刮擦数据。满足这一要求的一个实用方法是将普罗米修斯部署连接到NFS卷。以下是为普罗米修斯创建NFS卷并通过持久卷将其纳入部署的过程。

1.在您的主系统上安装NFS服务器。

sudo apt install nfs-kernel-server

2.创建一个目录以与普罗米修斯一起使用。

sudo mkdir -p /mnt/nfs/promdata

3.更改目录的所有权。

sudo chown nobody:nogroup /mnt/nfs/promdata

4.更改目录的权限。

sudo chmod 777 /mnt/nfs/promdata

5.使用文本编辑器(如nano)创建一个.yaml文件:

nano pv-pvc.yaml

6.将以下配置粘贴到文件中。调整参数以适应您的系统。spec.nfs.server字段应与您安装NFS的系统的IP地址相对应。

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-nfs-data
  namespace: monitoring
  labels:
    type: nfs
    app: prometheus-deployment
spec:
  storageClassName: managed-nfs
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany
  nfs:
    server: 192.168.49.1
    path: "/mnt/nfs/promdata"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-nfs-data
  namespace: monitoring
  labels:
    app: prometheus-deployment
spec:
  storageClassName: managed-nfs
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 500Mi

存储文件并退出。

7.使用kubectl应用配置。

kubectl apply -f pv-pvc.yaml

第3步:创建集群角色、服务帐户和集群角色绑定

命名空间旨在限制默认角色的权限。因此,如果我们想检索全集群数据,我们需要让普罗米修斯访问所有集群资源。

以下步骤解释了如何创建和应用一组基本的.yaml文件,为普罗米修斯提供集群范围的访问权限。

1.为集群角色定义创建一个文件。

nano cluster-role.yaml

2.复制以下配置,并根据您的需求进行调整。每条规则上的动词定义了角色可以对apiGroups采取的行动。

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: prometheus
rules:
- apiGroups: [""]
  resources:
  - nodes
  - services
  - endpoints
  - pods
  verbs: ["get", "list", "watch"]
- apiGroups:
  - extensions
  resources:
  - ingresses
  verbs: ["get", "list", "watch"]

存储文件并退出。

3.应用文件。

kubectl apply -f cluster-role.yaml

4.创建一个服务帐户文件。

nano service-account.yaml

5.复制以下配置以定义服务帐户。

apiVersion: v1
kind: ServiceAccount
metadata:
  name: prometheus
  namespace: monitoring

存储文件并退出。

6.应用文件。

kubectl apply -f service-account.yaml

7.在文本编辑器中创建另一个文件:

nano cluster-role-binding.yaml

8. 定义ClusterRoleBinding。此操作将把服务帐户绑定到之前创建的集群角色。

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: prometheus
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: prometheus
subjects:
- kind: ServiceAccount
  name: prometheus
  namespace: monitoring

存储文件并退出。

9.最后,用kubectl应用绑定。

kubectl apply -f cluster-role-binding.yaml

通过将这些资源添加到我们的文件中,我们从监控命名空间授予了普罗米修斯集群范围的访问权限。

第4步:创建普罗米修斯ConfigMap

文件的这一部分提供了刮擦过程的说明。Kubernetes集群每个元素的具体说明应自定义,以匹配单个监控要求和集群设置。

本文中的示例使用一个简单的ConfigMap,定义了刮擦和评估间隔、作业和目标。

1.在文本编辑器中创建文件。

nano configmap.yaml

2.复制以下配置。

apiVersion: v1
kind: ConfigMap
metadata:
  name: prometheus-config
  namespace: monitoring
data:
  prometheus.yml: |
    global:
      scrape_interval:     15s
      evaluation_interval: 15s
    alerting:
      alertmanagers:
      - static_configs:
        - targets:
    rule_files:
      # - "example-file.yml"
    scrape_configs:
      - job_name: 'prometheus'
        static_configs:
        - targets: ['localhost:9090']

存储文件并退出。

3.使用kubectl应用ConfigMap。

kubectl apply -f configmap.yaml

虽然上述配置足以创建测试普罗米修斯部署,但ConfigMaps通常会提供进一步的配置详细信息。以下部分讨论了您可以包含在文件中的其他一些选项。

刮擦节点

此服务发现公开了构成Kubernetes集群的节点。kubelet在每个节点上运行,是有价值的信息来源。

Scrape 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.

刮擦 cAdvisor(容器级别信息)

kubelet只提供有关自身的信息,而不是容器的信息。要从容器级别接收信息,我们需要使用出口商。cAdvisor已经嵌入,只需要ametrics_path/metrics/cadvisor,普罗米修斯收集容器数据:

- 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

Scrape API服务器

使用端点角色来定位每个应用程序实例。文件的这一部分允许您在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

Kubernetes服务的刮擦豆荚(不包括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

Pod角色

使用容器名称作为作业标签,发现所有带有名称指标的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

第5步:创建普罗米修斯部署文件

部署.yaml定义了应用于定义的pod集的副本和模板的数量。该文件还连接了之前文件中定义的元素,如PV和PVC。

1.创建一个文件来存储部署配置。

nano deployment.yaml

2.复制以下示例配置,并根据您的需求进行调整。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: prometheus
  namespace: monitoring
  labels:
    app: prometheus
spec:
  replicas: 1
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
    type: RollingUpdate
  selector:
    matchLabels:
      app: prometheus
  template:
    metadata:
      labels:
        app: prometheus
      annotations:
        prometheus.io/scrape: "true"
        prometheus.io/port: "9090"
    spec:
      containers:
      - name: prometheus
        image: prom/prometheus
        args:
          - '--storage.tsdb.retention=6h'
          - '--storage.tsdb.path=/prometheus'
          - '--config.file=/etc/prometheus/prometheus.yml'
        ports:
        - name: web
          containerPort: 9090
        volumeMounts:
        - name: prometheus-config-volume
          mountPath: /etc/prometheus
        - name: prometheus-storage-volume
          mountPath: /prometheus
      restartPolicy: Always
      volumes:
      - name: prometheus-config-volume
        configMap:
            defaultMode: 420
            name: prometheus-config
      - name: prometheus-storage-volume
        persistentVolumeClaim:
            claimName: pvc-nfs-data

保存并退出。

3.使用以下命令部署普罗米修斯。

kubectl apply -f deployment.yaml

第6步:创建普罗米修斯服务

Prometheus目前正在集群中运行。按照程序创建服务并获得普罗米修斯收集的数据的访问权限:

1.创建一个.yaml来存储与服务相关的数据。

nano service.yaml

2.定义文件中的服务。

apiVersion: v1
kind: Service
metadata:
    name: prometheus-service
    namespace: monitoring
    annotations:
        prometheus.io/scrape: 'true'
        prometheus.io/port:   '9090'
spec:
    selector:
        app: prometheus
    type: NodePort
    ports:
    - port: 8080
      targetPort: 9090
      nodePort: 30909

存储文件并退出。

3.使用kubectl apply创建服务。

kubectl apply -f service.yaml

用普罗米修斯监控Kubernetes集群

Prometheus是一个基于拉的系统。它根据部署文件中定义的配置发送HTTP请求,即所谓的scrape。对此scrape请求的响应与刮擦本身的指标一起存储和解析。

该存储是普罗米修斯服务器上的自定义数据库,可以处理大量数据流入。可以使用一台普罗米修斯服务器同时监控数千台机器。

注:随着数据的输入,磁盘空间可能会很快成为问题。收集的数据具有很大的短期价值。如果您计划保存大量长期记录,最好提供额外的持久存储卷

数据需要适当公开和格式化,以便普罗米修斯可以收集数据。Prometheus可以直接从应用程序的客户端库或使用出口商访问数据。

出口商用于您无法完全控制的数据(例如,内核指标)。出口商是放置在应用程序旁边的软件。其目的是接受来自普罗米修斯的HTTP请求,确保数据以受支持的格式提供,然后将请求的数据提供给普罗米修斯服务器。

一旦您装备了应用程序向普罗米修斯提供数据,您需要通知普罗米修斯在哪里查找该数据。普罗米修斯通过使用服务发现发现发现可以刮掉的目标。

Kubernetes集群已经有了标签和注释,以及跟踪变化及其元素状态的绝佳机制。因此,普罗米修斯使用Kubernetes API来发现目标。

您可以向普罗米修斯暴露的Kubernetes服务发现是:

  • 节点
  • 端点
  • 服务
  • 豆荚
  • 进入

Prometheus将机器级指标与应用程序信息分开检索。公开内存、磁盘空间、CPU使用情况带宽指标的唯一方法是使用节点导出器。此外,关于cgroups的指标也需要公开。

幸运的是,cAdvisor导出器已经嵌入在Kubernetes节点级别,并且可以随时暴露。

一旦系统收集数据,您可以使用PromQL查询语言访问它,将其导出到Graphal界面,如Grafana,或使用它与Alertmanager发送警报。

访问普罗米修斯监控

确保所有相关元素在监控命名空间中正常运行:

kubectl get all -n monitoring

使用service.yaml文件中定义的单个节点URL和nodePort从浏览器访问Prometheus。例如:

http://192.153.99.106:30909

通过输入节点的URL或IP,并通过从.yaml文件中指定端口,您已成功访问Prometheus Monitoring。

注意:如果您需要一个全面的仪表板系统来绘制普罗米修斯收集的指标,可用的选项之一是Grafana。它使用数据源检索用于创建图表的信息。

如何监控立方体状态度量?(可选)

您现在可以完全监控您的Kubernetes基础架构以及应用程序实例。然而,这不包括Kubernetes拥有的关于集群中资源的信息的指标。

kube-state-metrics是一个允许普罗米修斯也抓取该信息的出口商。

1.为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

2.通过输入以下命令来应用文件:

kubectl apply -f kube-state-metrics.yml

应用文件后,通过输入节点IP/URL和之前定义的nodePort来访问普罗米修斯。

结论

现在您已在Kubernetes集群上成功安装了Prometheus Monitoring,您可以跟踪系统的整体运行状况、性能和行为。

无论您的操作多么庞大和复杂,普罗米修斯等基于指标的监控系统都是维护基于分布式微服务的架构的重要DevOps工具

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
11天前
|
Prometheus Kubernetes 监控
k8s部署针对外部服务器的prometheus服务
通过上述步骤,您不仅成功地在Kubernetes集群内部署了Prometheus,还实现了对集群外服务器的有效监控。理解并实施网络配置是关键,确保监控数据的准确无误传输。随着监控需求的增长,您还可以进一步探索Prometheus生态中的其他组件,如Alertmanager、Grafana等,以构建完整的监控与报警体系。
104 60
|
12天前
|
Prometheus Kubernetes 监控
k8s部署针对外部服务器的prometheus服务
通过上述步骤,您不仅成功地在Kubernetes集群内部署了Prometheus,还实现了对集群外服务器的有效监控。理解并实施网络配置是关键,确保监控数据的准确无误传输。随着监控需求的增长,您还可以进一步探索Prometheus生态中的其他组件,如Alertmanager、Grafana等,以构建完整的监控与报警体系。
109 62
|
5天前
|
Kubernetes Ubuntu Docker
从0开始搞K8S:使用Ubuntu进行安装(环境安装)
通过上述步骤,你已经在Ubuntu上成功搭建了一个基本的Kubernetes单节点集群。这只是开始,Kubernetes的世界广阔且深邃,接下来你可以尝试部署应用、了解Kubernetes的高级概念如Services、Deployments、Ingress等,以及探索如何利用Helm等工具进行应用管理,逐步提升你的Kubernetes技能树。记住,实践是最好的老师,不断实验与学习,你将逐渐掌握这一强大的容器编排技术。
17 1
|
15天前
|
Kubernetes Linux 开发工具
centos7通过kubeadm安装k8s 1.27.1版本
centos7通过kubeadm安装k8s 1.27.1版本
|
17天前
|
Kubernetes Docker 容器
rancher docker k8s安装(一)
rancher docker k8s安装(一)
30 2
|
17天前
|
Kubernetes 网络安全 容器
基于Ubuntu-22.04安装K8s-v1.28.2实验(一)部署K8s
基于Ubuntu-22.04安装K8s-v1.28.2实验(一)部署K8s
44 2
|
17天前
|
存储 Kubernetes 负载均衡
基于Ubuntu-22.04安装K8s-v1.28.2实验(四)使用域名访问网站应用
基于Ubuntu-22.04安装K8s-v1.28.2实验(四)使用域名访问网站应用
18 1
|
17天前
|
负载均衡 应用服务中间件 nginx
基于Ubuntu-22.04安装K8s-v1.28.2实验(二)使用kube-vip实现集群VIP访问
基于Ubuntu-22.04安装K8s-v1.28.2实验(二)使用kube-vip实现集群VIP访问
36 1
|
17天前
|
Kubernetes Docker 容器
rancher docker k8s安装(二)
rancher docker k8s安装(二)
25 0
|
17天前
|
Kubernetes 容器
基于Ubuntu-22.04安装K8s-v1.28.2实验(三)数据卷挂载NFS(网络文件系统)
基于Ubuntu-22.04安装K8s-v1.28.2实验(三)数据卷挂载NFS(网络文件系统)
77 0