Prometheus

部署架构:

  • Kubernetes version: v1.16.3
  • 部署架构:

Components

第一步:创建NameSpace:"monitoring"

$ kubectl apply -f prometheus-ns.yml

所有Prometheus相关的对象都部署在NameSpace“monitoring”之下。

第二步:部署node-exporter

node-exporter用于提供*NIX内核的硬件以及系统指标,采集服务器层面的运行指标,包括机器的loadavg、filesystem、meminfo等。

1. 部署node-exporter daemonset

$ kubectl apply -f node-exporter-daemonset.yml

  • 原始docker image是prom/node-exporter:v0.14.0
  • 类型是daemonset,每个node上都会部署一份
  • 使用宿主机网络,开放宿主机端口9100,可以直接通过<node_ip>:9100访问,如下:

NodeExporter

NodeExporter-Metrics

2. 部署node-exporter service

$ kubectl apply -f node-exporter-service.yml

  • 使用Cluster_IP,不能直接访问

第三步:部署kube-state-metrics

kube-state-metrics关注于获取k8s各种资源的最新状态,如deployment或者daemonset,将k8s的运行状况在内存中做个快照,并且获取新的指标。

1. 创建对应的ServiceAccount

$ kubectl apply -f kube-state-metrics-ServiceAccount.yml

2. 部署kube-state-metrics deployment

$ kubectl apply -f kube-state-metrics-deploy.yml

  • 原始docker image是gcr.io/google_containers/kube-state-metrics:v0.5.0

3. 部署kube-state-metrics service

$ kubectl apply -f kube-state-metrics-service.yml

  • 使用Cluster_IP,不能直接访问

第四步:部署node disk monitor

$ kubectl apply -f monitor-node-disk-daemonset.yml

  • 监视Node的磁盘占用情况
  • 原始docker image是giantswarm/tiny-tools:latest和dockermuenster/caddy:0.9.3
  • 类型是daemonset,每个node上都会部署一份

第五步:部署Prometheus

1. 创建对应的ServiceAccount

$ kubectl apply -f prometheus-k8s-ServiceAccount.yml

2. 创建配置相关的configmap

$ kubectl apply -f prometheus-config-configmap.yml

可以到 https://prometheus.io/docs/prometheus/latest/configuration/configuration/#kubernetes_sd_config 查看相关设置的定义

3. 创建警告规则相关的configmap

$ kubectl apply -f prometheus-rules-configmap.yml

4. 创建Prometheus的缺省用户及密码

$ kubectl apply -f prometheus-secret.yml

  • 缺省用户/密码为admin/admin: $ echo "YWRtaW4=" | base64 -D

5. 部署Prometheus Server的Deployment

$ kubectl apply -f prometheus-deploy.yml

  • 原始docker image是prom/prometheus:v1.7.0

  • 指向了alertmanager的service:-alertmanager.url=http://alertmanager:9093/

6. 部署Prometheus Server的Service

$ kubectl apply -f prometheus-service.yml

  • 类型是NodePort,由K8s自由分配,通过 $ kubectl get service -n monitoring 可以查到分配的端口

  • 可以通过<Node_IP>:<Node_Port>访问Prometheus的界面:

Prometheus-UI

  • 在Alerts,可以看到根据rule定义的警报规则报出的告警信息:

Prometheus-Alert

  • 在Status->Targets,可以看到根据配置设置的监视目标:

Prometheus-Targets

第六步:部署Grafana

1. 创建Grafana Dashboard模版相关的configmap

$ kubectl apply -f grafana-net-2-dashboard-configmap.yml

可以到 https://grafana.com/grafana/dashboards 查看相关Dashboard模版的设置

2. 部署Grafana Server的 Deployment

$ kubectl apply -f grafana-deploy.yml

  • 原始docker image是grafana/grafana:4.2.0

3. 部署Grafana Server的 Service

$ kubectl apply -f grafana-service.yml

  • 类型是NodePort,由K8s自由分配,通过 $ kubectl get service -n monitoring 可以查到分配的端口

  • 可以通过<Node_IP>:<Node_Port>访问Grafana的界面:

    Grafana

  • 缺省登陆用户/密码是 admin/admin

  • 注意:此时还没有添加数据源

4. 为Grafana添加数据源,并创建Dashboard

$ kubectl apply -f grafana-net-2-dashboard-batch.yml

  • 注意:必须在创建Grafana Service之后再运行

  • 运行成功后,Grafana Server添加了数据源,并创建了Dashboard:

    Grafana+Dashboard

K8sDashboard

5. 部署Grafana Service的Ingress

$ kubectl apply -f grafana-ingress.yml

  • Ingress安装在Node节点,所以要设置/etc/hosts,Ingress里定义的Hostname指向Node节点IP
  • grafana-ingress设置端口为80, 但要查看 $kubectl get service -n ingress-nginx , 确认80端口映射到哪个NodePort
  • 可通过<Host_Name>:<Node_Port>的方式访问Grafana

第七步:部署Alertmanager

1. 创建Alertmanager配置相关的Configmap

$ kubectl apply -f alertmanager-config-configmap.yml

2. 创建Alertmanager模板相关的Configmap

$ kubectl apply -f alertmanager-templates-configmap.yml

  • 此处设置告警信息的各种模板

3. 部署Alertmanager的Deployment

$ kubectl apply -f alertmanager-deploy.yml

  • 原始Docker image是quay.io/prometheus/alertmanager:v0.7.1

4. 部署Alertmanager的Service

$ kubectl apply -f alertmanager-service.yml

  • 类型是NodePort,由K8s自由分配,通过 $ kubectl get service -n monitoring 可以查到分配的端口
  • 可以通过<Node_IP>:<Node_Port>访问Alertmanager的界面:

Alertmanager

   可以看到,Alertmanager接收到Prometheus里的警报,会产生对应的告警信息
  • 通过配置设定的渠道,Alertmanager会把告警信息按照模板定义的格式发送出去。下图为接收到的告警邮件:

Email