亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

在Docker Swarm集群中搭建監控和日志系統

在这份指南中,我们将介绍在 Docker Swarm 集群中设置监控和日志系统的步骤。此设置确保您的集群被良好地监控,实时显示日志和性能指标的可视化。我们将使用的工具有如下:

  • Docker Swarm :Docker 的内置集群工具,使容器编排变得简单。
  • Traefik :一个反向代理和负载均衡器,用于动态管理流量。
  • Grafana :一个监控平台,允许你可视化指标。
  • Prometheus :一个监控系统,可以抓取指标并将它们存储在时间序列数据库中。
  • cAdvisor :一个用于监控运行中容器的资源使用情况和性能的工具。
  • Node Exporter :导出节点的硬件和操作系统层面的指标。
  • Loki :一个日志聚合系统,用于从容器收集日志。
  • Promtail :一个日志传输代理,将 Docker 容器的日志发送到 Loki。
假设部分

在我们深入了解配置之前,我们先来做几个假设:

  1. Docker已在你计划用于Docker Swarm集群中的所有机器上安装。
  2. 你熟悉Docker的基本概念以及容器编排。
搭建Docker Swarm:

在管理节点上,运行以下命令来初始化Docker Swarm集群,这是设置集群的第一个步骤:

如需更多信息,请参见:

创建一个群集(swarm)更多详情请参阅docs.docker.com

此命令将初始化Swarm集群环境,并生成一个令牌供您使用。在工作节点上,您需要运行以下命令以将其他节点添加到Swarm集群中。

docker swarm join --token <YOUR_TOKEN> <MANAGER_IP>:2377

注:<YOUR_TOKEN> 是您的唯一令牌,<MANAGER_IP> 是管理节点的 IP 地址。此命令用于将新节点加入到 Docker Swarm 集群中。

一旦节点连接完成,您可以在管理节点上运行以下命令来验证它们是否已加入该集群:

运行命令:docker node ls
为何用 Traefik 而不用 NGINX?
为什么用 Traefik 而不用 NGINX?
  1. 动态路由:Traefik 自动检测您 Swarm 集群中部署的新服务,并动态更新路由,无需手动调整配置。
  2. 无需暴露所有服务:默认情况下,Traefik 不会公开服务,除非明确配置,这增强了安全性。
  3. Swarm 模式集成:Traefik 内置支持 Docker Swarm,使在分布式集群中扩展和管理服务变得更加简单。
为 Traefik 创建网络

在部署 Traefik 之前,我们首先需要创建一个名为 traefik-public 的 Docker 网络,Traefik 将通过该网络与其他服务进行通信。

执行以下命令来创建网络:

    docker network create --driver=overlay traefik-public

创建一个使用overlay驱动的名为traefik-public的Docker网络 (Create a Docker network named traefik-public using the overlay driver)

部署 Traefik

现在我们来在Docker Swarm中设置Traefik吧。下面是一个示例docker-compose.yml配置,用于Traefik。此设置确保Traefik在集群模式下运行并通过traefik-public网络进行通信。

    services:  
      traefik:  
        image: traefik:v2.9  
        command:  
          - "--log.level=DEBUG"  # 日志级别为DEBUG
          - "--providers.docker"  # 启用Docker提供者
          - "--providers.docker.exposedbydefault=false"  # 默认不暴露服务
          - "--providers.docker.network=traefik-public"  # 使用网络traefik-public
          - "--providers.docker.swarmmode=true"  # 启用Swarm模式
          - "--api.insecure=true"  # API不安全启用
          - "--api.dashboard=true"  # 启用仪表板
          - "--entrypoints.web.address=:80"  # 设置web端点地址为80端口
          - "--accesslog"  # 启用访问日志
          - "--api"  # 启用API
        ports:  
          - "80:80"  
          - "8080:8080"  
        volumes:  
          - /var/run/docker.sock:/var/run/docker.sock  
        networks:  
          - traefik-public  # 使用网络traefik-public
        deploy:  
          placement:  
            constraints:  
              - node.role == manager  # 节点角色 == 管理者

    networks:  
      traefik-public:  
        external: true  # 这是一个外部网络

