Traefik TCP 서비스 문서
본문
Service
일반
서비스 섹션의 각 필드는 한 종류의 서비스를 나타내요. 즉, 지정된 각 서비스에 대해 어떤 종류의 서비스가 생성되는지 정의하려면 필드 중 하나(단 하나만)를 활성화해야 해요. 현재 사용 가능한 두 종류는 LoadBalancer 와 Weighted 에요.
Servers 로드 밸런서
servers 로드 밸런서는 동일한 서비스의 서버들 사이에서 요청을 균형 있게 분배하는 역할을 해요.
설정 예시
두 서버로 서비스 선언하기 -- 파일 프로바이더 사용
구조화 (YAML)
tcp:
services:
my-service:
loadBalancer:
servers:
- address: "xx.xx.xx.xx:xx"
- address: "xx.xx.xx.xx:xx"
healthCheck:
send: "PING"
expect: "PONG"
interval: "10s"
timeout: "3s"
serversTransport: "customTransport@file"
구조화 (TOML)
[tcp.services]
[tcp.services.my-service.loadBalancer]
[[tcp.services.my-service.loadBalancer.servers]]
address = "xx.xx.xx.xx:xx"
[[tcp.services.my-service.loadBalancer.servers]]
address = "xx.xx.xx.xx:xx"
[tcp.services.my-service.loadBalancer.healthCheck]
send = "PING"
expect = "PONG"
interval = "10s"
timeout = "3s"
serversTransport = "customTransport@file"
Labels
labels:
- "traefik.tcp.services.my-service.loadBalancer.healthCheck.send=PING"
- "traefik.tcp.services.my-service.loadBalancer.healthCheck.expect=PONG"
- "traefik.tcp.services.my-service.loadBalancer.healthCheck.interval=10s"
- "traefik.tcp.services.my-service.loadBalancer.healthCheck.timeout=3s"
- "traefik.tcp.services.my-service.loadBalancer.serversTransport=customTransport@file"
Tags
{
"Tags": [
"traefik.tcp.services.my-service.loadBalancer.healthCheck.send=PING",
"traefik.tcp.services.my-service.loadBalancer.healthCheck.expect=PONG",
"traefik.tcp.services.my-service.loadBalancer.healthCheck.interval=10s",
"traefik.tcp.services.my-service.loadBalancer.healthCheck.timeout=3s",
"traefik.tcp.services.my-service.loadBalancer.serversTransport=customTransport@file"
]
}
설정 옵션
| 필드 | 설명 | 기본값 |
| servers | 서버는 프로그램의 단일 인스턴스를 선언해요. | "" |
| servers.address | address 옵션(IP:Port)은 특정 인스턴스를 가리켜요. | "" |
| servers.tls | tls 옵션은 백엔드와 다이얼할 때 TLS를 사용할지 여부를 결정해요. | false |
| serversTransport | serversTransport 는 Traefik과 서버 사이의 통신을 위한 TCP ServersTransport 구성을 참조할 수 있게 해줘요. serversTransport를 지정하지 않으면 default@internal 이 사용돼요. | "" |
| healthCheck | 비정상 서버를 로드 밸런싱 순환에서 제거하는 헬스 체크를 구성해요. 자세한 내용은 HealthCheck를 참고하세요. | |
헬스 체크
healthCheck 옵션은 비정상 서버를 로드 밸런싱 순환에서 제거하는 헬스 체크를 구성해요.
Traefik은 대상 서버에 대한 연결이 성공하는 한 TCP 서버를 정상으로 간주해요.
고급 헬스 체크를 위해 send 와 expect 매개변수를 지정해 TCP 페이로드 교환을 구성할 수 있어요.
상태 변경(예: 이 서비스의 모든 서버가 다운됨)을 위로 전파하려면 이 서비스의 상위 서비스에도 HealthCheck가 활성화되어 있어야 해요.
헬스 체크 메커니즘에 사용할 수 있는 옵션은 다음과 같아요:
| 필드 | 설명 | 기본값 | 필수 |
| port | 헬스 체크 엔드포인트의 서버 주소 포트를 대체해요. | | 아니요 |
| send | 헬스 체크 중에 서버로 보낼 페이로드를 정의해요. | "" | 아니요 |
| expect | 서버로부터 기대하는 응답 페이로드를 정의해요. | "" | 아니요 |
| interval | 정상 대상에 대한 헬스 체크 호출 빈도를 정의해요. | 30s | 아니요 |
| unhealthyInterval | 비정상 대상에 대한 헬스 체크 호출 빈도를 정의해요. 정의하지 않으면 interval 값으로 기본 설정돼요. | - | 아니요 |
| timeout | Traefik이 서버를 비정상으로 간주하기 전에 헬스 체크 연결을 기다릴 최대 기간을 정의해요. | 5s | 아니요 |
Weighted Round Robin
Weighted Round Robin(별칭 WRR) 서비스 로드 밸런서는 제공된 가중치를 기준으로 여러 서비스 사이에서 연결을 균형 있게 분배하는 역할을 해요.
이 전략은 서버 사이가 아니라 서비스 사이에서만 로드 밸런싱에 사용할 수 있어요.
지원되는 프로바이더
이 전략은 현재 파일 프로바이더로 정의할 수 있어요.
가중치
가중치는 음수가 아닌 정수여야 하며, 0 가중치는 하위 서비스를 순환에서 제외해요.
음수 가중치를 선언하는 가중 서비스는 비활성화되고, 이를 참조하는 라우터는 생성되지 않아요.
구조화 (YAML)
tcp:
services:
app:
weighted:
services:
- name: appv1
weight: 3
- name: appv2
weight: 1
appv1:
loadBalancer:
servers:
- address: "xxx.xxx.xxx.xxx:8080"
appv2:
loadBalancer:
servers:
- address: "xxx.xxx.xxx.xxx:8080"
구조화 (TOML)
[tcp.services]
[tcp.services.app]
[[tcp.services.app.weighted.services]]
name = "appv1"
weight = 3
[[tcp.services.app.weighted.services]]
name = "appv2"
weight = 1
[tcp.services.appv1]
[tcp.services.appv1.loadBalancer]
[[tcp.services.appv1.loadBalancer.servers]]
address = "private-ip-server-1:8080/"
[tcp.services.appv2]
[tcp.services.appv2.loadBalancer]
[[tcp.services.appv2.loadBalancer.servers]]
address = "private-ip-server-2:8080/"
헬스 체크
HealthCheck는 이 서비스에 대한 자동 자체 헬스 체크를 활성화해요. 즉, 하위 서비스 중 하나가 다운으로 보고될 때마다 이 서비스가 이를 인지하고 로드 밸런싱 알고리즘을 실행할 때 고려해요(즉 다운된 하위 서비스를 무시해요).
또한 이 서비스의 상위 서비스에도 HealthCheck가 활성화되어 있으면 이 서비스는 상위 서비스에 상태 변경을 보고해요.
동작
주어진 서비스에 HealthCheck가 활성화되어 있는데 그 하위 서비스 중 하나에 활성화되어 있지 않으면 서비스 생성이 실패해요.
Weighted 서비스의 HealthCheck는 현재 파일 프로바이더로만 정의할 수 있어요.
구조화 (YAML)
## Dynamic configuration
tcp:
services:
app:
weighted:
healthCheck: {}
services:
- name: appv1
weight: 3
- name: appv2
weight: 1
appv1:
loadBalancer:
healthCheck:
send: "PING"
expect: "PONG"
interval: 10s
timeout: 3s
servers:
- address: "192.168.1.10:6379"
appv2:
loadBalancer:
healthCheck:
send: "PING"
expect: "PONG"
interval: 10s
timeout: 3s
servers:
- address: "192.168.1.11:6379"
구조화 (TOML)
## Dynamic configuration
[tcp.services]
[tcp.services.app]
[tcp.services.app.weighted.healthCheck]
[[tcp.services.app.weighted.services]]
name = "appv1"
weight = 3
[[tcp.services.app.weighted.services]]
name = "appv2"
weight = 1
[tcp.services.appv1]
[tcp.services.appv1.loadBalancer]
[tcp.services.appv1.loadBalancer.healthCheck]
send = "PING"
expect = "PONG"
interval = "10s"
timeout = "3s"
[[tcp.services.appv1.loadBalancer.servers]]
address = "192.168.1.10:6379"
[tcp.services.appv2]
[tcp.services.appv2.loadBalancer]
[tcp.services.appv2.loadBalancer.healthCheck]
send = "PING"
expect = "PONG"
interval = "10s"
timeout = "3s"
[[tcp.services.appv2.loadBalancer.servers]]
address = "192.168.1.11:6379"