본문 바로가기
WIKI 기술 지식 베이스

Traefik Nomad 서비스 발견 라우팅

원문 보기 위키 갱신

출처: Traefik Nomad Service Discovery Routing

본문

Traefik and Nomad 서비스 발견

Traefik의 가장 좋은 기능 중 하나는 라우팅 구성을 애플리케이션 레벨에 위임하는 것이에요. Nomad에서는 Traefik이 서비스에 붙은 태그를 활용해 라우팅 규칙을 생성할 수 있어요.

태그와 민감 데이터

태그에 민감 데이터(인증서, 자격 증명 등)를 저장하지 않는 것을 권장해요. 대신 민감 데이터는 더 안전한 저장소(secret, 파일 등)에 보관하는 것을 권장해요.

설정 예시

Nomad 구성 & 서비스 하나 배포/노출하기 nomad 프로바이더 활성화하기

Structured (YAML)

providers:
  nomad: {}

Structured (TOML)

[providers.nomad]

CLI

--providers.nomad=true

서비스에 태그 붙이기 (Nomad job 파일에서)

job "my-service" {
  datacenters = ["dc1"]

  group "web" {
    task "app" {
      driver = "docker"

      service {
        name = "my-service"
        tags = [
          "traefik.http.routers.my-service.rule=Host(`example.com`)",
        ]
      }
    }
  }
}

컨테이너에 사용자 지정 포트 지정하기 http://example.com 에 대한 요청을 http://:12345 로 전달해요:

job "my-service" {
  datacenters = ["dc1"]

  group "web" {
    task "app" {
      driver = "docker"

      service {
        name = "my-service"
        tags = [
          "traefik.http.routers.my-service.rule=Host(`example.com`)",
          "traefik.http.routers.my-service.service=my-service",
          "traefik.http.services.my-service.loadbalancer.server.port=12345",
        ]
      }
    }
  }
}

Traefik이 잘못된 포트에 연결: HTTP/502 Gateway Error

기본적으로 Traefik은 컨테이너의 첫 번째 노출된 포트를 사용해요.

traefik.http.services.xxx.loadbalancer.server.port 태그를 설정하면 그 동작이 재정의돼요.

컨테이너당 여러 개의 라우터와 서비스 지정하기 컨테이너의 둘 이상의 포트로 요청을 전달하려면 라우터의 service 매개변수를 사용해 서비스 로드밸런서 포트 정의를 참조해야 해요.

이 예시에서는 http://example-a.com 요청을 http://:8000 으로, http://example-b.com 요청을 http://:9000 으로 전달해요:

job "my-service" {
  datacenters = ["dc1"]

  group "web" {
    task "app" {
      driver = "docker"

      service {
        name = "my-service"
        tags = [
          "traefik.http.routers.www-router.rule=Host(`example-a.com`)",
          "traefik.http.routers.www-router.service=www-service",
          "traefik.http.services.www-service.loadbalancer.server.port=8000",
          "traefik.http.routers.admin-router.rule=Host(`example-b.com`)",
          "traefik.http.routers.admin-router.service=admin-service",
          "traefik.http.services.admin-service.loadbalancer.server.port=9000",
        ]
      }
    }
  }
}

설정 옵션

Tags

태그는 대소문자를 구분하지 않아요.

TLS 기본 생성 인증서

Traefik 기본 생성 인증서를 구성하는 방법은 TLS 인증서 페이지를 참고하세요.

일반

Traefik은 각 Nomad 서비스에 대해 해당하는 Traefik 서비스와 라우터를 생성해요.

Traefik 서비스는 이 Nomad 서비스의 인스턴스마다 자동으로 서버를 가지며, 라우터에는 Nomad 서비스 이름을 기반으로 한 기본 규칙이 자동으로 연결돼요.

Router

서비스에 자동으로 연결된 Router의 구성을 업데이트하려면 traefik.routers.{원하는 이름}. 으로 시작하고 변경할 옵션이 뒤따르는 태그를 추가하세요.

예를 들어 규칙을 변경하려면 traefik.http.routers.my-service.rule=Host(example.com) 태그를 추가하면 돼요.