此配置配置了 Traefik,如下所示:

  • 一个可在 8080 端口访问的仪表板。
  • 80 端口上的网络流量路由,
  • 访问 Docker socket 以检测在 Swarm 中运行的容器和服务。
  • 用于 Traefik 和服务彼此通信的 traefik-public 网络。
配置 Grafana

让我们开始在Docker Swarm集群中设置Grafana。Grafana将帮助我们实时地将从Prometheus和其他来源收集的指标可视化。以下是在Swarm中部署Grafana作为服务的docker-compose.yml配置:

    services:  
      grafana:  
        image: grafana/grafana:latest  
        volumes:  
          - grafana_data:/var/lib/grafana  

    networks:  
          - traefik-public  
        environment:  
          - GF_SERVER_ROOT_URL=http://127.0.0/analytics  
        deploy:  
          labels:  
            - "traefik.enable=true"  
            - "traefik.http.routers.grafana.rule=PathPrefix(`/analytics`)"  
            - "traefik.http.routers.priority=2"  
            - "traefik.http.routers.grafana.entrypoints=web"  
            - "traefik.http.services.grafana.loadbalancer.server.port=3000"  
            - "traefik.http.middlewares.grafana-stripper.stripprefix.prefixes=/analytics"  
            - "traefik.http.routers.grafana.middlewares=grafana-stripper"  
    volumes:  
      grafana_data:  
    networks:  
      traefik-public:  
        external: true

解释:

  • 图像:我们使用从 Docker Hub 获取的最新 Grafana 镜像。
  • :持久卷 grafana_data 用于存储 Grafana 的数据和仪表板。
  • 网络:Grafana 连接到 traefik-public 网络,以便与 Traefik 进行通信以实现路由。
  • 环境变量:将 GF_SERVER_ROOT_URL 设置为 /analytics,这样 Grafana 就可以通过公共 IP 地址访问。
  • Traefik 标签:这些标签配置了 Traefik 将如何为 Grafana 路由流量。它监听路径为 /analytics 的请求,去除前缀,并将流量转发到运行在 3000 端口的 Grafana。

现在,Grafana 可以通过 http://159.89.230.191/analytics 访问得到,等 Prometheus 和其他服务安装完毕,你就可以登录并开始查看数据了。

我们接下来将配置Prometheus来监控容器指标。

设置Prometheus、cAdvisor和Node Exporter
设置 Prometheus

普罗米修斯负责从各种来源收集并存储指标数据,包括Node Exporter和cAdvisor这两个工具。这是普罗米修斯及其与Node Exporter和cAdvisor配合使用的设置。

docker-compose.yml, 的配置文件
    services:  
      prometheus:  
        image: prom/prometheus:v2.37.1  
        volumes:  
          - ./prometheus:/etc/prometheus  
          - prometheus_data:/prometheus  
        command:  
          - "--config.file=/etc/prometheus/prometheus.yml"  
          - "--storage.tsdb.path=/prometheus"  
          - "--web.console.libraries=/usr/share/prometheus/console_libraries"  
          - "--web.console.templates=/usr/share/prometheus/consoles"  
        deploy:  
          placement:  
            constraints:  
              - node.role == manager  
        networks:  
          - traefik-public  

      node-exporter:  
        image: prom/node-exporter:v1.3.1  
        volumes:  
          - /proc:/host/proc:ro  
          - /sys:/host/sys:ro  
          - /:/rootfs:ro  
        command:  
          - "--path.procfs=/host/proc"  
          - "--path.sysfs=/host/sys"  
          - "--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($|/)"  
        deploy:  
          mode: global  
        networks:  
          - traefik-public  

      cadvisor:  
        image: gcr.io/cadvisor/cadvisor:v0.45.0  
        volumes:  
          - /:/rootfs:ro  
          - /var/run:/var/run:ro  
          - /sys:/sys:ro  
          - /var/lib/docker/:/var/lib/docker:ro  
          - /dev/disk/:/dev/disk:ro  
        deploy:  
          mode: global  
        networks:  
          - traefik-public  

    volumes:  
      prometheus_data:  

    networks:  
      traefik-public:  
        external: true

