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
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多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 counter
node_cpu_seconds_total{cpu="0",mode="idle"} 56136.98
# HELP node_load1 1m load average.
# TYPE node_load1 gauge
node_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 AGE
node-exporter-9qpkd 1/1 Running 0 76m
node-exporter-zqmnk 1/1 Running 0 76m
prometheus-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