Déploiement du système de surveillance et d'alerte prometheus dans k8s - le premier article d'une série prometheus

Préface

Cet article présente principalement le déploiement de prometheus dans le cluster k8s, et configure la découverte de services dynamiques et statiques de prometheus, réalise le suivi des indicateurs de ressources tels que les conteneurs, les nœuds physiques, les services, les pods et configure l'interface web ui de prometheus. Le prochain article suivra cette introduction Grafana et Alertmanager, et affichera les indicateurs de surveillance prometheus sur l'interface Web Grafana, puis surveillera et émettra une alarme via alertmanager.

Introduction à Prométhée

Prometheus est un système open source de surveillance et d'alarme. Il a maintenant rejoint la Fondation CNCF et est devenu le deuxième projet hébergé par la CNCF après k8s. Dans le système de gestion de conteneurs kubernetes, prometheus est généralement utilisé pour la surveillance, et il prend également en charge plusieurs. type d'exportateur collecte des données et prend également en charge pushgateway pour la communication des données.Les performances de Prometheus sont suffisantes pour prendre en charge des dizaines de milliers de clusters.

Fonctionnalités de Prometheus

1. Modèle de données multidimensionnel


Les données de séries chronologiques sont composées de paires nom / clé / valeur de métrique. Les données peuvent être agrégées, coupées et d'autres opérations. Toutes les métriques peuvent être définies avec des étiquettes multidimensionnelles arbitraires.

2. Langage de requête flexible (PromQL)

Ajoutez, multipliez et connectez les métriques collectées;

3. Il peut être déployé directement localement sans s'appuyer sur un autre stockage distribué;

4. Collectez des données de séries chronologiques via la méthode pull basée sur HTTP;

5. Les données de la série chronologique peuvent être transmises au serveur prometheus via la passerelle intermédiaire de la passerelle;

6. Les objets de service cibles (cibles) peuvent être découverts via la découverte de services ou la configuration statique.

7. Il existe une variété d'interfaces d'images visuelles, telles que Grafana et ainsi de suite.

8. Stockage efficace, chaque donnée échantillonnée occupe environ 3,5 octets, 3 millions de séries chronologiques, intervalle de 30 s, rétention pendant 60 jours et consomme environ 200 Go de disque.

Introduction aux composants prometheus

1. Prometheus Server : utilisé pour collecter et stocker des données de séries chronologiques.

2. Bibliothèque client: la bibliothèque client détecte le code de l'application. Lorsque Prometheus saisit le point de terminaison HTTP de l'instance, la bibliothèque client envoie l'état actuel de toutes les métriques suivies au serveur prometheus.

3. Exportateurs : Prometheus prend en charge divers exportateurs, grâce auxquels les données de mesure peuvent être collectées et envoyées au serveur prometheus.

4.Alertmanager : Après avoir reçu des alertes du serveur Prometheus, il dédupliquera, groupera, acheminera vers le récepteur correspondant et enverra une alarme.Les méthodes de réception courantes sont: e-mail, WeChat, DingTalk, slack, etc.

5. Grafana : tableau de bord de surveillance

6. Pushgateway : chaque hôte cible peut rapporter des données à pushgatewy, puis le serveur prometheus extrait les données de pushgateway de manière uniforme.

Diagramme d'architecture de Prométhée

image

Comme on peut le voir sur la figure ci-dessus, l'ensemble de l'écosystème de Prometheus comprend principalement le serveur prometheus, l'exportateur, le pushgateway, le gestionnaire d'alertes, le grafana, l'interface Web ui et le serveur Prometheus se compose de trois parties, récupération, stockage, PromQL

La récupération est responsable de la saisie des données des indicateurs de surveillance sur les hôtes cibles actifs
Le stockage de stockage consiste principalement à stocker les données collectées sur disque
PromQL est un module de langage de requête fourni par Prometheus.

Flux de travail Prometheus :

1. Le   serveur Prometheus peut extraire périodiquement les données d'indicateur de surveillance de l' hôte cible actif ( supérieur ) ( cible ). Les données de surveillance de l'hôte cible peuvent être collectées par le serveur prometheus en configurant des travaux statiques ou la découverte de services . Cette méthode est la méthode par défaut tirer des indicateurs de tirage en mode; peut également être pushgateway les données collectées vers le serveur prometheus signalé ; et aussi certains des composants en transportant l'acquisition de données de l' exportateur composants respectifs;