解释:

  • Prometheus:主要服务,从配置的目标(例如Node Exporter、cAdvisor)中抓取数据并将数据存储在prometheus_data
  • Node Exporter:提供集群中每个节点的系统指标(如CPU、内存和磁盘使用情况)。它作为全局服务运行,意味着它运行在所有节点上。
  • cAdvisor:监控运行容器的资源使用和性能特征。它也像Node Exporter一样,作为全局服务运行。
  • 绑定挂载的概念:Node Exporter和cAdvisor都使用主机系统的目录(如/proc/sys/var/lib/docker等)来收集容器和节点级别的指标。
目录结构简介

下面是这个设置的文件夹结构:

    .  
    ├── docker-compose.yml  
    ├── prometheus/  
    │   └── prometheus.yml  
    └── prometheus_data/# Prometheus在这里存储时间序列数据
Prometheus 配置文件 (prometheus.yml)

你需要创建一个Prometheus配置文件,来定义Prometheus如何从其目标(例如Prometheus本身、Node Exporter 和 cAdvisor)抓取(scraping)数据:

    全局配置:  
      抓取时间间隔: 15s
    scrape_configs:  
      - job_name: 'prometheus'  
        static_configs:  
          - targets: ['localhost:9090']  
      - job_name: 'node-exporter'  
        dns_sd_configs:  
          - names:  
            - 'tasks.monitoring_node-exporter'  
            type: 'A'  
            port: 9100  
      - job_name: 'cadvisor'  
        dns_sd_configs:  
          - names:  
            - 'tasks.monitoring_cadvisor'  
            type: 'A'  
            port: 8080
创建必要的目录和文件的命令。

为了给Prometheus及其配置创建必要的目录结构,你可以运行以下命令:

    # 创建一个 prometheus 文件夹  
    mkdir prometheus
    # 在prometheus目录下创建一个prometheus.yml文件
    touch prometheus/prometheus.yml# 打开文件并粘贴配置:
    nano prometheus/prometheus.yml# 创建一个用于存放prometheus数据的目录
    mkdir prometheus_data
Prometheus配置详解
  • 抓取间隔:Prometheus 每 15 秒抓取一次指标。
  • 任务配置
  • Prometheus:在 localhost:9090 抓取自身的指标信息。
  • Node Exporter:使用基于 DNS 的服务发现 (dns_sd_configs) 发现并通过抓取运行在每个节点上的 node-exporter 服务的指标。
  • cAdvisor:同样地,Prometheus 使用 DNS 服务发现抓取 cAdvisor 的指标信息。

一旦部署完成,Prometheus 就会在整个 Docker Swarm 集群中开始抓取系统和容器指标。

Loki 和 Promtail 日志设置

洛基用于收集和查询日志信息,而普罗泰尔是将日志发送到洛基的代理。这里是如何在你的 docker-compose.yml 文件中以及洛基和普罗泰尔各自的配置文件中进行配置。

docker-compose.yml 用于 Loki和Promtail
    网络,  
      traefik-public:  
        外部: 是
    services:  
      loki:  
        image: grafana/loki:3.0.0  
        volumes:  
          - ./loki/loki-config.yaml:/mnt/config/loki-config.yaml  
        command: -config.file=/mnt/config/loki-config.yaml  
        networks:  
          - traefik-public  
        deploy:  
          mode: replicated  
          replicas: 1  
    promtail:  
        image: grafana/promtail:3.0.0  
        volumes:  
          - ./promtail/promtail-config.yaml:/mnt/config/promtail-config.yaml  
          - /var/log:/var/log  
          - /var/lib/docker/containers:/var/lib/docker/containers:ro  
          - /var/run/docker.sock:/var/run/docker.sock  
        depends_on:  
          - loki  
        command: -config.file=/mnt/config/promtail-config.yaml  
        environment:  
          - HOSTNAME={{.Node.Hostname}}  
        networks:  
          - traefik-public  
        deploy:  
          mode: global
目录结构

为了更有效地管理和维护Loki和Promtail,这里给出了一种可能的日志配置目录结构:

这是一个包含 Docker Compose 配置文件和 Loki 及 Promtail 配置文件的文件夹结构:
    .  
    ├── docker-compose.yml  # Docker Compose 配置文件  
    ├── loki/  
    │   └── loki-config.yaml  # Loki 配置文件  
    └── promtail/  
        └── promtail-config.yaml  # Promtail 配置文件
创建所需目录和文件的命令如下:

为了创建所需的文件和文件夹,请运行如下命令来实现。