설정 옵션

| Label | Description | Value | | traefik.http.routers..rule | 자세한 내용은 rule을 참고하세요. | Host(example.com) | | traefik.http.routers..ruleSyntax | 자세한 내용은 ruleSyntax를 참고하세요. RuleSyntax 옵션은 더 이상 사용되지 않으며 다음 메이저 버전에서 제거될 예정이에요. 이 필드를 사용하지 말고 라우터 규칙을 v3 문법으로 다시 작성해 주세요. | v3 | | traefik.http.routers..entrypoints | 자세한 내용은 엔트리 포인트를 참고하세요. | web,websecure | | traefik.http.routers..middlewares | 자세한 내용은 미들웨어 개요를 참고하세요. | auth,prefix,cb | | traefik.http.routers..service | 자세한 내용은 서비스를 참고하세요. | myservice | | traefik.http.routers..tls | 자세한 내용은 tls를 참고하세요. | true | | traefik.http.routers..tls.certresolver | 자세한 내용은 certResolver를 참고하세요. | myresolver | | traefik.http.routers..tls.domains[n].main | 자세한 내용은 도메인을 참고하세요. | example.org | | traefik.http.routers..tls.domains[n].sans | 자세한 내용은 도메인을 참고하세요. | test.example.org,dev.example.org | | traefik.http.routers..tls.options | 자세한 내용은 TLS 옵션을 참고하고, 여러 라우터가 같은 호스트 이름을 제공할 때는 TLS 옵션 충돌을 참고하세요. | foobar | | traefik.http.routers..priority | 자세한 내용은 우선순위를 참고하세요. | 42 | | traefik.http.routers..observability.accesslogs | accessLogs 옵션은 라우터가 액세스 로그를 생성할지 여부를 제어해요. | true | | traefik.http.routers..observability.metrics | metrics 옵션은 라우터가 메트릭을 생성할지 여부를 제어해요. | true | | traefik.http.routers..observability.tracing | tracing 옵션은 라우터가 트레이스를 생성할지 여부를 제어해요. | true |

Service

서비스에 자동으로 연결된 Service의 구성을 업데이트하려면, traefik.http.services.{원하는 이름}. 으로 시작하고 변경할 옵션이 뒤따르는 태그를 추가하세요.

예를 들어 passHostHeader 동작을 변경하려면, traefik.http.services.{원하는 이름}.loadbalancer.passhostheader=false 태그를 추가하면 돼요.

설정 옵션

| Label | Description | Value | | traefik.http.services..loadbalancer.server.port | 포트를 등록해요. 서비스가 여러 포트를 노출할 때 유용해요. | 8080 | | traefik.http.services..loadbalancer.server.scheme | 기본 스킴을 재정의해요. | http | | traefik.http.services..loadbalancer.server.weight | 기본 가중치를 재정의해요. | 42 | | traefik.http.services..loadbalancer.serverstransport | 파일 프로바이더나 Kubernetes CRD 프로바이더로 정의된 ServersTransport 리소스를 참조할 수 있게 해줘요. 자세한 내용은 serverstransport를 참고하세요. | foobar@file | | traefik.http.services..loadbalancer.passhostheader | | true | | traefik.http.services..loadbalancer.healthcheck.headers. | 자세한 내용은 헬스 체크를 참고하세요. | foobar | | traefik.http.services..loadbalancer.healthcheck.hostname | 자세한 내용은 헬스 체크를 참고하세요. | example.org | | traefik.http.services..loadbalancer.healthcheck.interval | 자세한 내용은 헬스 체크를 참고하세요. | 10 | | traefik.http.services..loadbalancer.healthcheck.unhealthyinterval | 자세한 내용은 헬스 체크를 참고하세요. | 10 | | traefik.http.services..loadbalancer.healthcheck.path | 자세한 내용은 헬스 체크를 참고하세요. | /foo | | traefik.http.services..loadbalancer.healthcheck.status | 자세한 내용은 헬스 체크를 참고하세요. | 42 | | traefik.http.services..loadbalancer.healthcheck.port | 자세한 내용은 헬스 체크를 참고하세요. | 42 | | traefik.http.services..loadbalancer.healthcheck.scheme | 자세한 내용은 헬스 체크를 참고하세요. | http | | traefik.http.services..loadbalancer.healthcheck.timeout | 자세한 내용은 헬스 체크를 참고하세요. | 10 | | traefik.http.services..loadbalancer.healthcheck.followredirects | 자세한 내용은 헬스 체크를 참고하세요. | true | | traefik.http.services..loadbalancer.sticky.cookie | | true | | traefik.http.services..loadbalancer.sticky.cookie.httponly | | true | | traefik.http.services..loadbalancer.sticky.cookie.name | | foobar | | traefik.http.services..loadbalancer.sticky.cookie.path | | /foobar | | traefik.http.services..loadbalancer.sticky.cookie.secure | | true | | traefik.http.services..loadbalancer.sticky.cookie.samesite | | none | | traefik.http.services..loadbalancer.sticky.cookie.maxage | | 42 | | traefik.http.services..loadbalancer.responseforwarding.flushinterval | | 10 |