2. Le serveur Prometheus enregistre les données d'index de surveillance collectées sur le disque local ou la base de données;

3. Les données d'index de surveillance collectées par Prometheus sont stockées dans des séries chronologiques et l'alarme déclenchée est envoyée à alertmanager en configurant la règle d'alarme.

4.Alertmanager peut envoyer l'alarme par e-mail, WeChat ou DingTalk en configurant le récepteur d'alarme

5. La propre interface utilisateur Web de Prometheus  fournit le langage de requête PromQL , qui peut interroger les données de surveillance

6. Grafana peut se connecter à la source de données prometheus et afficher les données de surveillance sous forme graphique

安装node-exporter组件

机器规划:

我的实验环境使用的k8s集群是一个master节点和一个node节点

master节点的机器ip是192.168.0.6,主机名是master1

node节点的机器ip是192.168.0.56,主机名是node1

master高可用集群安装可参考如下文章:

k8s1.18高可用集群安装-超详细中文官方文档

k8s1.18多master节点高可用集群安装-超详细中文官方文档


node-exporter是什么?

采集机器(物理机、虚拟机、云主机等)的监控指标数据,能够采集到的指标包括CPU, 内存,磁盘,网络,文件数等信息。

安装node-exporter组件,在k8s集群的master1节点操作

cat >node-export.yaml  <<EOFapiVersion: apps/v1kind: DaemonSetmetadata:  name: node-exporter  namespace: monitor-sa  labels:    name: node-exporterspec:  selector:    matchLabels:     name: node-exporter  template:    metadata:      labels:        name: node-exporter    spec:      hostPID: true      hostIPC: true      hostNetwork: true      containers:      - name: node-exporter        image: prom/node-exporter:v0.16.0        ports:        - containerPort: 9100        resources:          requests:            cpu: 0.15        securityContext:          privileged: true        args:        - --path.procfs        - /host/proc        - --path.sysfs        - /host/sys        - --collector.filesystem.ignored-mount-points        - '"^/(sys|proc|dev|host|etc)($|/)"'        volumeMounts:        - name: dev          mountPath: /host/dev        - name: proc          mountPath: /host/proc        - name: sys          mountPath: /host/sys        - name: rootfs          mountPath: /rootfs      tolerations:      - key: "node-role.kubernetes.io/master"        operator: "Exists"        effect: "NoSchedule"      volumes:        - name: proc          hostPath:            path: /proc        - name: dev          hostPath:            path: /dev        - name: sys          hostPath:            path: /sys        - name: rootfs          hostPath:            path: /EOF

#通过kubectl apply更新node-exporter

kubectl apply -f node-export.yaml

#查看node-exporter是否部署成功

 kubectl get pods -n monitor-sa
显示如下,看到pod的状态都是running,说明部署成功

NAME                  READY   STATUS    RESTARTS   AGEnode-exporter-9qpkd   1/1     Running   0          89snode-exporter-zqmnk   1/1     Running   0          89s

通过node-exporter采集数据

curl  http://主机ip:9100/metrics
#node-export默认的监听端口是9100,可以看到当前主机获取到的所有监控数据,截取一部分,如下

# HELP node_cpu_seconds_total Seconds the cpus spent in each mode.# TYPE node_cpu_seconds_total counternode_cpu_seconds_total{cpu="0",mode="idle"} 56136.98# HELP node_load1 1m load average.# TYPE node_load1 gaugenode_load1 0.58
#HELP:解释当前指标的含义,上面表示在每种模式下node节点的cpu花费的时间,以s为单位#TYPE:说明当前指标的数据类型,上面是counter类型
node_load1该指标反映了当前主机在最近一分钟以内的负载情况,系统的负载情况会随系统资源的使用而变化,因此node_load1反映的是当前状态,数据可能增加也可能减少,从注释中可以看出当前指标类型为gauge(标准尺寸)
node_cpu_seconds_total{cpu="0",mode="idle"} :cpu0上idle进程占用CPU的总时间,CPU占用时间是一个只增不减的度量指标,从类型中也可以看出node_cpu的数据类型是counter(计数器)
counter计数器:只是采集递增的指标gauge标准尺寸:统计的指标可增加可减少

