我在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,多種系統服務都可以進行監控。

广告
将在 10 秒后关闭
bannerAds