Consul 외부 서비스 모니터(ESM)

Consul 외부 서비스 모니터(ESM) (Consul External Service Monitor)

이 페이지는 Consul 외부 서비스 모니터(ESM)를 사용해 외부 서비스를 등록하고 헬스 체크를 수행하는 과정을 설명해요.

출처: 문서

본문

이 페이지는 Consul 외부 서비스 모니터(ESM)를 사용해 외부 서비스를 등록하고 헬스 체크를 수행하는 과정을 설명해요. Consul ESM은 Consul 에이전트를 직접 실행할 수 없는 타사 SaaS 서비스와 다른 환경에서 실행되는 서비스 같은 외부 서비스의 등록과 디스커버리를 가능하게 해요.

Consul ESM에 대해 더 알아보고 전체 기능을 관찰하려면 ESM으로 외부 서비스 등록 및 모니터링 튜토리얼을 완료해요. 도구에 대한 자세한 내용은 GitHub의 Consul ESM 프로젝트를 참고해요.

소개 (Introduction)

Consul ESM은 외부 노드를 헬스 체크하고 카탈로그에서 상태를 업데이트하기 위해 Consul과 함께 실행되는 데몬이에요. 이를 통해 외부 등록된 서비스와 검사가 로컬 Consul 에이전트에 등록된 것처럼 동일한 기능에 접근할 수 있어요. 가용성을 위해 ESM 인스턴스를 여러 개 실행할 수 있어요. ESM은 Consul에서 잠금(lock)을 보유해 리더 선거를 수행해요. 그러면 리더가 Consul에서 카탈로그 업데이트를 계속 감시하고 발견한 모든 외부 노드에 정의된 헬스 체크를 수행해요.

Consul ESM은 별도의 VM 또는 컨테이너에 설치해야 해요. Consul ESM은 각 외부 서비스의 현재 상태와 위치 정보를 쿼리한 다음 업데이트를 Consul 서버로 보내요. Consul v1.21부터 Consul ESM과 같은 노드에 Consul 에이전트를 설치할 필요가 없으며, Consul ESM과 서버 간 가십 통신의 필요성이 제거됐어요.

Consul ESM 설치 (Install Consul ESM)

Consul ESM은 단일 바이너리로 제공돼요. 설치하려면 시스템용 최신 Consul ESM 릴리스를 다운로드하고 PATH에서 사용할 수 있게 해요.

새 터미널을 열고 consul-esm으로 Consul ESM을 시작해요.

$ consul-esm

2025-04-23T14:16:02.835-0700 [INFO]  consul-esm: Connecting to Consul: address=127.0.0.1:8500
Consul ESM running!
            Datacenter: (default)
             Partition: ""
               Service: "consul-esm"
           Service Tag: ""
            Service ID: "consul-esm:53b0c771-5a5b-eb75-90e9-2ece0f161b74"
Node Reconnect Timeout: "72h0m0s"
   Disable coordinates: false
        Statsd address: ""
         Metrix prefix: ""

Log data will now stream in as it occurs:

2025-04-23T14:16:02.908-0700 [INFO]  consul-esm: Trying to obtain leadership...
2025-04-23T14:16:02.911-0700 [INFO]  consul-esm: Obtained leadership
2025-04-23T14:16:02.914-0700 [INFO]  consul-esm: Updating external node list: items=0
2025-04-23T14:16:03.933-0700 [INFO]  consul-esm: Rebalanced external nodes across ESM instances: nodes=0 instances=1
2025-04-23T14:16:03.935-0700 [INFO]  consul-esm: Fetched nodes from catalog: count=0

인터넷 제공자가 UDP 핑을 허용하지 않으면 구성 파일에서 ping_type = "socket"을 설정하고 해당 구성 파일로 consul-esm을 실행해야 할 수 있어요. macOS를 사용한다면 sudo로 실행해야 해요:

$ sudo consul-esm -config-file=./consul-esm.hcl

Consul ESM용 서비스 정의 (Define a service for Consul ESM)

Consul ESM을 사용해 서비스를 등록하려면 서비스와 헬스 체크를 정의해야 해요. 다음 예시는 외부 데이터베이스 서비스에 대한 서비스 정의를 보여줘요:

{
  "Datacenter": "$CONSUL_DATACENTER",
  "Node": "hashicups-db-0-ext",
  "ID": "`cat /proc/sys/kernel/random/uuid`",
  "Address": "${IP_HASHICUPS_DB_0}",
  "NodeMeta": {
    "external-node": "true",
    "external-probe": "true"
  },
  "Service": {
    "ID": "hashicups-db-0",
    "Service": "hashicups-db",
    "Tags": [
      "external",
      "inst_0"
    ],
    "Address": "${IP_HASHICUPS_DB_0}",
    "Port": 5432
  },
  "Checks": [{
    "CheckID": "hashicups-db-0-check",
    "Name": "hashicups-db check",
    "Status": "critical",
    "ServiceID": "hashicups-db-0",
    "Definition": {
      "TCP": "${IP_HASHICUPS_DB_0}:5432",
      "Interval": "5s",
      "Timeout": "1s",
      "DeregisterCriticalServiceAfter": "60m"
     }
  }]
}

이 구성에서 Consul ESM에 대해 다음 요구 사항을 확인해요:

  • 로컬 Consul 에이전트가 없는 노드를 정의하므로 Consul이 노드와 서비스를 등록할 위치를 알도록 Datacenter 값을 포함해야 해요.
  • 노드는 Node, ID, Address 매개변수로 식별돼요.
  • NodeMeta 매개변수는 consul-esm이 주기적 헬스 체크가 필요한 외부 노드를 식별하는 데 필요해요.
    • Consul ESM이 외부 노드와 헬스 체크를 감지하려면 노드를 등록하기 전에 노드 메타데이터에서 "external-node": "true"를 설정해요.
    • external-probe 필드는 Consul ESM이 노드에 대한 정기 핑을 수행해 헬스 상태를 업데이트할지 여부를 결정해요.

서비스 구성 매개변수의 전체 목록은 서비스 구성 참조와 헬스 체크 구성 참조를 참고해요.

서비스 등록 (Register a service)

consul services register 명령을 사용하거나 /v1/catalog/register HTTP API 엔드포인트에 PUT 요청을 보내 외부 서비스를 등록해요.

ESM이 실행되기 전에 외부 서비스를 Consul에 등록할 수 있어요. 그러나 ESM이 실행되고 헬스 체크를 수행할 수 있을 때까지 외부 서비스는 critical 상태로 카탈로그에 나타나요.

더 알아보기 (Learn more)