k8s集群中部署prometheus

1.创建namespace、sa账号在k8s集群的master节点操作

#创建一个monitor-sa的名称空间

kubectl create ns monitor-sa 

#创建一个sa账号

kubectl create serviceaccount monitor -n monitor-sa  

#把sa账号monitor通过clusterrolebing绑定到clusterrole上

kubectl create clusterrolebinding monitor-clusterrolebinding -n monitor-sa --clusterrole=cluster-admin  --serviceaccount=monitor-sa:monitor

2.创建数据目录

#在k8s集群的任何一个node节点操作,因为我的k8s集群只有一个node节点node1,所以我在node1上操作如下命令:

mkdir /data
chmod 777 /data/

3.安装prometheus,以下步骤均在在k8s集群的master1节点操作

1)创建一个configmap存储卷,用来存放prometheus配置信息

cat  >prometheus-cfg.yaml <<EOF---kind: ConfigMapapiVersion: v1metadata:  labels:    app: prometheus  name: prometheus-config  namespace: monitor-sadata:  prometheus.yml: |    global:      scrape_interval: 15s      scrape_timeout: 10s      evaluation_interval: 1m    scrape_configs:    - job_name: 'kubernetes-node'      kubernetes_sd_configs:      - role: node      relabel_configs:      - source_labels: [__address__]        regex: '(.*):10250'        replacement: '${1}:9100'        target_label: __address__        action: replace      - action: labelmap        regex: __meta_kubernetes_node_label_(.+)    - job_name: 'kubernetes-node-cadvisor'      kubernetes_sd_configs:      - role:  node      scheme: https      tls_config:        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt      bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token      relabel_configs:      - action: labelmap        regex: __meta_kubernetes_node_label_(.+)      - target_label: __address__        replacement: kubernetes.default.svc:443      - source_labels: [__meta_kubernetes_node_name]        regex: (.+)        target_label: __metrics_path__        replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor    - job_name: 'kubernetes-apiserver'      kubernetes_sd_configs:      - role: endpoints      scheme: https      tls_config:        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt      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    - job_name: 'kubernetes-service-endpoints'      kubernetes_sd_configs:      - role: endpoints      relabel_configs:      - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape]        action: keep        regex: true      - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme]        action: replace        target_label: __scheme__        regex: (https?)      - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path]        action: replace        target_label: __metrics_path__        regex: (.+)      - source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port]        action: replace        target_label: __address__        regex: ([^:]+)(?::\d+)?;(\d+)        replacement: $1:$2      - action: labelmap        regex: __meta_kubernetes_service_label_(.+)      - source_labels: [__meta_kubernetes_namespace]        action: replace        target_label: kubernetes_namespace      - source_labels: [__meta_kubernetes_service_name]        action: replace        target_label: kubernetes_name EOF

注意:通过上面命令生成的promtheus-cfg.yaml文件会有一些问题,$1和$2这种变量在文件里没有,需要在k8s的master1节点打开promtheus-cfg.yaml文件,手动把$1和$2这种变量写进文件里,promtheus-cfg.yaml文件需要手动修改部分如下:


22行的replacement: ':9100'变成replacement: '${1}:9100'42行的replacement: /api/v1/nodes//proxy/metrics/cadvisor变成              replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor73行的replacement:  变成replacement: $1:$2

#通过kubectl apply更新configmap

kubectl apply  -f  prometheus-cfg.yaml


2)通过deployment部署prometheus

