서비스 정의

서비스 정의 (Define services)

이 주제에서는 다른 서비스가 검색할 수 있도록 서비스를 정의하는 방법을 설명해요. 자세한 내용은 Services Overview를 참조하세요.

출처: 문서

본문

이 주제에서는 다른 서비스가 검색할 수 있도록 서비스를 정의하는 방법을 설명합니다. 자세한 내용은 Services Overview를 참조하세요.

개요 (Overview)

네트워크에 배포한 서비스를 검색 가능하게 하려면 Consul에 알려야 합니다. 구성 파일에서 서비스를 정의하거나 /agent/service/register API 엔드포인트에 서비스 정의 매개변수를 페이로드로 보낼 수 있습니다. Consul에 서비스를 등록하는 방법에 대한 자세한 내용은 Register Services and Health Checks를 참조하세요.

service 블록을 사용하여 여러 서비스를 개별적으로 정의하거나 여러 서비스를 동일한 services 구성 블록으로 그룹화할 수 있습니다. 자세한 내용은 Define multiple services in a single file을 참조하세요.

네트워크에서 Consul 서비스 메시가 활성화된 경우 service defaults 구성 항목을 사용하여 서비스에 대한 기본 전역 값을 지정할 수 있습니다. 이 구성 항목을 사용하면 업스트림, namespace, 파티션과 같은 공통 서비스 매개변수를 정의할 수 있습니다. 자세한 내용은 Define service defaults를 참조하세요.

요구 사항 (Requirements)

핵심 서비스 검색 기능은 모든 Consul 버전에서 사용할 수 있습니다.

Service defaults (Service defaults)

service defaults 구성 항목을 사용하려면 설치가 다음 요구 사항을 충족하는지 확인하세요:

  • Consul 1.5.0+
  • Kubernetes에서 ServiceDefaults 사용자 지정 리소스를 사용하려면 Consul 1.8.4+ 필요

ACL

ACL이 활성화된 경우 네트워크의 리소스는 service defaults 구성 항목을 읽으려면 service:read 액세스가 있는 토큰을 제시해야 합니다.

service defaults 구성 항목을 만들거나, 업데이트하거나, 삭제하려면 service:write 액세스가 있는 토큰도 제시해야 합니다.

서비스 구성에는 안티 엔트로피 동기화 및 등록 취소 작업을 수행하기 위한 ACL 토큰도 포함되어 제시되어야 합니다. 자세한 내용은 Modify anti-entropy synchronization을 참조하세요.

Consul Enterprise에서 서비스의 ACL 토큰이 namespace로 범위가 지정된 경우 특정 namespace로 서비스를 등록할 수 있습니다. 서비스 정의로 등록된 서비스는 token 필드에 지정된 ACL 토큰과 연결된 namespace를 상속하지 않습니다. 서비스가 ACL 토큰의 범위인 namespace에 등록되려면 namespace와 token 매개변수가 서비스 정의에 포함되어야 합니다.

서비스 정의 (Define a service)

서비스 구성용 파일을 만들고 service 블록을 추가합니다. service 블록에는 네트워크의 다른 서비스가 발견하는 방법을 포함하여 서비스의 다양한 측면을 구성하는 매개변수가 포함됩니다. 유일한 필수 매개변수는 name입니다. 구성 옵션에 대한 자세한 내용은 Service Definition Reference를 참조하세요.

Kubernetes 환경의 경우 Consul Helm 차트에서 connectInject 구성을 활성화하여 Consul이 각 포드에 사이드카를 자동으로 추가하도록 할 수 있습니다. Consul은 Kubernetes Service 정의를 참조로 사용합니다.

다음 예제는 포트 80에서 사용할 수 있는 redis라는 서비스를 정의합니다. 기본적으로 서비스는 에이전트 노드의 IP 주소를 갖습니다.

HCL (service.hcl):

service {
  name = "redis"
  id   = "redis"
  port = 80
  tags = ["primary"]

  meta = {
    custom_meta_key = "custom_meta_value"
  }

  tagged_addresses = {
    lan = {
      address = "192.168.0.55"
      port    = 8000
    }

    wan = {
      address = "198.18.0.23"
      port    = 80
    }
  }
}

JSON (service.json):

{
  "service": [
    {
      "id": "redis",
      "meta": [
        {
          "custom_meta_key": "custom_meta_value"
        }
      ],
      "name": "redis",
      "port": 80,
      "tagged_addresses": [
        {
          "lan": [
            {
              "address": "192.168.0.55",
              "port": 8000
            }
          ],
          "wan": [
            {
              "address": "198.18.0.23",
              "port": 80
            }
          ]
        }
      ],
      "tags": [
        "primary"
      ]
    }
  ]
}

상태 검사 (Health checks)

