Service
概述¶
服务段中的每个字段代表一种服务类型。也就是说,每个指定服务都必须且只能启用其中一个字段,以定义所创建的服务类型。目前有两种可用类型:LoadBalancer 和 Weighted。
服务器负载均衡器¶
服务器负载均衡器负责将请求均衡分配到同一服务的各台服务器。
配置示例¶
声明一个包含两台服务器的服务——使用文件提供者
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"[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:
- "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": [
"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 |
地址选项(IP:Port)指向具体实例。 | "" |
servers.tls |
tls 选项决定连接后端时是否使用 TLS。 |
false |
serversTransport |
serversTransport 支持引用 TCP ServersTransport 配置,用于 Traefik 与服务器之间的通信。如果未指定 serversTransport,将使用 default@internal。 |
"" |
healthCheck |
配置健康检查,将不健康的服务器从负载均衡轮转中移除。详见健康检查。 |
健康检查¶
healthCheck 选项配置健康检查,将不健康的服务器从负载均衡轮转中移除。
只要能够成功连接目标服务器,Traefik 就会认为该 TCP 服务器健康。
对于高级健康检查,可以指定 send 和 expect 参数来配置 TCP 载荷交换。
要向上传播状态变化(例如此服务的所有服务器均不可用),还必须在此服务的父级启用 HealthCheck。
健康检查机制可用的选项如下:
| 字段 | 说明 | 默认值 | 必填 |
|---|---|---|---|
port |
替换服务器地址中的端口,用作健康检查端点。 | 否 | |
send |
定义健康检查期间向服务器发送的载荷。 | "" | 否 |
expect |
定义期望服务器返回的响应载荷。 | "" | 否 |
interval |
定义对健康目标执行健康检查的频率。 | 30s | 否 |
unhealthyInterval |
定义对不健康目标执行健康检查的频率。未定义时,默认为 interval 的值。 |
- | 否 |
timeout |
定义 Traefik 等待健康检查连接的最长时间,超过此时间则认为服务器不健康。 | 5s | 否 |
加权轮询¶
服务的加权轮询(简称 WRR)负载均衡器负责按给定权重在多个服务之间均衡分配连接。
此策略仅支持在服务之间执行负载均衡,不支持在服务器之间使用。
支持的提供者
目前可以通过文件提供者定义此策略。
权重
权重必须是非负整数,权重为 0 时会将子服务移出轮转。
声明了负权重的加权服务会被禁用,引用该服务的路由器也不会创建。
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"[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,此服务会向父级报告任何状态变化。
## 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"## 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"