tanger
发布于 2024-07-23 / 8 阅读 / 0 评论 / 0 点赞

Prometheus对docker swarm中的springboot容器服务发现

springboot应用可以在docker swarm中部署多个副本,每个副本都要进行监控,使用端口映射和host模式部署的就不方便了。可以配合Prometheus可以和springboot在同一个网络中,配置Prometheus的服务发现,即可实现多副本监控。可以搭配联邦集群,实现有层次的监控架构

1、部署Prometheus

docker-compose.yml文件

version: "3.8"
services:
  prometheus:
    container_name: prometheus
    user: root
    restart: no
    networks:
      - appNet
    ports:
      - "9090:9090"
    volumes:
      - ./conf:/etc/prometheus/
      - /var/run/docker.sock:/var/run/docker.sock
    image: prom/prometheus:v2.52.0
    privileged: true
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
      - '--web.console.libraries=/etc/prometheus/console_libraries'
      - '--web.console.templates=/etc/prometheus/consoles'
      - '--storage.tsdb.retention=200h'
networks:
  appNet:
    external: true

prometheus.yml

dockerswarm_sd_configs为dockerswarm的服务发现

global:
  scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

# Alertmanager configuration
alerting:
  alertmanagers:
    - static_configs:
        - targets:
          # - alertmanager:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: [ 'localhost:9090' ]
  - job_name: 'dsb-services'
    dockerswarm_sd_configs:
      - host: unix:///var/run/docker.sock
        role: tasks
    relabel_configs:
      # 筛选出特定服务名称的任务
      - source_labels: [ __meta_dockerswarm_service_name ]
        regex: dsb-service_dsb
        action: keep
      # 抛弃特定的任务
      - source_labels: [ __meta_dockerswarm_network_name ]
        regex: ingress
        action: drop
      # 筛选处于运行的
      - source_labels: [ __meta_dockerswarm_task_desired_state ]
        regex: running
        action: keep
      # 使用服务名称作为job名称
      - source_labels: [ __meta_dockerswarm_service_name ]
        target_label: job
      # 使用任务ID作为instance标签
      - source_labels: [ __meta_dockerswarm_task_id ]
        target_label: instance
      - source_labels: [ __meta_dockerswarm_task_slot ]
        target_label: task_slot
      # 设置指标抓取路径
      - target_label: __metrics_path__
        replacement: /actuator/prometheus
      - target_label: node_address
        replacement: ${__meta_dockerswarm_node_address}
    metrics_path: /actuator/prometheus
    scheme: http

label标签示例,__address__会作为prometheus请求服务指标的host

__address__="10.0.6.17:8080"
__meta_dockerswarm_container_label_com_docker_stack_namespace="dsb-service"
__meta_dockerswarm_network_id="xs1glu8dal23wccjgtr598o0w"
__meta_dockerswarm_network_ingress="false"
__meta_dockerswarm_network_internal="false"
__meta_dockerswarm_network_name="appNet"
__meta_dockerswarm_network_scope="swarm"
__meta_dockerswarm_node_address="198.19.248.65"
__meta_dockerswarm_node_availability="active"
__meta_dockerswarm_node_hostname="orbstack"
__meta_dockerswarm_node_id="gmjoalka1y5dg9vbsj0rfqt5p"
__meta_dockerswarm_node_platform_architecture="aarch64"
__meta_dockerswarm_node_platform_os="linux"
__meta_dockerswarm_node_role="manager"
__meta_dockerswarm_node_status="ready"
__meta_dockerswarm_service_id="ri0bcgyszju20qen9gg1xhshf"
__meta_dockerswarm_service_label_com_docker_stack_image="dsb:3.0"
__meta_dockerswarm_service_label_com_docker_stack_namespace="dsb-service"
__meta_dockerswarm_service_label_description="This dsb service label"
__meta_dockerswarm_service_mode="replicated"
__meta_dockerswarm_service_name="dsb-service_dsb"
__meta_dockerswarm_task_container_id="9ecca0b591024b812d72022632618cc91813f69529ede50587c5e2bf4360bbb4"
__meta_dockerswarm_task_desired_state="running"
__meta_dockerswarm_task_id="62ssm283ntugpho0plbt312h3"
__meta_dockerswarm_task_port_publish_mode="ingress"
__meta_dockerswarm_task_slot="1"
__meta_dockerswarm_task_state="running"
__metrics_path__="/actuator/prometheus"
__scheme__="http"
__scrape_interval__="15s"
__scrape_timeout__="10s"
job="dsb-services"

启动命令:

docker-compose -f docker-compose.yml up -d

2、Springboot项目添加依赖

Springboot在docker中部署、jvm优化,docker分层构建可以查看往期的文章

        <!-- Spring Boot Actuator -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!-- Micrometer Prometheus registry -->
        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-registry-prometheus</artifactId>
        </dependency>

application.yml配置端点

management:
  endpoints:
    web:
      exposure:
        include: '*'

  endpoint:
    health:
      show-details: always

compose文件示例:

version: "3.8"
services:
  dsb:
    image: dsb:3.0
    environment:
      SERVICE_ID: '{{.Service.ID}}'
      SERVICE_NAME: '{{.Service.Name}}'
      SERVICE_LABELS: '{{.Service.Labels}}'
      NODE_ID: '{{.Node.ID}}'
      NODE_HOSTNAME: '{{.Node.Hostname}}'
      NODE_PLATFORM: '{{.Node.Platform}}'
      TASK_ID: '{{.Task.ID}}'
      TASK_NAME: '{{.Task.Name }}'
      TASK_SLOT: '{{.Task.Slot}}'
      POD_NAME: 'dsb-{{.Task.Slot}}'
    ports:
      - "8080:8080"
    networks:
      - appNet
    stop_grace_period: 10s
    volumes:
      - ./logs:/logs
    deploy:
      mode: replicated
      replicas: 3
      endpoint_mode: vip
      labels:
        description: "This dsb service label"
      resources:
        limits:
          cpus: '1.50'
          memory: 500M
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3
        window: 120s
      placement:
        constraints:
          - "node.role==manager"
      update_config:
        parallelism: 1
        delay: 10s
        order: start-first
        failure_action: rollback
networks:
  appNet:
    driver: overlay
    external: true

启动命令:

docker stack deploy -c compose.yml dsb-service


评论