Middleware

traefik.http.middlewares.{원하는 이름}. 으로 시작하고 미들웨어 타입/옵션이 뒤따르는 태그를 사용해 미들웨어를 선언할 수 있어요.

예를 들어 my-redirect 라는 이름의 redirectscheme 미들웨어를 선언하려면 traefik.http.middlewares.my-redirect.redirectscheme.scheme: https 라고 쓰면 돼요.

사용 가능한 미들웨어에 대한 자세한 내용은 전용 미들웨어 섹션을 참고하세요.

미들웨어 선언 및 참조하기

# ...
# Declaring a middleware
traefik.http.middlewares.my-redirect.redirectscheme.scheme=https
# Referencing a middleware
traefik.http.routers.my-service.middlewares=my-redirect

선언 충돌

이름은 같은데 매개변수가 다른 미들웨어를 여러 개 선언하면 미들웨어 선언이 실패해요.

TCP

태그를 사용해 TCP Router 및/또는 Service를 선언할 수 있어요.

TCP Router와 Service 선언하기

traefik.tcp.routers.my-router.rule=HostSNI(`example.com`)
traefik.tcp.routers.my-router.tls=true
traefik.tcp.services.my-service.loadbalancer.server.port=4123

TCP와 HTTP

TCP Router/Service를 선언하면 Traefik이 HTTP Router/Service를 자동으로 생성하는 것을 막아요 (TCP Router/Service가 정의되지 않으면 기본적으로 생성하듯이요). 같은 Nomad 서비스에 TCP Router/Service와 HTTP Router/Service를 모두 선언할 수 있어요 (단, 수동으로 해야 해요).

TCP Router

설정 옵션 | Label | Description | Value | | traefik.tcp.routers..entrypoints | 자세한 내용은 엔트리 포인트를 참고하세요. | ep1,ep2 | | traefik.tcp.routers..rule | 자세한 내용은 rule을 참고하세요. | HostSNI(example.com) | | traefik.tcp.routers..ruleSyntax | 라우터별로 규칙을 파싱하는 데 사용할 규칙 문법을 구성해요. RuleSyntax 옵션은 더 이상 사용되지 않으며 다음 메이저 버전에서 제거될 예정이에요. 이 필드를 사용하지 말고 라우터 규칙을 v3 문법으로 다시 작성해 주세요. | v3 | | traefik.tcp.routers..priority | 자세한 내용은 우선순위를 참고하세요. | 42 | | traefik.tcp.routers..service | 자세한 내용은 서비스를 참고하세요. | myservice | | traefik.tcp.routers..tls | 자세한 내용은 TLS를 참고하세요. | true | | traefik.tcp.routers..tls.certresolver | 자세한 내용은 certResolver를 참고하세요. | myresolver | | traefik.tcp.routers..tls.domains[n].main | 자세한 내용은 TLS를 참고하세요. | example.org | | traefik.tcp.routers..tls.domains[n].sans | 자세한 내용은 TLS를 참고하세요. | test.example.org,dev.example.org | | traefik.tcp.routers..tls.options | 자세한 내용은 TLS를 참고하세요. | myoptions | | traefik.tcp.routers..tls.passthrough | 자세한 내용은 Passthrough를 참고하세요. | true |