서비스의 상태를 모니터링하는 하나 이상의 상태 검사를 정의하려면 서비스 구성에 check 또는 checks 블록을 추가할 수 있습니다. 자세한 내용은 Define Health Checks를 참조하세요.

서비스 등록 (Register a service)

consul services 명령을 사용하거나 /agent/services API 엔드포인트를 호출하여 서비스를 등록할 수 있습니다. 자세한 내용은 Register Services and Health Checks를 참조하세요.

Service defaults 정의 (Define service defaults)

네트워크에서 Consul 서비스 메시가 활성화된 경우 service-defaults 구성 항목을 만들고 적용하여 메시의 서비스에 대한 기본값을 정의할 수 있습니다. 자세한 내용은 Service Mesh Configuration Overview를 참조하세요.

구성 항목용 파일을 만들고 필수 필드를 지정합니다. HCL 또는 JSON에서 service-defaults를 작성하는 경우 Kind와 Name 필드가 필요합니다. Kubernetes에서는 apiVersion, kind, metadata.name 필드가 필요합니다. 구성 옵션에 대한 자세한 내용은 Service Defaults Reference를 참조하세요.

Consul Enterprise를 사용하는 경우 Namespace 및 Partition 필드를 지정하여 특정 namespace 또는 파티션의 서비스에 구성을 적용할 수 있습니다. Kubernetes 환경의 경우 구성 항목은 항상 Kubernetes 클러스터와 동일한 파티션에 생성됩니다.

Consul CE 예제 (Consul CE example)

다음 예제는 counting이라는 서비스가 mesh 게이트웨이에 최대 512개의 동시 요청을 보내도록 지시합니다.

HCL:

Kind = "service-defaults"
Name = "counting"

UpstreamConfig = {
  Defaults = {
    MeshGateway = {
      Mode = "local"
    }
    Limits = {
      MaxConnections = 512
      MaxPendingRequests = 512
      MaxConcurrentRequests = 512
    }
  }

  Overrides = [
    {
      Name = "dashboard"
      MeshGateway = {
        Mode = "remote"
      }
    }
  ]
}

Kubernetes YAML:

apiVersion: consul.hashicorp.com/v1alpha1
kind: ServiceDefaults
metadata:
  name: counting
spec:
  upstreamConfig:
    defaults:
      meshGateway:
        mode: local
      limits:
        maxConnections: 512
        maxPendingRequests: 512
        maxConcurrentRequests: 512
    overrides:
      - name: dashboard
        meshGateway:
          mode: remote

JSON:

{
  "Kind": "service-defaults",
  "Name": "counting",
  "UpstreamConfig": {
    "Defaults": {
      "MeshGateway": {
        "Mode": "local"
      },
      "Limits": {
        "MaxConnections": 512,
        "MaxPendingRequests": 512,
        "MaxConcurrentRequests": 512
      }
    },
    "Overrides": [
      {
        "Name": "dashboard",
        "MeshGateway": {
          "Mode": "remote"
        }
      }
    ]
  }
}

Consul Enterprise 예제 (Consul Enterprise example)

다음 예제는 prod namespace의 counting이라는 서비스가 mesh 게이트웨이에 최대 512개의 동시 요청을 보내도록 지시합니다.

HCL:

Kind = "service-defaults"
Name = "counting"
Namespace = "prod"

UpstreamConfig = {
  Defaults = {
    MeshGateway = {
      Mode = "local"
    }
    Limits = {
      MaxConnections = 512
      MaxPendingRequests = 512
      MaxConcurrentRequests = 512
    }
  }

  Overrides = [
    {
      Name = "dashboard"
      MeshGateway = {
        Mode = "remote"
      }
    }
  ]
}

Kubernetes YAML:

apiVersion: consul.hashicorp.com/v1alpha1
kind: ServiceDefaults
metadata:
  name: counting
  namespace: prod
spec:
  upstreamConfig:
    defaults:
      meshGateway:
        mode: local
      limits:
        maxConnections: 512
        maxPendingRequests: 512
        maxConcurrentRequests: 512
    overrides:
      - name: dashboard
        meshGateway:
          mode: remote

JSON:

{
  "Kind": "service-defaults",
  "Name": "counting",
  "Namespace" : "prod",
  "UpstreamConfig": {
    "Defaults": {
      "MeshGateway": {
        "Mode": "local"
      },
      "Limits": {
        "MaxConnections": 512,
        "MaxPendingRequests": 512,
        "MaxConcurrentRequests": 512
      }
    },
    "Overrides": [
      {
        "Name": "dashboard",
        "MeshGateway": {
          "Mode": "remote"
        }
      }
    ]
  }
}

Service defaults 적용 (Apply service defaults)