# 创建 Loki 和 Promtail 的文件夹  
mkdir loki promtail
# 生成 Loki 和 Promtail 配置文件并编辑相应内容  
touch loki/loki-config.yaml  
touch promtail/promtail-config.yaml  
nano loki/loki-config.yaml  
nano promtail/promtail-config.yaml
Loki 配置 (loki-config.yaml)
    auth_enabled: false
server:  
  http_listen_port: 3100  
  grpc_listen_port: 9096  
公共:  
  instance_addr: 127.0.0.1  
  path_prefix: /tmp/loki  
  存储:  
    filesystem:  
      chunks_directory: /tmp/loki/chunks  
      rules_directory: /tmp/loki/rules  
  复制因子: 1  
  环:  
    kvstore:  
      store: inmemory  
query_range:  
  results_cache:  
    缓存:  
      内嵌缓存:  
        enabled: true  
        max_size_mb: 100  
模式配置:  
  配置项:  
    - from: 2020-10-24  
      store: tsdb  
      object_store: filesystem  
      schema: v13  
      索引:  
        前缀: index_  
        周期: 24h

此配置指定Loki将分别监听HTTP的端口3100和gRPC的端口9096。日志将存储在文件系统的/tmp/loki目录中。配置方案版本设置为v13,并采用tsdb存储格式。

Promtail 配置文件 (promtail-config.yaml)
服务器配置:  
  HTTP监听端口: 9080  
  gRPC监听端口: 0
positions:  
  filename: /tmp/positions.yamlclients:  
  - url: <http://loki:3100/loki/api/v1/push>scrape_configs:  
  - job_name: system  
    static_configs:  
    - targets:  
        - localhost  
      labels:  
        job: varlogs  
        node: ${HOSTNAME}  
        __path__: /var/log/*log  - job_name: docker  
    docker_sd_configs:  
    - host: unix:///var/run/docker.sock  
      refresh_interval: 5s  
    relabel_configs:  
    - source_labels: ['__meta_docker_container_name']  
      regex: '/(.*)'  
      target_label: 'container'  
    - target_label: 'node'  
      replacement: ${HOSTNAME}  - job_name: promtail  
    static_configs:  
    - targets:  
        - localhost  
      labels:  
        job: promtail  
        node: ${HOSTNAME}  
        __path__: /var/log/promtail.log
关于Promtail配置的说明:
  • 定位:跟踪日志文件的最后读取位置,以防止重复读取相同的日志。
  • 客户端:Promtail 将日志发送到 Loki 的端点 [http://loki:3100/loki/api/v1/push](http://loki:3100/loki/api/v1/push.)
  • 抓取设置

  • 系统日志:从 /var/log/*log 目录抓取日志。

  • Docker 日志:通过访问 Docker 套接字来抓取 Docker 容器的日志。

  • Promtail 日志:抓取 Promtail 的自身日志来监控自身。

这种配置允许Promtail从系统文件和Docker容器收集日志,并将它们推送至Loki进行查询和分析。

部署步骤

一旦配置文件设置完成后,你可以用Docker Compose来部署这个日志堆栈。

docker-compose up -d

这将启动 Loki 和 Promtail 两个服务,你可以通过 http://localhost:3100(或你用于访问 Grafana 的 IP 地址)访问 Loki。Promtail 会自动开始将日志发送给 Loki,你可以在 Grafana 中查询这些日志。

总结

通过使用Prometheus、cAdvisor、Node Exporter、Loki和Promtail搭建了一个完整的监控和日志记录系统,你现在拥有了一个强大的实时监控和日志分析系统。Prometheus收集关键指标,cAdvisor和Node Exporter提供了对容器化环境的深入洞察,而Loki和Promtail则确保了全面的日志聚合和搜索功能。

这种配置可以随着您的基础设施的扩展而扩展,并根据任何特定需求进行定制,无论是监控系统健康、排查问题,还是确保资源分配更优。此外,使用 Traefik 可以实现服务之间的无缝路由,从而更容易管理单个端点后多个服务。

通过在 Docker Swarm 中整合所有内容,你可以建立一个高效且易于部署的解决方案。你还可以在 Prometheus 中添加警报规则或在 Grafana 中设置仪表板以可视化日志和指标,从而扩展此设置。这样,你就能全面掌控你的可观测性和运营洞察力。

點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消