TCP Service

설정 옵션 | Label | Description | Value | | traefik.tcp.services..loadbalancer.server.port | 애플리케이션의 포트를 등록해요. | 423 | | traefik.tcp.services..loadbalancer.server.tls | 백엔드와 다이얼할 때 TLS를 사용할지 여부를 결정해요. | true | | traefik.tcp.services..loadbalancer.serverstransport | 파일 프로바이더나 Kubernetes CRD 프로바이더로 정의된 ServersTransport 리소스를 참조할 수 있게 해줘요. 자세한 내용은 serverstransport를 참고하세요. | foobar@file |

TCP Middleware

traefik.tcp.middlewares.{원하는 이름}. 으로 시작하고 미들웨어 타입/옵션이 뒤따르는 태그를 사용해 미들웨어를 선언할 수 있어요.

예를 들어 test-inflightconn 이라는 이름의 InFlightConn 미들웨어를 선언하려면 traefik.tcp.middlewares.test-inflightconn.inflightconn.amount=10 이라고 쓰면 돼요.

사용 가능한 미들웨어에 대한 자세한 내용은 전용 미들웨어 섹션을 참고하세요.

미들웨어 선언 및 참조하기

# ...
# Declaring a middleware
traefik.tcp.middlewares.test-inflightconn.inflightconn.amount=10
# Referencing a middleware
traefik.tcp.routers.my-service.middlewares=test-inflightconn

선언 충돌

이름은 같은데 매개변수가 다른 미들웨어를 여러 개 선언하면 미들웨어 선언이 실패해요.

UDP

태그를 사용해 UDP Router 및/또는 Service를 선언할 수 있어요.

UDP Router와 Service 선언하기

traefik.udp.routers.my-router.entrypoints=udp
traefik.udp.services.my-service.loadbalancer.server.port=4123

UDP와 HTTP

UDP Router/Service를 선언하면 Traefik이 HTTP Router/Service를 자동으로 생성하는 것을 막아요 (UDP Router/Service가 정의되지 않으면 기본적으로 생성하듯이요). 같은 Nomad 서비스에 UDP Router/Service와 HTTP Router/Service를 모두 선언할 수 있어요 (단, 수동으로 해야 해요).

UDP Router

설정 옵션 | Label | Description | Value | | traefik.udp.routers..entrypoints | 자세한 내용은 엔트리 포인트를 참고하세요. | ep1,ep2 | | traefik.udp.routers..service | 자세한 내용은 서비스를 참고하세요. | myservice |

UDP Service

설정 옵션 | Label | Description | Value | | traefik.udp.services..loadbalancer.server.port | 애플리케이션의 포트를 등록해요. | 423 |

특정 프로바이더 옵션

| Label | Description | Value | | traefik.enable | traefik.enable 을 true 또는 false로 설정해 Traefik이 서비스를 고려할지(또는 하지 않을지) 지정할 수 있어요. 이 옵션은 exposedByDefault 값을 재정의해요. | true | | traefik.nomad.canary | Nomad 오케스트레이터가 Traefik의 (서비스 등록) 프로바이더일 때, Traefik 내에서 서비스의 Canary 인스턴스와 프로덕션 인스턴스를 구분해야 할 필요가 있을 수 있어요. 예를 들어 둘이 같은 로드 밸런서에 포함되는 것을 원하지 않는 경우예요. 따라서 이 옵션은 Nomad 서비스 스탠자의 canary_tags 필드 값 중 하나로 제공되도록 설계되었으며, Traefik이 연결된 인스턴스가 canary 인스턴스임을 식별할 수 있게 해줘요. | true |

포트 조회

Traefik은 기본 Nomad 서비스 발견(Nomad Service Discovery) 흐름을 따라 사용할 포트를 감지할 수 있어요. 즉, Nomad job에서 예를 들어 포트 :1337 만 노출하면 traefik이 이 포트를 집어서 사용해요.

더 알아보기 (Learn more)