ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Prometheus] Service Discovery 파일 기반 Config파일 작성하기
    데이터 엔지니어링/Prometheus 2022. 12. 21. 20:23
    반응형

    Service Discovery란?

    오늘은 Service Discovery에 대해 알아보도록 하겠습니다. 마이크로서비스 아키텍처(MSA)로 구성되어 있는 서비스들은 각자 다른 IP와 Port를 가지고 있는데 이러한 서로 다른 서비스들의 IP와 Port 정보에 대해서 저장하고 관리할 필요가 있어서 이것을 관리하는 것이 Service Discovery라고 합니다. 이론적으로 자세한 내용이 있지만 Prometheus측면에서 보면 Prometheus는 yml파일로 service들을(global, alerting, scrape_configs 등) 관리하게 됩니다. 이런 서비스들이 많아지거나 적어지거나 할 경우 서버를 내렸다 올렸다 하는 것이 아니라 파일 형식으로 관리하면 동적으로 작동할 수 있게 됩니다.

     

     

    먼저 Prometheus.yml 파일 보기

    이전 글에서 설정 했던 노드들을 살펴보면 Prometheus서버 172.30.3.166:9090, node_exporter서버 172.30.3.170:9100, 172.30.3.176:9100, 172.30.3.177:9100 Custom Exporter서버 172.30.1.129:9000로 총 6개 를 pull 하고 있는데 이렇게 yml파일 안에 주소를 작성하게 되면 보안상도 그렇고, 동적으로 saling 되지 않는 문제가 있습니다.

    # prometheus.yml
    
    global:
      scrape_interval: 15s 
      evaluation_interval: 15s
    
    alerting:
      alertmanagers:
        - static_configs:
            - targets:
              # - alertmanager:9093
    rule_files:
      # - "first_rules.yml"
      # - "second_rules.yml"
    
    scrape_configs:
      - job_name: "prometheus"
        static_configs:
          - targets: ["172.30.3.166:9090"]
    
      - job_name: "node"
        static_configs:
          - targets: ["172.30.3.170:9100", "172.30.3.176:9100"]
            labels:
              group: "production"
          - targets: ["172.30.3.177:9100"]
            labels:
              group: "develop"
              
      - job_name: "cus"
        static_configs:
          - targets: ["172.30.1.129:9000"]
    

    그래서 파일 기반으로 SD를 관리하게 되는 아래 글처럼 Scrap_configs에 대한 내용을 json파일로 만들어 기입할 수 있습니다.

    # prometheus_sd_file.yml
    
    global:
      scrape_interval: 15s
      evaluation_interval: 15s
    
    alerting:
      alertmanagers:
        - static_configs:
            - targets:
              # - alertmanager:9093
    
    rule_files:
      # - "first_rules.yml"
      # - "second_rules.yml"
    
    scrape_configs:
      - job_name: "prometheus"
        file_sd_configs:
        - files:
          - "target_prometheus.json"
    
      - job_name: "node"
        file_sd_configs:
        - files:
          - "target_node.json"
    
      - job_name: "cus"
        file_sd_configs:
        - files:
          - "target_cus.json"
    

    파일 확인하기

    파일들의 내용은 아래와 같습니다.

    target_prometheus.json

    [
        {
            "targets": [
                "172.30.3.166:9090"
            ]
        }
    ]
    

    target_node.json

    [
      {
        "targets": [
          "172.30.3.170:9100",
          "172.30.3.176:9100"
        ],
        "labels": {
          "group": "production"
        }
      },
      {
        "targets": [
          "172.30.3.177:9100"
        ],
        "labels": {
          "group": "develop"
        }
      }
    ]
    

    target_cus.json

    [
        {
            "targets": [
                "172.30.1.129:9000"
            ]
        }
    ]
    

    변경한 SD Config파일로 Prometheus 서버 실행하기

    변경 작성을 완료 하였다면 변경한 파일로 서버를 실행시켜 주시면 됩니다.

    ./prometheus --config.file=prometheus_sd.yml
    

    홈페이지에 들어가 보아도 Target이 잘 Scrape 된것을 확인할 수 있습니다.

     

    File_SD의 단점

    File형 Service Discovery에서 단점이 두가지 있다고 한다. 첫 번째는 file은 꼭 서버에서 경로로 지정 돼 기 때문에 file자체가 서버 안에 있어야 한다는 점, 두 번째는 수정할 때 꼭 사용자가 서버에 붙어야 한다는 점

     

    Http_SD??

    Prometheus는 File Service Discovery의 단점을 극복하기 위해 Http형태의 Service Discovery를 지원한다고 합니다. 아래 형태의 json파일을 Content-Type: application/jsonHTTP 헤더 형식으로 보내주면 된다고 한다.

    [
        {
            "targets": ["10.0.10.2:9100"],
            "labels": {
                "datacenter": "london",
                "hostname": "frontend03"
            }
        },
        {
            "targets": ["10.0.10.4:9100"],
            "labels": {
                "datacenter": "london",
                "hostname": "frontend04"
            }
        }
    ]
    

    config파일은 아래와 같이 작성 Http_sd_configs로 변경해주면 된다.

    <...>
    scrape_configs:
    - job_name: mycmdb
      http_sd_configs:
      - url: <http://mycmdb.internal/prometheus-sd-targets>
    

    인증도 쉽게 추가할 수 있는데 아래는 TLS를 넣은 경우이다

    scrape_configs:
    - job_name: mycmdb
      http_sd_configs:
      - url: <https://mycmdb.internal/prometheus-sd-targets>
        basic_auth:
            username: prometheus
            password: changeme
    

    마치며

    Prometheus Service Discovery에 대해 알아보았는데, 역시 동적으로 관리되는 경우가 제일 현명한 방법이지 않나 싶고, 오버스펙 하지 않고 적당 한 선에서 결정을 하는 게 좋은 것 같다

     

     

     

     

     

     

     

     

     

     

    참고문헌

    https://prometheus.io/docs/guides/file-sd/

    https://inuits.eu/blog/prometheus-http-service-discovery/

     

     

    반응형

    댓글

Designed by Tistory.