cat  >prometheus-deploy.yaml <<EOF---apiVersion: apps/v1kind: Deploymentmetadata:  name: prometheus-server  namespace: monitor-sa  labels:    app: prometheusspec:  replicas: 1  selector:    matchLabels:      app: prometheus      component: server    #matchExpressions:    #- {key: app, operator: In, values: [prometheus]}    #- {key: component, operator: In, values: [server]}  template:    metadata:      labels:        app: prometheus        component: server      annotations:        prometheus.io/scrape: 'false'    spec:      nodeName: node1      serviceAccountName: monitor      containers:      - name: prometheus        image: prom/prometheus:v2.2.1        imagePullPolicy: IfNotPresent        command:          - prometheus          - --config.file=/etc/prometheus/prometheus.yml          - --storage.tsdb.path=/prometheus          - --storage.tsdb.retention=720h        ports:        - containerPort: 9090          protocol: TCP        volumeMounts:        - mountPath: /etc/prometheus/prometheus.yml          name: prometheus-config          subPath: prometheus.yml        - mountPath: /prometheus/          name: prometheus-storage-volume      volumes:        - name: prometheus-config          configMap:            name: prometheus-config            items:              - key: prometheus.yml                path: prometheus.yml                mode: 0644        - name: prometheus-storage-volume          hostPath:           path: /data           type: DirectoryEOF

注意:在上面的prometheus-deploy.yaml文件有个nodeName字段,这个就是用来指定创建的这个prometheus的pod调度到哪个节点上,我们这里让nodeName=node1,也即是让pod调度到node1节点上,因为node1节点我们创建了数据目录/data,所以大家记住:你在k8s集群的哪个节点创建/data,就让pod调度到哪个节点。

#通过kubectl apply更新prometheus

kubectl apply -f prometheus-deploy.yaml

#查看prometheus是否部署成功

kubectl get pods -n monitor-sa

显示如下,可看到pod状态是running,说明prometheus部署成功

NAME                                 READY   STATUS    RESTARTS   AGEnode-exporter-9qpkd                  1/1     Running   0          76mnode-exporter-zqmnk                  1/1     Running   0          76mprometheus-server-85dbc6c7f7-nsg94   1/1     Running   0          6m7

3)给prometheus pod创建一个service

cat  > prometheus-svc.yaml << EOF---apiVersion: v1kind: Servicemetadata:  name: prometheus  namespace: monitor-sa  labels:    app: prometheusspec:  type: NodePort  ports:    - port: 9090      targetPort: 9090      protocol: TCP  selector:    app: prometheus    component: serverEOF

#通过kubectl apply 更新service

kubectl  apply -f prometheus-svc.yaml

#查看service在物理机映射的端口

kubectl get svc -n monitor-sa

显示如下:

NAME         TYPE       CLUSTER-IP    EXTERNAL-IP   PORT(S)          AGEprometheus   NodePort   10.96.45.93   <none>        9090:31043/TCP   50s

通过上面可以看到service在宿主机上映射的端口是31043,这样我们访问k8s集群的master1节点的ip:31043,就可以访问到prometheus的web ui界面了

#访问prometheus web ui界面

火狐浏览器输入如下地址:

http://192.168.0.6:31043/graph

可看到如下页面:

#点击页面的Status->Targets,可看到如下,说明我们配置的服务发现可以正常采集数据

prometheus热更新

#为了每次修改配置文件可以热加载prometheus,也就是不停止prometheus,就可以使配置生效,如修改prometheus-cfg.yaml,想要使配置生效可用如下热加载命令:
curl -X POST http://10.244.1.66:9090/-/reload

#10.244.1.66是prometheus的pod的ip地址,如何查看prometheus的pod ip,可用如下命令:

kubectl get pods -n monitor-sa -o wide | grep prometheus

显示如下, 10.244.1.7就是prometheus的ip

prometheus-server-85dbc6c7f7-nsg94   1/1     Running   0          29m   10.244.1.7     node1     <none>           <none>

#La vitesse de chargement à chaud est relativement lente, vous pouvez redémarrer violemment prometheus, par exemple, après avoir modifié le fichier prometheus-cfg.yaml ci-dessus, vous pouvez effectuer la suppression forcée suivante:

kubectl supprimer -f prometheus-cfg.yaml

kubectl delete -f prometheus-deploy.yaml

Ensuite, mettez à jour via Apply:

kubectl applique -f prometheus-cfg.yaml

kubectl apply -f prometheus-deploy.yaml


Je suppose que tu aimes

Origine blog.51cto.com/15127502/2655059
conseillé
Classement