使用 Kubernetes + Grafana Loki + Promtail 进行任意虚拟机的日志收集

为了达到某个预期的结果或完成某个任务所制定的计划或行动。

システムを安定稼働させるためにログの監視は重要な項目である。
ログを収集することでシステムトラブルや不審な操作・動作の検知に役立ち、その解決の一助とできる。
今回は前回記事である Loki + NFS で Kubernetes 上のログ取得 の続きとして、任意の VM に Promtail をインストールし、VM のログも収集可能にする。

在保存日志时,使用NFS服务器。
虽然Loki不推荐使用NFS服务器作为保存位置,但为了验证Loki在包括Kubernetes在内的所有本地环境中的运行情况,仍可以使用NFS服务器。

    第 1 章: Loki + NFS で Kubernetes 上のログ取得

使用NFS作为卷,并安装Loki。

    第 2 章: この章

安装Promtail,并将其聚合到最新安装的Loki中。

构成

使用3台Linux机器(Ubuntu 20.04),构建了以下配置的Kubernetes集群。
在Kubernetes上已经部署了Prometheus + Grafana + Loki。
此外,还准备了一台Linux机器(Ubuntu 20.04)用作NFS服务器和用于日志收集的任意虚拟机。

    • Kubernetes (Master Node)

10.100.2.220

Kubernetes (Worker Node)

10.100.2.221
10.100.2.222

NFS サーバ

10.100.2.170

ログ収集用の任意の VM

10.100.3.10

操作步骤 xù)

安装Helm

    • 実行場所

Kubernetes (Master Node)

安装Kubernetes的软件包管理工具Helm。

手順は 第 1 章: Loki + NFS で Kubernetes 上のログ取得 で記載しているため、省略する。

Promtail 是一款日志收集系统。

    • 実行場所

Kubernetes (Master Node)

Loki支持的用于日志收集的客户端软件包括Docker Driver、Fluentd和Logstash等。我们将在本次中选择引入Promtail。Promtail可以在与其运行的节点相同的节点上从运行的Pod中自动收集日志。因此,它是在运行Kubernetes时的最佳客户端。此外,Promtail还可以配置为从指定的主机路径追踪所有文件的日志,因此也是在裸金属上的最佳客户端。

为了在Kubernetes和任意的虚拟机上收集日志,我们将引入Promtail。

添加 Helm 存储库

添加 Helm 存储库。

helm repo add grafana https://grafana.github.io/helm-charts
helm repo update

创建配置文件

创建在启动时使用的Promtail配置文件。

cat << _EOF_ > loki-values-promtail.yaml
extraPorts:
  syslog:
    name: tcp-syslog
    containerPort: 31002
    service:
      port: 31002    
      type: NodePort
      nodePort: 31002  

config:
  snippets:
    extraScrapeConfigs: |
      - job_name: syslog
        syslog:
          listen_address: 0.0.0.0:31002
          listen_protocol: tcp
          idle_timeout: 60s
          label_structured_data: yes
          labels:
            job: syslog
        relabel_configs:
          - source_labels:
              - __syslog_message_hostname
            target_label: host
_EOF_

安装

安装Promtail时,请使用–namespace选项来指定与Prometheus + Grafana + Loki正在运行的命名空间相同的命名空间。

helm install  --namespace monitoring --values loki-values-promtail.yaml promtail  grafana/promtail

确认。

$ kubectl get all -n monitoring | grep promtail
pod/promtail-mjrjt                                           1/1     Running   0          76m
pod/promtail-t4jn4                                           1/1     Running   0          76m
service/promtail-syslog                           NodePort    10.99.220.27     <none>        31002:31002/TCP                 76m
daemonset.apps/promtail                                  2         2         2       2            2           <none>                   76m

日志收集

    • 実行場所

ログ収集用の任意の VM

将运行在虚拟机上的syslog文件传送到Loki中。

Promtail 安装

根据需要,从与Loki相同的位置获取Promtail二进制文件,并进行必要的版本更改。

wget https://github.com/grafana/loki/releases/download/v2.8.0/promtail-linux-amd64.zip
mkdir -p /opt/promtail
unzip promtail-linux-amd64.zip
mv promtail-linux-amd64 /opt/promtail

创建配置文件

创建Promtail的配置文件。
在clients.url中指定连接到Loki的URL。
这次在Kubernetes + Grafana Loki + NFS安装的Loki安装时,已经设置了gateway.serivce并打开了31001端口作为NodePort,因此指定为10.100.2.220:31001。
在scrape_configs内的labels中,指定在Grafana等工具中用于确认使用的标签和要收集的文件。

$  cat << _EOF_ > /opt/promtail/promtail-config.yaml
server:
  http_listen_port: 9080
  grpc_listen_port: 0
  grpc_server_max_recv_msg_size: 15728640
  grpc_server_max_send_msg_size: 15728640

positions:
  filename: /opt/promtail/positions.yaml

clients:
 - url: http://10.100.2.220:31001/loki/api/v1/push

scrape_configs:
- job_name: app_log
  static_configs:
  - targets:
      - localhost
    labels:
      job: test-10.100.3.10
      __path__: /var/log/syslog
_EOF_

服务化

启动Promtail作为服务,并使其能够在后台持续运行。

$  cat << _EOF_ > /etc/systemd/system/promtail.service
[Unit]
Description=promtail
Documentation=https://github.com/grafana/loki/releases
After=network.target
[Service]
User=root
Type=simple
ExecStart=/opt/promtail/promtail-linux-amd64 --config.file=/opt/promtail/promtail-config.yaml
Restart=on-failure
[Install]
WantedBy=multi-user.target
_EOF_

启动已创建的Promtail服务。

systemctl start promtail.service
systemctl enable promtail.service

启动后,请确认是否出现错误。

$ systemctl status promtail.service
● promtail.service - promtail
     Loaded: loaded (/etc/systemd/system/promtail.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2023-08-18 06:54:12 UTC; 2h 3min ago
       Docs: https://github.com/grafana/loki/releases
   Main PID: 12330 (promtail-linux-)
      Tasks: 8 (limit: 4721)
     Memory: 15.3M
        CPU: 38.298s
     CGroup: /system.slice/promtail.service
             └─12330 /opt/promtail/promtail-linux-amd64 --config.file=/opt/promtail/promtail-config.yaml

只要执行到这一步,就可以通过Grafana查看虚拟机的syslog。
可以通过浏览器连接到Grafana,并在探索中使用[标签过滤器]通过job: test-10.100.3.10的组合进行搜索来确认。

总结

我在上次和这次分别搭建了 Kubernetes + Grafana Loki + Promtail + NFS 的环境。
通过这个搭建,我能够获取任意虚拟机或 Pod 的日志并保存到 NFS 服务器。

作为本次实施内容的扩展,我们正在考虑将Loki微服务化以及扩展Kubernetes基础设施时对Loki服务的扩展支持。
另外,由于我们在本次实施中注重运行,所以没有详细设置Loki等运行时的参数。
因此,我们希望能够调整和设置与运行Loki相关的参数,例如压缩保存和归档自动化以及保存期限的设定,以便进行高效的日志保存并考虑到安全性。

bannerAds