我在Ubuntu上部署了Prometheus+Alertmanager+Grafana来监控自己的k8s环境
首先
由于Synology的NAS始终处于运行状态,因此在其上安装了Prometheus和Alertmanager的Docker容器,并导入了Grafana。在K8s集群中,还安装了node-exporter和nginx-prometheus-exporter,以便监控Web服务器的状态。
这次为了监控在另一个环境构建的k8s集群,我在Ubuntu 18.04上的Docker中安装了Prometheus+Alertmanager+Grafana,并记录了安装过程。
【2023/07/06更新】
目前大多数的集群都使用kube-prometheus在k8s集群上运行Prometheus等。根据从撰写本文到现在的经验,我认为只监视集群崩溃以及在k8s集群外监控Web服务器等的运行状况,可以考虑在k8s集群上运行Prometheus来收集详细数据。
参考文献
-
- https://tech-lab.sios.jp/archives/16604
- https://github.com/kubernetes/kube-state-metrics
环境。
许多人在将Prometheus作为K8s的Pod运行的示例中,考虑到与Alertmanager的配合,我认为不能将其设置为Pod,所以选择将其放在独立的Docker上进行部署。刚开始,我选择将其安装在Synology NAS(DS916+)的Docker服务上。
这次我们将以如下的Ubuntu 18.04构建为目标来尝试。
-
- Docker on Ubuntu 18.04 (HP ProLiant MicroServer Gen8)
Prometheus
Alertmanager
Grafana
K8sクラスター内のPodとして稼動しているもの
node-exporter
kube-state-metrics
Prometheus+Alertmanager+Grafana的安装(Docker容器)
我正在准备以下类似的Makefile。192.168.1.5是Ubuntu主机的IP地址。
NAME = prometheus
IMAGE = prom/prometheus:v2.15.0
ALERT_NAME = alertmanager
ALERT_IMAGE = prom/alertmanager:v0.20.0
GRAFANA_NAME = grafana
GRAFANA_IMAGE = grafana/grafana:6.5.2
HOST_IP = 192.168.1.5
.PHONY: run stop start alertmanager-run alertmanager-stop alertmanager-start grafana-run grafana-stop grafana-start
run:
sudo docker run -it -d --name $(NAME) --restart=always \
-p $(HOST_IP):9090:9090 \
-v `pwd`/prometheus.yml:/etc/prometheus/prometheus.yml \
-v `pwd`/alert_rules.yml:/etc/prometheus/alert_rules.yml \
-v `pwd`/prometheus.root.prometheus:/prometheus \
$(IMAGE)
stop:
sudo docker stop $(NAME)
start:
sudo docker start $(NAME)
alertmanager-run:
sudo docker run -it -d --name $(ALERT_NAME) --restart=always \
-p $(HOST_IP):9093:9093 \
-v `pwd`/alertmanager.yml:/etc/alertmanager/alertmanager.yml \
$(ALERT_IMAGE)
alertmanager-stop:
sudo docker stop $(ALERT_NAME)
alertmanager-start:
sudo docker start $(ALERT_NAME)
grafana-run:
sudo docker run -it -d --name $(GRAFANA_NAME) --restart=always \
-p $(HOST_IP):3000:3000 \
-v `pwd`/grafana.var.lib.grafana:/var/lib/grafana \
$(GRAFANA_IMAGE)
grafana-stop:
sudo docker stop $(GRAFANA_NAME)
grafana-start:
sudo docker start $(GRAFANA_NAME)
需要给位于当前目录下的prometheus.root.prometheus/目录赋予 UID=65534 (nobody) 权限以及给grafana.var.lib.grafana/目录赋予 UID=472 (grafana) 用户的写入权限。
因为在Synology中无法通过GUI更改不存在的ID的权限,所以我暂时把权限授予了Nobody账户,但在Ubuntu中,可以通过指定UID和GID来更改权限,所以我将其更改为”$ sudo chown 472:472 grafana.var.lib.grafana”这样的形式。
设置文件的内容 de
以下是各个Docker容器使用-v选项传递的配置文件内容。如果挂载目标是一个目录,那么指定的是一个空目录。
global:
scrape_interval: 15s
scrape_timeout: 10s
evaluation_interval: 15s
alerting:
alertmanagers:
- static_configs:
- targets: ["192.168.1.5:9093"]
scheme: http
timeout: 10s
api_version: v1
scrape_configs:
- job_name: prometheus
honor_timestamps: true
scrape_interval: 15s
scrape_timeout: 10s
metrics_path: /metrics
scheme: http
static_configs:
- targets:
- 192.168.1.5:9090
- job_name: kubernetes
scheme: http
metrics_path: /metrics
static_configs:
- targets:
- 192.168.1.51:9100
- 192.168.1.52:9100
- 192.168.1.53:9100
- 192.168.1.54:9100
labels:
group: 'k8s'
- job_name: k8s-system-metrics
scheme: http
metrics_path: /metrics
static_configs:
- targets:
- 192.168.1.47:8080
labels:
group: 'k8s-system'
rule_files:
- "alert_rules.yml"
.scrape_configs.job_name中指定的/metrics指的是自身、node-exporter和kube-state-metrics服务。用于部署此服务的YAML文件如下所示。192.168.1.5[1-4]的IP地址指的是4个k8s节点,192.168.1.199:8080指的是kube-state-metrics服务公开的IP:端口。
groups:
- name: fs_alert
rules:
- alert: FilesystemAlert
expr: node_filesystem_avail_bytes{mountpoint="/"} < 8589934592
for: 10m
labels:
severity: critical
type: MiscAlert
annotations:
summary: fs_alert
alert_rules.yml中可以写多个定义,因此实际上有多个定义被记录。
global:
resolve_timeout: 5m
smtp_from: "user01@example.com"
smtp_smarthost: "example.com:25"
route:
group_by: ['alertname']
group_wait: 10s
group_interval: 10s
repeat_interval: 1h
receiver: 'web.hook'
routes:
- receiver: "email"
match:
type: MiscAlert
receivers:
- name: "email"
email_configs:
- to: "user01@example.com"
require_tls: false
- name: 'web.hook'
webhook_configs:
- url: 'http://127.0.0.1:5001/'
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']
以下是中文的翻译:
.global.smtp_from, .global.smtp_smarthost, .receivers.email_configs.to 这些变量分别指代实际的电子邮件地址和 SMTP 主机。它们的最低限度设置允许使用不需要 SMTP-AUTH 的方式发送邮件。由于邮件服务器的管理根据不同组织的政策有所差异,请根据自身需求适当配置。
启动每个进程
然后将适当的监视脚本放置在/usr/local/sbin下面,根据需要调用该Makefile来启动进程。
$ make run
$ make alertmanager-run
$ make grafana-run
在重新启动时,我们添加了重新启动设置–restart=always。这样一来,我们将删除`docker run`参数中的*-rm*。
之后,在使用`$ make stop`等命令停止后,请使用`start`而非`run`。通常情况下会自动重新启动,所以除非明确要执行“stop”任务,否则不需要使用它。
将node-exporter引入监视对象。
从这里开始,我们将使用kubectl命令来安装K8s集群。
请先使用 `kubectl create ns monitoring` 命令创建命名空间。如果需要进行更改,请编辑 YAML 文件中的 `.metadata.namespace` 部分。
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
name: node-exporter
namespace: monitoring
spec:
template:
metadata:
labels:
app: node-exporter
annotations:
prometheus.io/scrape: 'true'
prometheus.io/port: '9100'
prometheus.io/path: '/metrics'
spec:
containers:
- name: node-exporter
image: quay.io/prometheus/node-exporter:v0.18.1
ports:
- containerPort: 9100
hostNetwork: true
hostPID: true
当文件准备好时,请使用kubectl命令在每个节点上运行node-exporter。
$ sudo kubectl apply -f 01.daemonset.yaml
安装kube-state-metrics
由于正在操作的是由4个节点组成的K8s集群,因此只需要在K8s集群内运行一个kube-state-metrics就足够了。如果在大型环境中需要考虑分片,则请参考文档中的实验功能。
准备所需的YAML文件以进行导入。
首先,您需要克隆GitHub上的项目,并使用其中的examples/standard/目录中的文件。
$ git clone https://github.com/kubernetes/kube-state-metrics.git
$ cd kube-state-metrics/examples/standard/
通常情况下, 我认为这个目录中的配置是没有问题的,但是这次由于 Prometheus 在 k8s 集群之外,我们将其通过公开服务使外部 Prometheus 能够访问。
$ git diff
diff --git a/examples/standard/service.yaml b/examples/standard/service.yaml
index fcd83797..acf96c31 100644
--- a/examples/standard/service.yaml
+++ b/examples/standard/service.yaml
@@ -7,7 +7,8 @@ metadata:
name: kube-state-metrics
namespace: kube-system
spec:
- clusterIP: None
+ type: LoadBalancer
+ loadBalancerIP: 192.168.1.47
ports:
- name: http-metrics
port: 8080
如果要应用整个目录的YAML文件,则可以使用-f .。
$ sudo kubectl apply -f .
使用Prometheus和Grafana观察的印象
我们希望能够了解各个Pod的情况,以便检测重试次数的增加等情况。请查看 https://github.com/kubernetes/kube-state-metrics/tree/master/docs ,并使用稳定的选项,避免使用已被弃用的选项。
由于项目类型繁多,而且根据Pod数量的增加,项目数也会增加,因此需要进行一些实验来适当指定项目和阈值。
node-exporter是一個方便檢查常規Ubuntu服務器狀態的工具,可以運行nginx-prometheus-exporter,將nginx上的/stub_status轉換為/metrics,使得不僅限於k8s,多種系統服務都可以進行監控。