consul config 명령을 사용하거나 /config API 엔드포인트를 호출하여 service-defaults 구성 항목을 적용할 수 있습니다. Kubernetes 환경에서는 service-defaults 사용자 지정 리소스 정의(CRD)를 적용하여 Consul 구성 항목을 구현하고 관리합니다.

구성 항목 적용에 대한 자세한 내용은 다음 주제를 참조하세요:

단일 파일에서 여러 서비스 정의 (Define multiple services in a single file)

services 블록은 service 객체의 배열을 포함합니다. 서비스 정의에 여러 서비스를 정의하고 Consul이 단일 서비스 구성만 기대하지 않도록 지시할 수 있게 해주는 래퍼입니다. 결과적으로 단일 consul services register 명령으로 여러 서비스를 등록할 수 있습니다. /agent/service/register API 엔드포인트는 services 매개변수를 지원하지 않습니다.

다음 예제에서 서비스 정의는 포트 6000에서 실행되는 primary로 태그된 redis 서비스 인스턴스를 구성합니다. 또한 포트 7000에서 실행되는 secondary로 태그된 서비스 인스턴스를 구성합니다.

Multiple Service Definitions

HCL (redis-services.hcl):

services {
  id = "red0"
  name = "redis"
  tags = [
    "primary"
  ]
  address = ""
  port = 6000
  checks = [
    {
      args = ["/bin/check_redis", "-p", "6000"]
      interval = "5s"
      timeout = "20s"
    }
  ]
}
services {
  id = "red1"
  name = "redis"
  tags = [
    "delayed",
    "secondary"
  ]
  address = ""
  port = 7000
  checks = [
    {
      args = ["/bin/check_redis", "-p", "7000"]
      interval = "30s"
      timeout = "60s"
    }
  ]
}

JSON (redis-services.json):

{
  "services": [
    {
      "id": "red0",
      "name": "redis",
      "tags": [
        "primary"
      ],
      "address": "",
      "port": 6000,
      "checks": [
        {
          "args": ["/bin/check_redis", "-p", "6000"],
          "interval": "5s",
          "timeout": "20s"
        }
      ]
    },
    {
      "id": "red1",
      "name": "redis",
      "tags": [
        "delayed",
        "secondary"
      ],
      "address": "",
      "port": 7000,
      "checks": [
        {
          "args": ["/bin/check_redis", "-p", "7000"],
          "interval": "30s",
          "timeout": "60s"
        }
      ]
    }
  ]
}

안티 엔트로피 동기화 수정 (Modify anti-entropy synchronization)

기본적으로 Consul 에이전트는 안티 엔트로피 메커니즘을 사용하여 서비스 및 서비스 상태에 대한 정보를 유지하고 로컬 상태를 Consul 카탈로그와 동기화합니다. 서비스 구성에서 enable_tag_override 옵션을 활성화하여 외부 에이전트가 서비스의 태그를 변경할 수 있게 할 수 있습니다. 이는 외부 모니터링 서비스가 태그 정보의 원천이어야 하는 상황에서 유용할 수 있습니다. 자세한 내용은 Anti-entropy를 참조하세요.

service 블록에 enable_tag_override 옵션을 추가하고 값을 true로 설정하세요:

HCL:

service {
  name = "redis"
  port = 6379
  enable_tag_override = true
}

JSON:

{
  "service": {
    "name": "redis",
    "port": 6379,
    "enable_tag_override": true
  }
}

이 구성은 로컬로 등록된 서비스에만 적용됩니다. 동일한 서비스를 등록하는 노드는 enable_tag_override 및 기타 서비스 구성을 독립적으로 적용합니다. 한 노드에 등록된 서비스의 태그 업데이트는 다른 노드에 등록된 같은 이름의 서비스에 수행된 작업의 영향을 받지 않습니다.

추가 구성 정보는 enable_tag_override를 참조하세요.

서비스 메시 환경의 서비스 (Services in service mesh environments)

가상 머신과 Kubernetes에서 서비스 메시 환경용 서비스를 정의하려면 다른 워크플로우가 필요합니다.

서비스 메시 프록시 정의 (Define service mesh proxies)

서비스를 서비스 메시 또는 사이드카 프록시로 기능하도록 등록하여 네트워크 전반에 걸쳐 다른 서비스 간의 통신을 촉진할 수 있습니다. 자세한 내용은 Service Mesh Proxy Overview를 참조하세요.

Kubernetes에서 서비스 정의 (Define services in Kubernetes)

Kubernetes에서 실행 중인 서비스와 Consul이 자동으로 동기화되도록 활성화할 수 있습니다. 이렇게 하면 Kubernetes 서비스가 Consul 에이전트 및 서비스에 제공되고, Consul의 서비스가 일급(first-class) Kubernetes 서비스로 제공될 수 있습니다. 자세한 내용은 Service Sync for Consul on Kubernetes을 참조하세요.

더 알아보기 (Learn more)