Traefik Kubernetes Services
Traefik Kubernetes Services (TraefikService)
본문
TraefikService
TraefikService는 Kubernetes Service 위에 놓이는 커스텀 리소스예요. Kubernetes Service 사이의 가중치 라운드 로빈 로드 밸런싱, Highest Random Weight 로드 밸런싱, 미러링, 페일오버 같은 고급 로드 밸런싱 기능을 활성화해 줘요.
서비스는 들어오는 요청을 실제로 처리할 엔드포인트에 도달하는 방법을 구성해요. Traefik에서 대상 서비스는 파드를 노출하는 표준 Kubernetes service이거나 TraefikService일 수 있어요. 후자를 사용하면 다음과 같은 고급 로드 밸런싱 옵션을 결합할 수 있어요:
-
가중치 라운드 로빈 로드 밸런싱.
-
Highest Random Weight 로드 밸런싱.
-
미러링.
-
페일오버.
Weighted Round Robin (가중치 라운드 로빈)
WRR은 가중치를 기반으로 여러 서비스 사이에서 요청을 로드 밸런싱할 수 있어요. WRR TraefikService를 사용하면 Kubernetes Service와 다른 TraefikService 인스턴스(다른 WRR 서비스 또는 미러링 서비스) 사이에서 트래픽을 로드 밸런싱할 수 있어요.
Configuration Example (설정 예시)
IngressRoute
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: test-name
namespace: apps
spec:
entryPoints:
- websecure
routes:
- match: Host(`example.com`) && PathPrefix(`/foo`)
kind: Rule
services:
# Set a WRR TraefikService
- name: wrr1
namespace: apps
kind: TraefikService
tls:
# Add a TLS certificate from a Kubernetes Secret
secretName: supersecret
TraefikService WRR Level#1
apiVersion: traefik.io/v1alpha1
kind: TraefikService
metadata:
name: wrr1
namespace: apps
spec:
weighted:
services:
# Kubernetes Service
- name: svc1
namespace: apps
port: 80
weight: 1
# Second level WRR service
- name: wrr2
namespace: apps
kind: TraefikService
weight: 1
# Mirroring service
# The service is described in the Mirroring example
- name: mirror1
namespace: apps
kind: TraefikService
weight: 1
TraefikService WRR Level#2
apiVersion: traefik.io/v1alpha1
kind: TraefikService
metadata:
name: wrr2
namespace: apps
spec:
weighted:
services:
# Kubernetes Service
- name: svc2
namespace: apps
port: 80
weight: 1
# Kubernetes Service
- name: svc3
namespace: apps
port: 80
weight: 1
Kubernetes Services
apiVersion: v1
kind: Service
metadata:
name: svc1
namespace: apps
spec:
ports:
- name: http
port: 80
selector:
app: traefiklabs
task: app1
---
apiVersion: v1
kind: Service
metadata:
name: svc2
namespace: apps
spec:
ports:
- name: http
port: 80
selector:
app: traefiklabs
task: app2
---
apiVersion: v1
kind: Service
metadata:
name: svc3
namespace: apps
spec:
ports:
- name: http
port: 80
selector:
app: traefiklabs
task: app3
Secret
apiVersion: v1
kind: Secret
metadata:
name: supersecret
namespace: apps
data:
tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0=
tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0=
Configuration Options (설정 옵션)
| Field | Description | Default | Required |
| services | TraefikService와 Kubernetes service의 모든 조합 목록이에요. 옵션의 전체 목록은 Service 문서에 있어요. | | No |
| services[m].weight | 서비스 가중치예요. | "" | No |
| sticky. cookie.name | WRR 서비스 레벨 고정 세션에 사용되는 쿠키의 이름이에요. 고정 세션이 활성화되면 첫 응답에 Set-Cookie 헤더가 설정되어 클라이언트가 어떤 서버가 첫 응답을 처리했는지 알 수 있어요. 이후 요청에서 같은 서버로 세션을 유지하려면 클라이언트는 값이 설정된 쿠키를 보내야 해요. 쿠키에 지정된 서버가 비정상이 되면 요청은 새 서버로 전달되고(쿠키는 새 서버를 계속 추적해요). WRR 고정 세션에 대한 자세한 정보는 여기를 참고해 주세요. | sha1의 약어(예: _1d52e) | No |
| sticky. cookie.httpOnly | WRR 서비스 레벨 고정 세션에 사용되는 쿠키를 JavaScript 같은 클라이언트 측 API가 접근하도록 허용해요. WRR 고정 세션에 대한 자세한 정보는 여기를 참고해 주세요. | false | No |
| sticky. cookie.secure | WRR 서비스 레벨 고정 세션에 사용되는 쿠키가 암호화된 연결(즉 HTTPS)에서만 전송되도록 허용해요. WRR 고정 세션에 대한 자세한 정보는 여기를 참고해 주세요. | false | No |
| sticky. cookie.sameSite | WRR 서비스 레벨 고정 세션에 사용되는 쿠키의 SameSite 정책이에요. 허용 값: -none -lax -strict -None -Lax -Strict. WRR 고정 세션에 대한 자세한 정보는 여기를 참고해 주세요. | "" | No |
| sticky. cookie.maxAge | WRR 서비스 레벨 고정 세션에 사용되는 쿠키가 만료될 때까지의 초 수예요. 음수면 쿠키가 즉시 만료돼요. 0이면 쿠키가 절대 만료되지 않아요. | 0 | No |
Stickiness on multiple levels (여러 레벨에서의 고정 세션)
로드 밸런서를 연결하거나 혼합할 때(예: 서버 로드 밸런서가 서비스 로드 밸런서의 "자식" 중 하나인 경우), 고정 세션이 끝까지 동작하려면 필요한 모든 레벨에서 옵션을 지정해야 해요. 즉 클라이언트는 고정 레벨 수만큼 많은 key/value 쌍을 가진 쿠키를 보내야 해요.
고정 세션은 끝까지 동작하려면 각 로드 밸런싱 레벨에서 지정되어야 해요.
예를 들어 아래 예시에는, 두 whoami 서비스의 (가중치 라운드 로빈) 로드 밸런싱이 있으므로 첫 번째 레벨의 로드 밸런싱이 있고, 각 whoami 서비스는 replicaset이므로 서버 로드 밸런서로 처리되는 두 번째 레벨이 있어요.
IngressRoute
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: ingressroutebar
namespace: apps
spec:
entryPoints:
- web
routes:
- match: Host(`example.com`) && PathPrefix(`/foo`)
kind: Rule
services:
- name: wrr1
namespace: apps
kind: TraefikService
TraefikService WRR with 2 level of stickiness
apiVersion: traefik.io/v1alpha1
kind: TraefikService
metadata:
name: wrr1
namespace: apps
spec:
weighted:
services:
- name: whoami1
kind: Service
port: 80
weight: 1
# Stickiness level2 (on the Kubernetes service)
sticky:
cookie:
name: lvl2
- name: whoami2
kind: Service
weight: 1
port: 80
# Stickiness level2 (on the Kubernetes service)
sticky:
cookie:
name: lvl2
# Stickiness level2 (on the WRR service)
sticky:
cookie:
name: lvl1
위 예시에서, 같은 서버로 세션을 유지하려면 클라이언트가 매 요청에서 쿠키 안에 두 레벨을 지정해야 해요. 예를 들어 curl로:
# Assuming `10.42.0.6` is the IP address of one of the replicas (a pod then) of the `whoami1` service.
curl -H Host:example.com -b "lvl1=default-whoami1-80; lvl2=http://10.42.0.6:80" http://localhost:8000/foo
Highest Random Weight
HRW(Highest Random Weight) 로드 밸런서는 일관된 해싱(consistent hashing)을 사용해서 같은 클라이언트 IP에서 온 요청이 항상 같은 서비스로 라우팅되도록 보장해요. 가중치를 기반으로 요청을 분산하는 가중치 라운드 로빈과 달리, HRW는 클라이언트의 원격 주소를 기반으로 일관된 라우팅을 제공해요.
이는 고정 쿠키 없이 세션 선호도(session affinity)를 유지하는 데 특히 유용해요. 클라이언트가 자신의 IP 주소를 기반으로 일관되게 같은 백엔드 서비스에 도달할 수 있기 때문이에요.
Configuration Example (설정 예시)
IngressRoute
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: test-hrw
namespace: apps
spec:
entryPoints:
- websecure
routes:
- match: Host(`example.com`) && PathPrefix(`/app`)
kind: Rule
services:
# Set an HRW TraefikService
- name: hrw1
namespace: apps
kind: TraefikService
tls:
secretName: supersecret
TraefikService HRW
apiVersion: traefik.io/v1alpha1
kind: TraefikService
metadata:
name: hrw1
namespace: apps
spec:
highestRandomWeight:
services:
# Kubernetes Service with weight 10
- name: svc1
namespace: apps
port: 80
weight: 10
# Kubernetes Service with weight 20
- name: svc2
namespace: apps
port: 80
weight: 20
# Another TraefikService
- name: wrr1
namespace: apps
kind: TraefikService
weight: 15
Kubernetes Services
apiVersion: v1
kind: Service
metadata:
name: svc1
namespace: apps
spec:
ports:
- name: http
port: 80
selector:
app: traefiklabs
task: app1
---
apiVersion: v1
kind: Service
metadata:
name: svc2
namespace: apps
spec:
ports:
- name: http
port: 80
selector:
app: traefiklabs
task: app2
Configuration Options (설정 옵션)
| Field | Description | Default | Required |
| services | TraefikService와 Kubernetes service의 모든 조합 목록이에요. 각 서비스에는 가중치가 할당되어야 해요. | | Yes |
| services[m]. kind | 대상 서비스의 종류예요. 두 값이 허용돼요: - Service: Kubernetes Service - TraefikService: Traefik Service. | "" | No |
| services[m]. name | 서비스 이름이에요. @ 문자는 허용되지 않아요. | "" | Yes |
| services[m]. namespace | 서비스 네임스페이스예요. | "" | No |
| services[m]. port | 서비스 포트(숫자 또는 포트 이름)예요. kind가 Service인 경우에만 평가돼요. | "" | No |
| services[m]. weight | HRW 알고리즘에서 사용되는 서비스 가중치예요. 가중치가 높을수록 특정 클라이언트 IP에 대해 선택될 확률이 높아져요. | 1 | No |
| services[m]. responseForwarding. flushInterval | 응답 본문을 복사하면서 클라이언트로 플러시 사이의 간격(밀리초)이에요. 음수 값은 클라이언트로 쓸 때마다 즉시 플러시한다는 뜻이에요. 응답이 스트리밍 응답이면 이 구성은 무시되고, 그러한 응답에 대해서는 쓰기가 즉시 클라이언트로 플러시돼요. kind가 Service인 경우에만 평가돼요. | 100ms | No |
| services[m]. scheme | 업스트림 Kubernetes Service로의 요청에 사용할 스킴이에요. kind가 Service인 경우에만 평가돼요. | "http", port가 443이거나 문자열 https를 포함하면 "https" | No |
| services[m]. serversTransport | Traefik과 서버 사이의 전송을 구성하는 데 사용할 ServersTransport 리소스 이름이에요. kind가 Service인 경우에만 평가돼요. | "" | No |
| services[m]. passHostHeader | 클라이언트 Host 헤더를 서버로 전달해요. kind가 Service인 경우에만 평가돼요. | true | No |
| services[m]. healthCheck.scheme | 헬스 체크 엔드포인트의 서버 URL 스킴이에요. kind가 Service인 경우에만, 타입이 ExternalName인 Kubernetes service에만 평가돼요. | "" | No |
| services[m]. healthCheck.mode | 헬스 체크 모드예요. grpc로 정의하면 gRPC 헬스 체크 프로토콜로 서버를 프로빙해요. kind가 Service인 경우에만, 타입이 ExternalName인 Kubernetes service에만 평가돼요. | "http" | No |
| services[m]. healthCheck.path | 헬스 체크 엔드포인트의 서버 URL 경로예요. kind가 Service인 경우에만, 타입이 ExternalName인 Kubernetes service에만 평가돼요. | "" | No |
| services[m]. healthCheck.interval | 정상 타깃에 대한 헬스 체크 호출 빈도예요. kind가 Service인 경우에만, 타입이 ExternalName인 Kubernetes service에만 평가돼요. | "30s" | No |
| services[m]. healthCheck.unhealthyInterval | 비정상 타깃에 대한 헬스 체크 호출 빈도예요. 정의하지 않으면 interval 값으로 기본 설정돼요. kind가 Service인 경우에만, 타입이 ExternalName인 Kubernetes service에만 평가돼요. | "30s" | No |
| services[m]. healthCheck.method | 헬스 체크 엔드포인트의 HTTP 메서드예요. kind가 Service인 경우에만, 타입이 ExternalName인 Kubernetes service에만 평가돼요. | "GET" | No |
| services[m]. healthCheck.status | 헬스 체크 요청에 대한 응답의 예상 HTTP 상태 코드예요. 타입이 ExternalName인 Kubernetes service에만 적용돼요. 설정하지 않으면 200~399 사이 상태를 기대해요. kind가 Service인 경우에만 평가돼요. | | No |
| services[m]. healthCheck.port | 헬스 체크 엔드포인트의 URL 포트예요. kind가 Service인 경우에만, 타입이 ExternalName인 Kubernetes service에만 평가돼요. | | No |
| services[m]. healthCheck.timeout | 서버를 비정상으로 간주하기 전에 기다리는 최대 시간이에요. kind가 Service인 경우에만, 타입이 ExternalName인 Kubernetes service에만 평가돼요. | "5s" | No |
| services[m]. healthCheck.hostname | 헬스 체크 요청의 Host 헤더 값이에요. kind가 Service인 경우에만, 타입이 ExternalName인 Kubernetes service에만 평가돼요. | "" | No |
| services[m]. healthCheck. followRedirect | 헬스 체크 중 리다이렉션을 따라갈지 여부예요. kind가 Service인 경우에만, 타입이 ExternalName인 Kubernetes service에만 평가돼요. | true | No |
| services[m]. healthCheck.headers | 헬스 체크 엔드포인트로 보낼 헤더 맵이에요. kind가 Service인 경우에만, 타입이 ExternalName인 Kubernetes service에만 평가돼요. | | No |
| services[m]. sticky. cookie.name | 고정 세션에 사용되는 쿠키의 이름이에요. kind가 Service인 경우에만 평가돼요. | sha1의 약어(예: _1d52e) | No |
| services[m]. sticky. cookie.httpOnly | 쿠키가 JavaScript 같은 클라이언트 측 API에 의해 접근되도록 허용해요. kind가 Service인 경우에만 평가돼요. | false | No |
| services[m]. sticky. cookie.secure | 쿠키가 암호화된 연결(즉 HTTPS)에서만 전송되도록 허용해요. kind가 Service인 경우에만 평가돼요. | false | No |
| services[m]. sticky. cookie.sameSite | SameSite 정책이에요. 허용 값(대소문자 구분 없음): -none -lax -strict -None -Lax -Strict. kind가 Service인 경우에만 평가돼요. | "" | No |
| services[m]. sticky. cookie.maxAge | 쿠키가 만료될 때까지의 초 수예요. 음수면 쿠키가 즉시 만료돼요. 0이면 쿠키가 절대 만료되지 않아요. kind가 Service인 경우에만 평가돼요. | 0 | No |
| services[m]. strategy | 서버 사이의 로드 밸런싱 전략이에요. 지원 값: wrr, p2c, hrw, leasttime. kind가 Service인 경우에만 평가돼요. | "wrr" | No |
| services[m]. nativeLB | Traefik이 제공하는 것이 아닌, 파드 사이에서 Kubernetes Service 로드 밸런싱을 사용할 수 있게 해 줘요. 더 쉽게 말하면, nativeLB를 true로 설정하면 Traefik이 Kubernetes Service(클러스터의 네트워킹(kube-proxy, Cilium, Calico 등)을 사용해)로 트래픽을 라우팅하고, 로드 밸런싱은 Kubernetes가 직접 처리해요. false로 설정하면 Traefik이 파드로 직접 트래픽을 라우팅하고 로드 밸런싱 결정을 내부적으로 내려요. 기본적으로 nativeLB 구성과 무관하게 Traefik은 성능을 위해 백엔드와의 수립된 연결을 재사용해요. 다만 연결 재사용과 nativeLB: true를 결합하면 불균등한 로드 밸런싱이 발생할 수 있어요. 이것이 용납되지 않으면 maxIdleConnsPerHost를 -1로 설정해서 연결 재사용을 비활성화할 수 있어요. kind가 Service인 경우에만 평가돼요. | false | No |
| services[m]. nodePortLB | 서비스 타입이 NodePort일 때 nodePort IP 주소를 사용해요. Traefik이 Kubernetes 클러스터 외부에 있지만 노드와 같은 네트워크 안에서 실행될 때 서비스에 도달할 수 있게 해 줘요. kind가 Service인 경우에만 평가돼요. | false | No |
How HRW Works (HRW 동작 방식)
Highest Random Weight 알고리즘은 일관된 해싱과 가중치 로드 밸런싱을 결합해요:
-
일관된 해싱: 각 수신 요청에 대해 클라이언트의 원격 주소가 해시되어 일관된 라우팅을 보장해요.
-
가중치 기반 선택: 각 서비스는 클라이언트 IP의 해시와 서비스 가중치를 모두 기반으로 한 난수 값을 할당받아요.
-
최고 선택: 계산된 값이 가장 높은 서비스가 요청을 받아요.
이 접근 방식은 몇 가지 이점을 제공해요:
-
세션 선호도: 클라이언트가 일관되게 같은 백엔드 서비스에 도달해요.
-
가중치 분산: 가중치가 높은 서비스가 선택될 가능성이 더 높아요.
-
상태 불필요: 고정 쿠키와 달리 클라이언트 측이나 서버 측 상태가 필요 없어요.
-
내결함성: 서비스가 사용 불가능해지면 요청은 남은 서비스 사이에 일관되게 재분산돼요.
Mirroring (미러링)
미러링은 서비스로 보내진 요청을 다른 서비스로 미러링할 수 있어요.
미러링 서비스를 사용하면 여러 서비스에 함께 트래픽을 보낼 수 있어요:
-
메인 서비스는 트래픽의 100%를 받아요.
-
미러 서비스들은 트래픽의 일정 비율을 받아요.
예를 들어 애플리케이션의 버전을 업그레이드할 때, 현재 버전을 타깃으로 하는 서비스를 메인 서비스로, 새 버전의 서비스를 미러 서비스로 설정할 수 있어요. 이렇게 하면 현재 버전에 계속 접근하면서 새 버전의 동작을 테스트할 수 있어요.
미러링 TraefikService는 Kubernetes Service와 다른 TraefikService 인스턴스(다른 WRR 서비스 또는 미러링 서비스)를 참조할 수 있게 해 줘요.
기본적으로 미러링되는 동안 전체 요청이 메모리에 버퍼링된다는 점에 유의하세요. 이 동작을 수정하는 방법은 아래 예시의 maxBodySize 옵션을 참고해 주세요.
Configuration Example (설정 예시)
IngressRoute
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: ingressroutebar
namespace: default
spec:
entryPoints:
- web
routes:
- match: Host(`example.com`) && PathPrefix(`/foo`)
kind: Rule
services:
- name: mirror1
namespace: default
kind: TraefikService
Mirroring from a Kubernetes Service
# Mirroring from a k8s Service
apiVersion: traefik.io/v1alpha1
kind: TraefikService
metadata:
name: mirror1
namespace: default
spec:
mirroring:
name: svc1 # svc1 receives 100% of the traffic
port: 80
mirrorBody: true # Default: true
maxBodySize: 1048576
mirrors:
- name: svc2 # svc2 receives a copy of 20% of this traffic
port: 80
percent: 20
- name: svc3 # svc3 receives a copy of 15% of this traffic
kind: TraefikService
percent: 15
Mirroring from a TraefikService (WRR)
# Mirroring from a Traefik Service
apiVersion: traefik.io/v1alpha1
kind: TraefikService
metadata:
name: mirror1
namespace: default
spec:
mirroring:
name: wrr1 # wrr1 receives 100% of the traffic
kind: TraefikService
mirrors:
- name: svc2 # svc2 receives a copy of 20% of this traffic
port: 80
percent: 20
- name: svc3 # svc3 receives a copy of 10% of this traffic
kind: TraefikService
percent: 10
Kubernetes Services
apiVersion: v1
kind: Service
metadata:
name: svc1
namespace: default
spec:
ports:
- name: http
port: 80
selector:
app: traefiklabs
task: app1
---
apiVersion: v1
kind: Service
metadata:
name: svc2
namespace: default
spec:
ports:
- name: http
port: 80
selector:
app: traefiklabs
task: app2
Configuration Options (설정 옵션)
Main Service Options (메인 서비스 옵션)
메인 서비스 속성은 옵션의 루트 레벨로 설정돼요.
메인 서비스는 Service와 동일한 옵션을 제공해요.
서비스 옵션의 전체 목록은 Service 문서에 설명되어 있어요. 미러 메인 서비스 전용 옵션은 아래에 설명돼요.
| Field | Description | Default | Required |
| mirrorBody | 요청 본문을 미러링할지 정의해요. | true | No |
| maxBodySize | 요청 본문에 허용되는 최대 크기예요. 본문이 더 크면 요청이 미러링되지 않아요. -1은 무제한 크기를 의미해요. | -1 | No |
| mirrors | 타깃으로 삼을 미러링된 서비스 목록이에요. TraefikService와 Kubernetes service의 모든 조합일 수 있어요. 옵션의 전체 목록은 Service 문서에 있어요. | | Yes |
Mirrored Services Options (미러링된 서비스 옵션)
미러링된 서비스 속성은 mirrors 목록에 설정돼요.
미러링된 서비스는 Service와 동일한 옵션을 제공해요.
서비스 옵션의 전체 목록은 Service 문서에 설명되어 있어요. 미러링된 서비스 전용 옵션은 아래에 설명돼요.
| Field | Description | Default | Required |
| mirrors[m].percent | 서비스로 라우팅할 트래픽 비율이에요. | 0 | No |
Failover (페일오버)
페일오버 서비스는 메인 서비스가 errors 구성에서 정의된 특정 HTTP 상태 코드로 응답할 때 모든 요청을 폴백(fallback) 서비스로 전달해요.
Failover
Failover 서비스에 대한 HealthCheck는 현재 File provider에서만 정의할 수 있어요.
Configuration Examples (설정 예시)
IngressRoute
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: test-name
namespace: apps
spec:
entryPoints:
- websecure
routes:
- match: Host(`example.com`) && PathPrefix(`/foo`)
kind: Rule
services:
# Set a Failover TraefikService
- name: failover1
namespace: apps
kind: TraefikService
Failover from Kubernetes Services
apiVersion: traefik.io/v1alpha1
kind: TraefikService
metadata:
name: failover1
namespace: apps
spec:
failover:
service:
name: svc1
port: 80
fallback:
name: svc2
port: 80
errors:
status:
- "500-503"
- "429"
Failover from TraefikService (WRR)
apiVersion: traefik.io/v1alpha1
kind: TraefikService
metadata:
name: failover1
namespace: apps
spec:
failover:
service:
name: wrr1
kind: TraefikService
fallback:
name: wrr2
kind: TraefikService
errors:
status:
- "500-503"
Failover with maxRequestBodyBytes
apiVersion: traefik.io/v1alpha1
kind: TraefikService
metadata:
name: failover1
namespace: apps
spec:
failover:
service:
name: svc1
port: 80
fallback:
name: svc2
port: 80
errors:
status:
- "500-503"
- "429"
maxRequestBodyBytes: 1048576
Kubernetes Services
apiVersion: v1
kind: Service
metadata:
name: svc1
namespace: apps
spec:
ports:
- name: http
port: 80
selector:
app: traefiklabs
task: app1
---
apiVersion: v1
kind: Service
metadata:
name: svc2
namespace: apps
spec:
ports:
- name: http
port: 80
selector:
app: traefiklabs
task: app2
Configuration Options (설정 옵션)
Main Service and Fallback Options (메인 서비스와 폴백 옵션)
service와 fallback 필드는 각각 Service와 동일한 옵션을 사용해 대상 서비스를 정의해요.
서비스 옵션의 전체 목록은 Service 문서에 설명되어 있어요.
Failover Dedicated Options (페일오버 전용 옵션)
| Field | Description | Default | Required |
| service | 요청을 전달할 메인 서비스예요. Service와 동일한 옵션을 제공해요. | | Yes |
| fallback | 메인 서비스가 일치하는 오류 상태 코드를 반환할 때 사용할 폴백 서비스예요. Service와 동일한 옵션을 제공해요. | | Yes |
| errors.status | 폴백 서비스를 사용해야 하는 HTTP 상태 코드 범위 목록이에요. 각 항목은 단일 코드(예: "429") 또는 범위(예: "500-503")일 수 있어요. | | No |
| errors. maxRequestBodyBytes | 요청 본문에 허용되는 최대 크기예요. 본문이 더 크면 요청이 폴백 서비스로 재생(replay)되지 않아요. -1은 무제한 크기를 의미해요. | -1 | No |