Compare commits

..

4 Commits

Author SHA1 Message Date
Kevin Pollet
ce42e8501e
Prepare release v3.4.0 2025-05-05 15:34:04 +02:00
kevinpollet
bf399f3075
Merge branch v3.3 into v3.4 2025-05-05 11:08:36 +02:00
Romain
74bc93308b
Prepare release v3.3.7 2025-05-05 10:38:04 +02:00
Romain
87b57406ff
Add SpanID and TraceID accessLogs fields only when tracing is enabled 2025-04-28 14:26:05 +02:00
56 changed files with 477 additions and 987 deletions

View File

@ -3,11 +3,11 @@ PLEASE READ THIS MESSAGE.
Documentation fixes or enhancements: Documentation fixes or enhancements:
- for Traefik v2: use branch v2.11 - for Traefik v2: use branch v2.11
- for Traefik v3: use branch v3.3 - for Traefik v3: use branch v3.4
Bug fixes: Bug fixes:
- for Traefik v2: use branch v2.11 - for Traefik v2: use branch v2.11
- for Traefik v3: use branch v3.3 - for Traefik v3: use branch v3.4
Enhancements: Enhancements:
- for Traefik v2: we only accept bug fixes - for Traefik v2: we only accept bug fixes

View File

@ -1,3 +1,47 @@
## [v3.4.0](https://github.com/traefik/traefik/tree/v3.4.0) (2025-05-05)
[All Commits](https://github.com/traefik/traefik/compare/v3.3.0-rc1...v3.4.0)
**Enhancements:**
- **[acme]** Add acme.profile and acme.emailAddresses options ([#11597](https://github.com/traefik/traefik/pull/11597) by [ldez](https://github.com/ldez))
- **[docker,ecs,docker/swarm,consulcatalog,nomad]** Allow configuring server URLs with label providers ([#11374](https://github.com/traefik/traefik/pull/11374) by [yelvert](https://github.com/yelvert))
- **[k8s/crd]** Improve CEL validation on Ingress CRD resources ([#11311](https://github.com/traefik/traefik/pull/11311) by [mloiseleur](https://github.com/mloiseleur))
- **[k8s/crd]** Remove default load-balancing strategy from CRD ([#11701](https://github.com/traefik/traefik/pull/11701) by [kevinpollet](https://github.com/kevinpollet))
- **[k8s/crd]** Restrict regex validation of HTTP status codes for Ingress CRD resources ([#11670](https://github.com/traefik/traefik/pull/11670) by [jnoordsij](https://github.com/jnoordsij))
- **[k8s/gatewayapi]** Set rule priority in Gateway API TLSRoute ([#11443](https://github.com/traefik/traefik/pull/11443) by [augustozanellato](https://github.com/augustozanellato))
- **[k8s/ingress]** Add ingress status for ClusterIP and NodePort Service Type ([#11100](https://github.com/traefik/traefik/pull/11100) by [mlec1](https://github.com/mlec1))
- **[middleware,authentication]** Add option to preserve request method in forwardAuth ([#11473](https://github.com/traefik/traefik/pull/11473) by [an09mous](https://github.com/an09mous))
- **[middleware]** Support rewriting status codes in error page middleware ([#11520](https://github.com/traefik/traefik/pull/11520) by [sevensolutions](https://github.com/sevensolutions))
- **[middleware]** Add Redis rate limiter ([#10211](https://github.com/traefik/traefik/pull/10211) by [longquan0104](https://github.com/longquan0104))
- **[service]** Add p2c load-balancing strategy for servers load-balancer ([#11547](https://github.com/traefik/traefik/pull/11547) by [rtribotte](https://github.com/rtribotte))
- **[sticky-session]** Support domain configuration for sticky cookies ([#11556](https://github.com/traefik/traefik/pull/11556) by [jleal52](https://github.com/jleal52))
- **[tls,k8s/crd,service]** Allow root CA to be added through config maps ([#11475](https://github.com/traefik/traefik/pull/11475) by [Nelwhix](https://github.com/Nelwhix))
- **[tls]** Add support to disable session ticket ([#11609](https://github.com/traefik/traefik/pull/11609) by [avdhoot](https://github.com/avdhoot))
- **[udp]** Add support for UDP routing in systemd socket activation ([#11022](https://github.com/traefik/traefik/pull/11022) by [tsiid](https://github.com/tsiid))
- **[webui]** Add auto webui theme option and default to it ([#11455](https://github.com/traefik/traefik/pull/11455) by [zizzfizzix](https://github.com/zizzfizzix))
- Replace experimental maps and slices with stdlib ([#11350](https://github.com/traefik/traefik/pull/11350) by [Juneezee](https://github.com/Juneezee))
- Bump github.com/redis/go-redis/v9 to v9.7.3 ([#11687](https://github.com/traefik/traefik/pull/11687) by [kevinpollet](https://github.com/kevinpollet))
**Documentation:**
- Prepare release v3.4.0-rc1 ([#11654](https://github.com/traefik/traefik/pull/11654) by [kevinpollet](https://github.com/kevinpollet))
- Prepare release v3.4.0-rc2 ([#11707](https://github.com/traefik/traefik/pull/11707) by [rtribotte](https://github.com/rtribotte))
- Deprecate defaultRuleSyntax and ruleSyntax options ([#11619](https://github.com/traefik/traefik/pull/11619) by [rtribotte](https://github.com/rtribotte))
**Misc:**
- Merge branch v3.3 into master ([#11653](https://github.com/traefik/traefik/pull/11653) by [kevinpollet](https://github.com/kevinpollet))
- Merge branch v3.3 into master ([#11595](https://github.com/traefik/traefik/pull/11595) by [kevinpollet](https://github.com/kevinpollet))
- Merge branch v3.3 into master ([#11541](https://github.com/traefik/traefik/pull/11541) by [kevinpollet](https://github.com/kevinpollet))
- Merge branch v3.3 into master ([#11504](https://github.com/traefik/traefik/pull/11504) by [kevinpollet](https://github.com/kevinpollet))
- Merge branch v3.3 into master ([#11420](https://github.com/traefik/traefik/pull/11420) by [kevinpollet](https://github.com/kevinpollet))
- Merge branch v3.3 into master ([#11394](https://github.com/traefik/traefik/pull/11394) by [mmatur](https://github.com/mmatur))
- Merge branch v3.3 into v3.4 ([#11736](https://github.com/traefik/traefik/pull/11736) by [kevinpollet](https://github.com/kevinpollet))
- Merge branch v3.3 into v3.4 ([#11705](https://github.com/traefik/traefik/pull/11705) by [kevinpollet](https://github.com/kevinpollet))
## [v3.3.7](https://github.com/traefik/traefik/tree/v3.3.7) (2025-05-05)
[All Commits](https://github.com/traefik/traefik/compare/v3.3.6...v3.3.7)
**Bug fixes:**
- **[logs,middleware,accesslogs]** Add SpanID and TraceID accessLogs fields only when tracing is enabled ([#11715](https://github.com/traefik/traefik/pull/11715) by [rtribotte](https://github.com/rtribotte))
## [v3.4.0-rc2](https://github.com/traefik/traefik/tree/v3.4.0-rc2) (2025-04-18) ## [v3.4.0-rc2](https://github.com/traefik/traefik/tree/v3.4.0-rc2) (2025-04-18)
[All Commits](https://github.com/traefik/traefik/compare/v3.4.0-rc1...v3.4.0-rc2) [All Commits](https://github.com/traefik/traefik/compare/v3.4.0-rc1...v3.4.0-rc2)

View File

@ -250,34 +250,6 @@ when using the `HTTP-01` challenge, `certificatesresolvers.myresolver.acme.httpc
!!! info "" !!! info ""
Redirection is fully compatible with the `HTTP-01` challenge. Redirection is fully compatible with the `HTTP-01` challenge.
#### `Delay`
The delay between the creation of the challenge and the validation.
A value lower than or equal to zero means no delay.
```yaml tab="File (YAML)"
certificatesResolvers:
myresolver:
acme:
# ...
httpChallenge:
# ...
delay: 12
```
```toml tab="File (TOML)"
[certificatesResolvers.myresolver.acme]
# ...
[certificatesResolvers.myresolver.acme.httpChallenge]
# ...
delay = 12
```
```bash tab="CLI"
# ...
--certificatesresolvers.myresolver.acme.httpchallenge.delay=12
```
### `dnsChallenge` ### `dnsChallenge`
Use the `DNS-01` challenge to generate and renew ACME certificates by provisioning a DNS record. Use the `DNS-01` challenge to generate and renew ACME certificates by provisioning a DNS record.
@ -835,71 +807,6 @@ certificatesResolvers:
# ... # ...
``` ```
### `clientTimeout`
_Optional, Default=2m_
`clientTimeout` is the total timeout for a complete HTTP transaction (including TCP connection, sending request and receiving response) with the ACME server.
It defaults to 2 minutes.
!!! warning "This timeout encompasses the entire request-response cycle, including the response headers timeout. It must be at least `clientResponseHeaderTimeout`, otherwise the certificate resolver will fail to start."
```yaml tab="File (YAML)"
certificatesResolvers:
myresolver:
acme:
# ...
clientTimeout: 1m
# ...
```
```toml tab="File (TOML)"
[certificatesResolvers.myresolver.acme]
# ...
clientTimeout=1m
# ...
```
```bash tab="CLI"
# ...
--certificatesresolvers.myresolver.acme.clientTimeout=1m
# ...
```
!!! warning
This should not be confused with any timeouts used for validating challenges.
### `clientResponseHeaderTimeout`
_Optional, Default=30s_
`clientResponseHeaderTimeout` defines how long the HTTP client waits for response headers when communicating with the `caServer`.
It defaults to 30 seconds.
!!! warning "It must be lower than `clientTimeout`, otherwise the certificate resolver will fail to start."
```yaml tab="File (YAML)"
certificatesResolvers:
myresolver:
acme:
# ...
clientResponseHeaderTimeout: 1m
# ...
```
```toml tab="File (TOML)"
[certificatesResolvers.myresolver.acme]
# ...
clientResponseHeaderTimeout=1m
# ...
```
```bash tab="CLI"
# ...
--certificatesresolvers.myresolver.acme.clientResponseHeaderTimeout=1m
# ...
```
### `preferredChain` ### `preferredChain`
_Optional, Default=""_ _Optional, Default=""_

View File

@ -30,20 +30,6 @@
# #
# certificatesDuration=2160 # certificatesDuration=2160
# Timeout for a complete HTTP transaction with the ACME server.
#
# Optional
# Default: 2m
#
# clientTimeout="2m"
# Timeout for receiving the response headers when communicating with the ACME server.
#
# Optional
# Default: 30s
#
# clientResponseHeaderTimeout="30s"
# Preferred chain to use. # Preferred chain to use.
# #
# If the CA offers multiple certificate chains, prefer the chain with an issuer matching this Subject Common Name. # If the CA offers multiple certificate chains, prefer the chain with an issuer matching this Subject Common Name.

View File

@ -29,20 +29,6 @@
# #
--certificatesresolvers.myresolver.acme.certificatesDuration=2160 --certificatesresolvers.myresolver.acme.certificatesDuration=2160
# Timeout for a complete HTTP transaction with the ACME server.
#
# Optional
# Default: 2m
#
--certificatesresolvers.myresolver.acme.clientTimeout=2m
# Timeout for receiving the response headers when communicating with the ACME server.
#
# Optional
# Default: 30s
#
--certificatesresolvers.myresolver.acme.clientResponseHeaderTimeout=30s
# Preferred chain to use. # Preferred chain to use.
# #
# If the CA offers multiple certificate chains, prefer the chain with an issuer matching this Subject Common Name. # If the CA offers multiple certificate chains, prefer the chain with an issuer matching this Subject Common Name.

View File

@ -32,20 +32,6 @@ certificatesResolvers:
# #
# certificatesDuration: 2160 # certificatesDuration: 2160
# Timeout for a complete HTTP transaction with the ACME server.
#
# Optional
# Default: 2m
#
# clientTimeout: "2m"
# Timeout for receiving the response headers when communicating with the ACME server.
#
# Optional
# Default: 30s
#
# clientResponseHeaderTimeout: "30s"
# Preferred chain to use. # Preferred chain to use.
# #
# If the CA offers multiple certificate chains, prefer the chain with an issuer matching this Subject Common Name. # If the CA offers multiple certificate chains, prefer the chain with an issuer matching this Subject Common Name.

View File

@ -209,7 +209,6 @@
- "traefik.http.services.service02.loadbalancer.healthcheck.scheme=foobar" - "traefik.http.services.service02.loadbalancer.healthcheck.scheme=foobar"
- "traefik.http.services.service02.loadbalancer.healthcheck.status=42" - "traefik.http.services.service02.loadbalancer.healthcheck.status=42"
- "traefik.http.services.service02.loadbalancer.healthcheck.timeout=42s" - "traefik.http.services.service02.loadbalancer.healthcheck.timeout=42s"
- "traefik.http.services.service02.loadbalancer.healthcheck.unhealthyinterval=42s"
- "traefik.http.services.service02.loadbalancer.passhostheader=true" - "traefik.http.services.service02.loadbalancer.passhostheader=true"
- "traefik.http.services.service02.loadbalancer.responseforwarding.flushinterval=42s" - "traefik.http.services.service02.loadbalancer.responseforwarding.flushinterval=42s"
- "traefik.http.services.service02.loadbalancer.serverstransport=foobar" - "traefik.http.services.service02.loadbalancer.serverstransport=foobar"

View File

@ -84,7 +84,6 @@
status = 42 status = 42
port = 42 port = 42
interval = "42s" interval = "42s"
unhealthyInterval = "42s"
timeout = "42s" timeout = "42s"
hostname = "foobar" hostname = "foobar"
followRedirects = true followRedirects = true

View File

@ -89,7 +89,6 @@ http:
status: 42 status: 42
port: 42 port: 42
interval: 42s interval: 42s
unhealthyInterval: 42s
timeout: 42s timeout: 42s
hostname: foobar hostname: foobar
followRedirects: true followRedirects: true

View File

@ -136,7 +136,7 @@ spec:
- type: integer - type: integer
- type: string - type: string
description: |- description: |-
Interval defines the frequency of the health check calls for healthy targets. Interval defines the frequency of the health check calls.
Default: 30s Default: 30s
x-kubernetes-int-or-string: true x-kubernetes-int-or-string: true
method: method:
@ -172,15 +172,6 @@ spec:
Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy. Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy.
Default: 5s Default: 5s
x-kubernetes-int-or-string: true x-kubernetes-int-or-string: true
unhealthyInterval:
anyOf:
- type: integer
- type: string
description: |-
UnhealthyInterval defines the frequency of the health check calls for unhealthy targets.
When UnhealthyInterval is not defined, it defaults to the Interval value.
Default: 30s
x-kubernetes-int-or-string: true
type: object type: object
kind: kind:
description: Kind defines the kind of the Service. description: Kind defines the kind of the Service.
@ -1078,7 +1069,7 @@ spec:
- type: integer - type: integer
- type: string - type: string
description: |- description: |-
Interval defines the frequency of the health check calls for healthy targets. Interval defines the frequency of the health check calls.
Default: 30s Default: 30s
x-kubernetes-int-or-string: true x-kubernetes-int-or-string: true
method: method:
@ -1114,15 +1105,6 @@ spec:
Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy. Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy.
Default: 5s Default: 5s
x-kubernetes-int-or-string: true x-kubernetes-int-or-string: true
unhealthyInterval:
anyOf:
- type: integer
- type: string
description: |-
UnhealthyInterval defines the frequency of the health check calls for unhealthy targets.
When UnhealthyInterval is not defined, it defaults to the Interval value.
Default: 30s
x-kubernetes-int-or-string: true
type: object type: object
kind: kind:
description: Kind defines the kind of the Service. description: Kind defines the kind of the Service.
@ -2759,7 +2741,7 @@ spec:
- type: integer - type: integer
- type: string - type: string
description: |- description: |-
Interval defines the frequency of the health check calls for healthy targets. Interval defines the frequency of the health check calls.
Default: 30s Default: 30s
x-kubernetes-int-or-string: true x-kubernetes-int-or-string: true
method: method:
@ -2795,15 +2777,6 @@ spec:
Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy. Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy.
Default: 5s Default: 5s
x-kubernetes-int-or-string: true x-kubernetes-int-or-string: true
unhealthyInterval:
anyOf:
- type: integer
- type: string
description: |-
UnhealthyInterval defines the frequency of the health check calls for unhealthy targets.
When UnhealthyInterval is not defined, it defaults to the Interval value.
Default: 30s
x-kubernetes-int-or-string: true
type: object type: object
kind: kind:
description: Kind defines the kind of the Service. description: Kind defines the kind of the Service.
@ -2853,7 +2826,7 @@ spec:
- type: integer - type: integer
- type: string - type: string
description: |- description: |-
Interval defines the frequency of the health check calls for healthy targets. Interval defines the frequency of the health check calls.
Default: 30s Default: 30s
x-kubernetes-int-or-string: true x-kubernetes-int-or-string: true
method: method:
@ -2889,15 +2862,6 @@ spec:
Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy. Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy.
Default: 5s Default: 5s
x-kubernetes-int-or-string: true x-kubernetes-int-or-string: true
unhealthyInterval:
anyOf:
- type: integer
- type: string
description: |-
UnhealthyInterval defines the frequency of the health check calls for unhealthy targets.
When UnhealthyInterval is not defined, it defaults to the Interval value.
Default: 30s
x-kubernetes-int-or-string: true
type: object type: object
kind: kind:
description: Kind defines the kind of the Service. description: Kind defines the kind of the Service.
@ -3199,7 +3163,7 @@ spec:
- type: integer - type: integer
- type: string - type: string
description: |- description: |-
Interval defines the frequency of the health check calls for healthy targets. Interval defines the frequency of the health check calls.
Default: 30s Default: 30s
x-kubernetes-int-or-string: true x-kubernetes-int-or-string: true
method: method:
@ -3235,15 +3199,6 @@ spec:
Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy. Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy.
Default: 5s Default: 5s
x-kubernetes-int-or-string: true x-kubernetes-int-or-string: true
unhealthyInterval:
anyOf:
- type: integer
- type: string
description: |-
UnhealthyInterval defines the frequency of the health check calls for unhealthy targets.
When UnhealthyInterval is not defined, it defaults to the Interval value.
Default: 30s
x-kubernetes-int-or-string: true
type: object type: object
kind: kind:
description: Kind defines the kind of the Service. description: Kind defines the kind of the Service.

View File

@ -281,7 +281,6 @@ THIS FILE MUST NOT BE EDITED BY HAND
| `traefik/http/services/Service02/loadBalancer/healthCheck/scheme` | `foobar` | | `traefik/http/services/Service02/loadBalancer/healthCheck/scheme` | `foobar` |
| `traefik/http/services/Service02/loadBalancer/healthCheck/status` | `42` | | `traefik/http/services/Service02/loadBalancer/healthCheck/status` | `42` |
| `traefik/http/services/Service02/loadBalancer/healthCheck/timeout` | `42s` | | `traefik/http/services/Service02/loadBalancer/healthCheck/timeout` | `42s` |
| `traefik/http/services/Service02/loadBalancer/healthCheck/unhealthyInterval` | `42s` |
| `traefik/http/services/Service02/loadBalancer/passHostHeader` | `true` | | `traefik/http/services/Service02/loadBalancer/passHostHeader` | `true` |
| `traefik/http/services/Service02/loadBalancer/responseForwarding/flushInterval` | `42s` | | `traefik/http/services/Service02/loadBalancer/responseForwarding/flushInterval` | `42s` |
| `traefik/http/services/Service02/loadBalancer/servers/0/preservePath` | `true` | | `traefik/http/services/Service02/loadBalancer/servers/0/preservePath` | `true` |

View File

@ -136,7 +136,7 @@ spec:
- type: integer - type: integer
- type: string - type: string
description: |- description: |-
Interval defines the frequency of the health check calls for healthy targets. Interval defines the frequency of the health check calls.
Default: 30s Default: 30s
x-kubernetes-int-or-string: true x-kubernetes-int-or-string: true
method: method:
@ -172,15 +172,6 @@ spec:
Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy. Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy.
Default: 5s Default: 5s
x-kubernetes-int-or-string: true x-kubernetes-int-or-string: true
unhealthyInterval:
anyOf:
- type: integer
- type: string
description: |-
UnhealthyInterval defines the frequency of the health check calls for unhealthy targets.
When UnhealthyInterval is not defined, it defaults to the Interval value.
Default: 30s
x-kubernetes-int-or-string: true
type: object type: object
kind: kind:
description: Kind defines the kind of the Service. description: Kind defines the kind of the Service.

View File

@ -301,7 +301,7 @@ spec:
- type: integer - type: integer
- type: string - type: string
description: |- description: |-
Interval defines the frequency of the health check calls for healthy targets. Interval defines the frequency of the health check calls.
Default: 30s Default: 30s
x-kubernetes-int-or-string: true x-kubernetes-int-or-string: true
method: method:
@ -337,15 +337,6 @@ spec:
Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy. Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy.
Default: 5s Default: 5s
x-kubernetes-int-or-string: true x-kubernetes-int-or-string: true
unhealthyInterval:
anyOf:
- type: integer
- type: string
description: |-
UnhealthyInterval defines the frequency of the health check calls for unhealthy targets.
When UnhealthyInterval is not defined, it defaults to the Interval value.
Default: 30s
x-kubernetes-int-or-string: true
type: object type: object
kind: kind:
description: Kind defines the kind of the Service. description: Kind defines the kind of the Service.

View File

@ -71,7 +71,7 @@ spec:
- type: integer - type: integer
- type: string - type: string
description: |- description: |-
Interval defines the frequency of the health check calls for healthy targets. Interval defines the frequency of the health check calls.
Default: 30s Default: 30s
x-kubernetes-int-or-string: true x-kubernetes-int-or-string: true
method: method:
@ -107,15 +107,6 @@ spec:
Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy. Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy.
Default: 5s Default: 5s
x-kubernetes-int-or-string: true x-kubernetes-int-or-string: true
unhealthyInterval:
anyOf:
- type: integer
- type: string
description: |-
UnhealthyInterval defines the frequency of the health check calls for unhealthy targets.
When UnhealthyInterval is not defined, it defaults to the Interval value.
Default: 30s
x-kubernetes-int-or-string: true
type: object type: object
kind: kind:
description: Kind defines the kind of the Service. description: Kind defines the kind of the Service.
@ -165,7 +156,7 @@ spec:
- type: integer - type: integer
- type: string - type: string
description: |- description: |-
Interval defines the frequency of the health check calls for healthy targets. Interval defines the frequency of the health check calls.
Default: 30s Default: 30s
x-kubernetes-int-or-string: true x-kubernetes-int-or-string: true
method: method:
@ -201,15 +192,6 @@ spec:
Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy. Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy.
Default: 5s Default: 5s
x-kubernetes-int-or-string: true x-kubernetes-int-or-string: true
unhealthyInterval:
anyOf:
- type: integer
- type: string
description: |-
UnhealthyInterval defines the frequency of the health check calls for unhealthy targets.
When UnhealthyInterval is not defined, it defaults to the Interval value.
Default: 30s
x-kubernetes-int-or-string: true
type: object type: object
kind: kind:
description: Kind defines the kind of the Service. description: Kind defines the kind of the Service.
@ -511,7 +493,7 @@ spec:
- type: integer - type: integer
- type: string - type: string
description: |- description: |-
Interval defines the frequency of the health check calls for healthy targets. Interval defines the frequency of the health check calls.
Default: 30s Default: 30s
x-kubernetes-int-or-string: true x-kubernetes-int-or-string: true
method: method:
@ -547,15 +529,6 @@ spec:
Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy. Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy.
Default: 5s Default: 5s
x-kubernetes-int-or-string: true x-kubernetes-int-or-string: true
unhealthyInterval:
anyOf:
- type: integer
- type: string
description: |-
UnhealthyInterval defines the frequency of the health check calls for unhealthy targets.
When UnhealthyInterval is not defined, it defaults to the Interval value.
Default: 30s
x-kubernetes-int-or-string: true
type: object type: object
kind: kind:
description: Kind defines the kind of the Service. description: Kind defines the kind of the Service.

View File

@ -74,7 +74,7 @@ certificatesResolvers:
ACME certificate resolvers have the following configuration options: ACME certificate resolvers have the following configuration options:
| Field | Description | Default | Required | | Field | Description | Default | Required |
|:--------------------------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-----------------------------------------------|:---------| |:------------------|:--------------------|:-----------------------------------------------|:---------|
| `acme.email` | Email address used for registration. | "" | Yes | | `acme.email` | Email address used for registration. | "" | Yes |
| `acme.caServer` | CA server to use. | https://acme-v02.api.letsencrypt.org/directory | No | | `acme.caServer` | CA server to use. | https://acme-v02.api.letsencrypt.org/directory | No |
| `acme.preferredChain` | Preferred chain to use. If the CA offers multiple certificate chains, prefer the chain with an issuer matching this Subject Common Name. If no match, the default offered chain will be used. | "" | No | | `acme.preferredChain` | Preferred chain to use. If the CA offers multiple certificate chains, prefer the chain with an issuer matching this Subject Common Name. If no match, the default offered chain will be used. | "" | No |
@ -83,8 +83,6 @@ ACME certificate resolvers have the following configuration options:
| `acme.eab.kid` | Key identifier from External CA. | "" | No | | `acme.eab.kid` | Key identifier from External CA. | "" | No |
| `acme.eab.hmacEncoded` | HMAC key from External CA, should be in Base64 URL Encoding without padding format. | "" | No | | `acme.eab.hmacEncoded` | HMAC key from External CA, should be in Base64 URL Encoding without padding format. | "" | No |
| `acme.certificatesDuration` | The certificates' duration in hours, exclusively used to determine renewal dates. | 2160 | No | | `acme.certificatesDuration` | The certificates' duration in hours, exclusively used to determine renewal dates. | 2160 | No |
| `acme.clientTimeout` | Timeout for HTTP Client used to communicate with the ACME server. | 2m | No |
| `acme.clientResponseHeaderTimeout` | Timeout for response headers for HTTP Client used to communicate with the ACME server. | 30s | No |
| `acme.dnsChallenge` | Enable DNS-01 challenge. More information [here](#dnschallenge). | - | No | | `acme.dnsChallenge` | Enable DNS-01 challenge. More information [here](#dnschallenge). | - | No |
| `acme.dnsChallenge.provider` | DNS provider to use. | "" | No | | `acme.dnsChallenge.provider` | DNS provider to use. | "" | No |
| `acme.dnsChallenge.resolvers` | DNS servers to resolve the FQDN authority. | [] | No | | `acme.dnsChallenge.resolvers` | DNS servers to resolve the FQDN authority. | [] | No |
@ -94,7 +92,6 @@ ACME certificate resolvers have the following configuration options:
| `acme.dnsChallenge.propagation.disableANSChecks` | Disables the challenge TXT record propagation checks against authoritative nameservers. This option will skip the propagation check against the nameservers of the authority (SOA). It should be used only if the nameservers of the authority are not reachable. | false | No | | `acme.dnsChallenge.propagation.disableANSChecks` | Disables the challenge TXT record propagation checks against authoritative nameservers. This option will skip the propagation check against the nameservers of the authority (SOA). It should be used only if the nameservers of the authority are not reachable. | false | No |
| `acme.httpChallenge` | Enable HTTP-01 challenge. More information [here](#httpchallenge). | | No | | `acme.httpChallenge` | Enable HTTP-01 challenge. More information [here](#httpchallenge). | | No |
| `acme.httpChallenge.entryPoint` | EntryPoint to use for the HTTP-01 challenges. Must be reachable by Let's Encrypt through port 80 | "" | Yes | | `acme.httpChallenge.entryPoint` | EntryPoint to use for the HTTP-01 challenges. Must be reachable by Let's Encrypt through port 80 | "" | Yes |
| `acme.httpChallenge.delay` | The delay between the creation of the challenge and the validation. A value lower than or equal to zero means no delay. | 0 | No |
| `acme.tlsChallenge` | Enable TLS-ALPN-01 challenge. Traefik must be reachable by Let's Encrypt through port 443. More information [here](#tlschallenge). | - | No | | `acme.tlsChallenge` | Enable TLS-ALPN-01 challenge. Traefik must be reachable by Let's Encrypt through port 443. More information [here](#tlschallenge). | - | No |
| `acme.storage` | File path used for certificates storage. | "acme.json" | Yes | | `acme.storage` | File path used for certificates storage. | "acme.json" | Yes |

View File

@ -70,6 +70,7 @@ labels:
```json tab="Tags" ```json tab="Tags"
{ {
// ...
"Tags": [ "Tags": [
"traefik.http.services.my-service.loadBalancer.servers[0].url=http://private-ip-server-1/", "traefik.http.services.my-service.loadBalancer.servers[0].url=http://private-ip-server-1/",
"traefik.http.services.my-service.loadBalancer.servers[0].weight=2", "traefik.http.services.my-service.loadBalancer.servers[0].weight=2",
@ -88,7 +89,7 @@ labels:
### Configuration Options ### Configuration Options
| Field | Description | Required | | Field | Description | Required |
|------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------| |----------|------------------------------------------|----------|
|`servers`| Represents individual backend instances for your service | Yes | |`servers`| Represents individual backend instances for your service | Yes |
|`sticky`| Defines a `Set-Cookie` header is set on the initial response to let the client know which server handles the first response. | No | |`sticky`| Defines a `Set-Cookie` header is set on the initial response to let the client know which server handles the first response. | No |
|`healthcheck`| Configures health check to remove unhealthy servers from the load balancing rotation. | No | |`healthcheck`| Configures health check to remove unhealthy servers from the load balancing rotation. | No |
@ -104,7 +105,7 @@ Servers represent individual backend instances for your service. The [service lo
##### Configuration Options ##### Configuration Options
| Field | Description | Required | | Field | Description | Required |
|----------------|----------------------------------------------------|----------------------------------------------------------------------------------| |----------|------------------------------------------|----------|
|`url`| Points to a specific instance. | Yes for File provider, No for [Docker provider](../../other-providers/docker.md) | |`url`| Points to a specific instance. | Yes for File provider, No for [Docker provider](../../other-providers/docker.md) |
|`weight`| Allows for weighted load balancing on the servers. | No | |`weight`| Allows for weighted load balancing on the servers. | No |
|`preservePath`| Allows to preserve the URL path. | No | |`preservePath`| Allows to preserve the URL path. | No |
@ -118,14 +119,13 @@ To propagate status changes (e.g. all servers of this service are down) upwards,
Below are the available options for the health check mechanism: Below are the available options for the health check mechanism:
| Field | Description | Default | Required | | Field | Description | Default | Required |
|---------------------|-------------------------------------------------------------------------------------------------------------------------------|---------|----------| |----------|------------------------------------------|----------|--------|
|`path`| Defines the server URL path for the health check endpoint. | "" | Yes | |`path`| Defines the server URL path for the health check endpoint. | "" | Yes |
|`scheme`| Replaces the server URL scheme for the health check endpoint. | | No | |`scheme`| Replaces the server URL scheme for the health check endpoint. | | No |
|`mode`| If defined to `grpc`, will use the gRPC health check protocol to probe the server. | http | No | |`mode`| If defined to `grpc`, will use the gRPC health check protocol to probe the server. | http | No |
|`hostname`| Defines the value of hostname in the Host header of the health check request. | "" | No | |`hostname`| Defines the value of hostname in the Host header of the health check request. | "" | No |
|`port`| Replaces the server URL port for the health check endpoint. | | No | |`port`| Replaces the server URL port for the health check endpoint. | | No |
| `interval` | Defines the frequency of the health check calls for healthy targets. | 30s | No | |`interval`| Defines the frequency of the health check calls. | 30s | No |
| `unhealthyInterval` | Defines the frequency of the health check calls for unhealthy targets. When not defined, it defaults to the `interval` value. | 30s | No |
|`timeout`| Defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy. | 5s | No | |`timeout`| Defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy. | 5s | No |
|`headers`| Defines custom headers to be sent to the health check endpoint. | | No | |`headers`| Defines custom headers to be sent to the health check endpoint. | | No |
|`followRedirects`| Defines whether redirects should be followed during the health check calls. | true | No | |`followRedirects`| Defines whether redirects should be followed during the health check calls. | true | No |

View File

@ -75,7 +75,7 @@ spec:
## Configuration Options ## Configuration Options
| Field | Description | Default | Required | | Field | Description | Default | Required |
|:---------------------------------------------------------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:---------------------------------------------------------------------|:---------| |:------|:----------------------------------------------------------|:---------------------|:---------|
| `entryPoints` | List of [entry points](../../../../install-configuration/entrypoints.md) names.<br />If not specified, HTTP routers will accept requests from all EntryPoints in the list of default EntryPoints. | | No | | `entryPoints` | List of [entry points](../../../../install-configuration/entrypoints.md) names.<br />If not specified, HTTP routers will accept requests from all EntryPoints in the list of default EntryPoints. | | No |
| `routes` | List of routes. | | Yes | | `routes` | List of routes. | | Yes |
| `routes[n].kind` | Kind of router matching, only `Rule` is allowed yet. | "Rule" | No | | `routes[n].kind` | Kind of router matching, only `Rule` is allowed yet. | "Rule" | No |
@ -99,8 +99,7 @@ spec:
| `routes[n].`<br />`services[m].`<br />`healthCheck.scheme` | Server URL scheme for the health check endpoint.<br />Evaluated only if the kind is **Service**.<br />Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#externalname-service). | "" | No | | `routes[n].`<br />`services[m].`<br />`healthCheck.scheme` | Server URL scheme for the health check endpoint.<br />Evaluated only if the kind is **Service**.<br />Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#externalname-service). | "" | No |
| `routes[n].`<br />`services[m].`<br />`healthCheck.mode` | Health check mode.<br /> If defined to grpc, will use the gRPC health check protocol to probe the server.<br />Evaluated only if the kind is **Service**.<br />Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#externalname-service). | "http" | No | | `routes[n].`<br />`services[m].`<br />`healthCheck.mode` | Health check mode.<br /> If defined to grpc, will use the gRPC health check protocol to probe the server.<br />Evaluated only if the kind is **Service**.<br />Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#externalname-service). | "http" | No |
| `routes[n].`<br />`services[m].`<br />`healthCheck.path` | Server URL path for the health check endpoint.<br />Evaluated only if the kind is **Service**.<br />Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#externalname-service). | "" | No | | `routes[n].`<br />`services[m].`<br />`healthCheck.path` | Server URL path for the health check endpoint.<br />Evaluated only if the kind is **Service**.<br />Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#externalname-service). | "" | No |
| `routes[n].`<br />`services[m].`<br />`healthCheck.interval` | Frequency of the health check calls for healthy targets.<br />Evaluated only if the kind is **Service**.<br />Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#externalname-service). | "100ms" | No | | `routes[n].`<br />`services[m].`<br />`healthCheck.interval` | Frequency of the health check calls.<br />Evaluated only if the kind is **Service**.<br />Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#externalname-service). | "100ms" | No |
| `routes[n].`<br />`services[m].`<br />`healthCheck.unhealthyInterval` | Frequency of the health check calls for unhealthy targets.<br />When not defined, it defaults to the `interval` value.<br />Evaluated only if the kind is **Service**.<br />Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#externalname-service). | "100ms" | No |
| `routes[n].`<br />`services[m].`<br />`healthCheck.method` | HTTP method for the health check endpoint.<br />Evaluated only if the kind is **Service**.<br />Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#externalname-service). | "GET" | No | | `routes[n].`<br />`services[m].`<br />`healthCheck.method` | HTTP method for the health check endpoint.<br />Evaluated only if the kind is **Service**.<br />Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#externalname-service). | "GET" | No |
| `routes[n].`<br />`services[m].`<br />`healthCheck.status` | Expected HTTP status code of the response to the health check request.<br />Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type ExternalName.<br />If not set, expect a status between 200 and 399.<br />Evaluated only if the kind is **Service**. | | No | | `routes[n].`<br />`services[m].`<br />`healthCheck.status` | Expected HTTP status code of the response to the health check request.<br />Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type ExternalName.<br />If not set, expect a status between 200 and 399.<br />Evaluated only if the kind is **Service**. | | No |
| `routes[n].`<br />`services[m].`<br />`healthCheck.port` | URL port for the health check endpoint.<br />Evaluated only if the kind is **Service**.<br />Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#externalname-service). | | No | | `routes[n].`<br />`services[m].`<br />`healthCheck.port` | URL port for the health check endpoint.<br />Evaluated only if the kind is **Service**.<br />Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#externalname-service). | | No |

View File

@ -149,7 +149,7 @@ data:
### Configuration Options ### Configuration Options
| Field | Description | Default | Required | | Field | Description | Default | Required |
|:---------------------------------------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:---------------------------------------------------------------------|:---------| |:------|:----------------------------------------------------------|:---------------------|:---------|
| `services` | List of any combination of TraefikService and [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/). <br />. | | No | | `services` | List of any combination of TraefikService and [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/). <br />. | | No |
| `services[m].`<br />`kind` | Kind of the service targeted.<br />Two values allowed:<br />- **Service**: Kubernetes Service<br /> - **TraefikService**: Traefik Service. | "" | No | | `services[m].`<br />`kind` | Kind of the service targeted.<br />Two values allowed:<br />- **Service**: Kubernetes Service<br /> - **TraefikService**: Traefik Service. | "" | No |
| `services[m].`<br />`name` | Service name.<br />The character `@` is not authorized. | "" | Yes | | `services[m].`<br />`name` | Service name.<br />The character `@` is not authorized. | "" | Yes |
@ -162,8 +162,7 @@ data:
| `services[m].`<br />`healthCheck.scheme` | Server URL scheme for the health check endpoint.<br />Evaluated only if the kind is **Service**.<br />Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type `ExternalName`. | "" | No | | `services[m].`<br />`healthCheck.scheme` | Server URL scheme for the health check endpoint.<br />Evaluated only if the kind is **Service**.<br />Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type `ExternalName`. | "" | No |
| `services[m].`<br />`healthCheck.mode` | Health check mode.<br /> If defined to grpc, will use the gRPC health check protocol to probe the server.<br />Evaluated only if the kind is **Service**.<br />Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type `ExternalName`. | "http" | No | | `services[m].`<br />`healthCheck.mode` | Health check mode.<br /> If defined to grpc, will use the gRPC health check protocol to probe the server.<br />Evaluated only if the kind is **Service**.<br />Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type `ExternalName`. | "http" | No |
| `services[m].`<br />`healthCheck.path` | Server URL path for the health check endpoint.<br />Evaluated only if the kind is **Service**.<br />Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type `ExternalName`. | "" | No | | `services[m].`<br />`healthCheck.path` | Server URL path for the health check endpoint.<br />Evaluated only if the kind is **Service**.<br />Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type `ExternalName`. | "" | No |
| `services[m].`<br />`healthCheck.interval` | Frequency of the health check calls for healthy targets.<br />Evaluated only if the kind is **Service**.<br />Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName]`ExternalName`. | "100ms" | No | | `services[m].`<br />`healthCheck.interval` | Frequency of the health check calls.<br />Evaluated only if the kind is **Service**.<br />Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName]`ExternalName`. | "100ms" | No |
| `services[m].`<br />`healthCheck.unhealthyInterval` | Frequency of the health check calls for unhealthy targets.<br />When not defined, it defaults to the `interval` value.<br />Evaluated only if the kind is **Service**.<br />Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName]`ExternalName`. | "100ms" | No |
| `services[m].`<br />`healthCheck.method` | HTTP method for the health check endpoint.<br />Evaluated only if the kind is **Service**.<br />Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type `ExternalName`. | "GET" | No | | `services[m].`<br />`healthCheck.method` | HTTP method for the health check endpoint.<br />Evaluated only if the kind is **Service**.<br />Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type `ExternalName`. | "GET" | No |
| `services[m].`<br />`healthCheck.status` | Expected HTTP status code of the response to the health check request.<br />Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type ExternalName.<br />If not set, expect a status between 200 and 399.<br />Evaluated only if the kind is **Service**. | | No | | `services[m].`<br />`healthCheck.status` | Expected HTTP status code of the response to the health check request.<br />Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type ExternalName.<br />If not set, expect a status between 200 and 399.<br />Evaluated only if the kind is **Service**. | | No |
| `services[m].`<br />`healthCheck.port` | URL port for the health check endpoint.<br />Evaluated only if the kind is **Service**.<br />Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type `ExternalName`. | | No | | `services[m].`<br />`healthCheck.port` | URL port for the health check endpoint.<br />Evaluated only if the kind is **Service**.<br />Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type `ExternalName`. | | No |
@ -374,7 +373,7 @@ spec:
The mirrored services properties are set in the `mirrors` list. The mirrored services properties are set in the `mirrors` list.
| Field | Description | Default | Required | | Field | Description | Default | Required |
|:--------------------------------------------------------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:---------------------------------------------------------------------|:---------| |:------|:----------------------------------------------------------|:---------------------|:---------|
| `kind` | Kind of the main service.<br />Two values allowed:<br />- **Service**: Kubernetes Service<br />- **TraefikService**: Traefik Service.<br />More information [here](#services) | "" | No | | `kind` | Kind of the main service.<br />Two values allowed:<br />- **Service**: Kubernetes Service<br />- **TraefikService**: Traefik Service.<br />More information [here](#services) | "" | No |
| `name` | Main service name.<br />The character `@` is not authorized. | "" | Yes | | `name` | Main service name.<br />The character `@` is not authorized. | "" | Yes |
| `namespace` | Main service namespace.<br />More information [here](#services). | "" | No | | `namespace` | Main service namespace.<br />More information [here](#services). | "" | No |
@ -386,8 +385,7 @@ spec:
| `healthCheck.scheme` | Server URL scheme for the health check endpoint.<br />Evaluated only if the kind of the main service is **Service**.<br />Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | "" | No | | `healthCheck.scheme` | Server URL scheme for the health check endpoint.<br />Evaluated only if the kind of the main service is **Service**.<br />Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | "" | No |
| `healthCheck.mode` | Health check mode.<br /> If defined to grpc, will use the gRPC health check protocol to probe the server.<br />Evaluated only if the kind of the main service is **Service**.<br />Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | "http" | No | | `healthCheck.mode` | Health check mode.<br /> If defined to grpc, will use the gRPC health check protocol to probe the server.<br />Evaluated only if the kind of the main service is **Service**.<br />Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | "http" | No |
| `healthCheck.path` | Server URL path for the health check endpoint.<br />Evaluated only if the kind of the main service is **Service**.<br />Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | "" | No | | `healthCheck.path` | Server URL path for the health check endpoint.<br />Evaluated only if the kind of the main service is **Service**.<br />Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | "" | No |
| `healthCheck.interval` | Frequency of the health check calls for healthy targets.<br />Evaluated only if the kind of the main service is **Service**.<br />Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | "100ms" | No | | `healthCheck.interval` | Frequency of the health check calls.<br />Evaluated only if the kind of the main service is **Service**.<br />Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | "100ms" | No |
| `healthCheck.unhealthyInterval` | Frequency of the health check calls for unhealthy targets.<br />When not defined, it defaults to the `interval` value.<br />Evaluated only if the kind of the main service is **Service**.<br />Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | "100ms" | No |
| `healthCheck.method` | HTTP method for the health check endpoint.<br />Evaluated only if the kind of the main service is **Service**.<br />Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | "GET" | No | | `healthCheck.method` | HTTP method for the health check endpoint.<br />Evaluated only if the kind of the main service is **Service**.<br />Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | "GET" | No |
| `healthCheck.status` | Expected HTTP status code of the response to the health check request.<br />Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type ExternalName.<br />If not set, expect a status between 200 and 399.<br />Evaluated only if the kind of the main service is **Service**. | | No | | `healthCheck.status` | Expected HTTP status code of the response to the health check request.<br />Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type ExternalName.<br />If not set, expect a status between 200 and 399.<br />Evaluated only if the kind of the main service is **Service**. | | No |
| `healthCheck.port` | URL port for the health check endpoint.<br />Evaluated only if the kind of the main service is **Service**.<br />Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | | No | | `healthCheck.port` | URL port for the health check endpoint.<br />Evaluated only if the kind of the main service is **Service**.<br />Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | | No |
@ -419,7 +417,6 @@ spec:
| `mirrors[m].`<br />`healthCheck.mode` | Health check mode.<br /> If defined to grpc, will use the gRPC health check protocol to probe the server.<br />Evaluated only if the kind of the mirrored service is **Service**.<br />Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | "http" | No | | `mirrors[m].`<br />`healthCheck.mode` | Health check mode.<br /> If defined to grpc, will use the gRPC health check protocol to probe the server.<br />Evaluated only if the kind of the mirrored service is **Service**.<br />Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | "http" | No |
| `mirrors[m].`<br />`healthCheck.path` | Server URL path for the health check endpoint.<br />Evaluated only if the kind of the mirrored service is **Service**.<br />Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | "" | No | | `mirrors[m].`<br />`healthCheck.path` | Server URL path for the health check endpoint.<br />Evaluated only if the kind of the mirrored service is **Service**.<br />Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | "" | No |
| `mirrors[m].`<br />`healthCheck.interval` | Frequency of the health check calls.<br />Evaluated only if the kind of the mirrored service is **Service**.<br />Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | "100ms" | No | | `mirrors[m].`<br />`healthCheck.interval` | Frequency of the health check calls.<br />Evaluated only if the kind of the mirrored service is **Service**.<br />Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | "100ms" | No |
| `mirrors[m].`<br />`healthCheck.unhealthyInterval` | Frequency of the health check calls for unhealthy targets.<br />When not defined, it defaults to the `interval` value.<br />Evaluated only if the kind of the mirrored service is **Service**.<br />Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | "100ms" | No |
| `mirrors[m].`<br />`healthCheck.method` | HTTP method for the health check endpoint.<br />Evaluated only if the kind of the mirrored service is **Service**.<br />Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | "GET" | No | | `mirrors[m].`<br />`healthCheck.method` | HTTP method for the health check endpoint.<br />Evaluated only if the kind of the mirrored service is **Service**.<br />Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | "GET" | No |
| `mirrors[m].`<br />`healthCheck.status` | Expected HTTP status code of the response to the health check request.<br />Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type ExternalName.<br />If not set, expect a status between 200 and 399.<br />Evaluated only if the kind of the mirrored service is **Service**. | | No | | `mirrors[m].`<br />`healthCheck.status` | Expected HTTP status code of the response to the health check request.<br />Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type ExternalName.<br />If not set, expect a status between 200 and 399.<br />Evaluated only if the kind of the mirrored service is **Service**. | | No |
| `mirrors[m].`<br />`healthCheck.port` | URL port for the health check endpoint.<br />Evaluated only if the kind of the mirrored service is **Service**.<br />Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | | No | | `mirrors[m].`<br />`healthCheck.port` | URL port for the health check endpoint.<br />Evaluated only if the kind of the mirrored service is **Service**.<br />Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | | No |

View File

@ -222,14 +222,6 @@ you'd add the tag `traefik.http.services.{name-of-your-choice}.loadbalancer.pass
traefik.http.services.myservice.loadbalancer.healthcheck.interval=10 traefik.http.services.myservice.loadbalancer.healthcheck.interval=10
``` ```
??? info "`traefik.http.services.<service_name>.loadbalancer.healthcheck.unhealthyinterval`"
See [health check](../http/load-balancing/service.md#health-check) for more information.
```yaml
traefik.http.services.myservice.loadbalancer.healthcheck.unhealthyinterval=10
```
??? info "`traefik.http.services.<service_name>.loadbalancer.healthcheck.path`" ??? info "`traefik.http.services.<service_name>.loadbalancer.healthcheck.path`"
See [health check](../http/load-balancing/service.md#health-check) for more information. See [health check](../http/load-balancing/service.md#health-check) for more information.

View File

@ -327,14 +327,6 @@ you'd add the label `traefik.http.services.<name-of-your-choice>.loadbalancer.pa
"traefik.http.services.myservice.loadbalancer.healthcheck.interval=10s" "traefik.http.services.myservice.loadbalancer.healthcheck.interval=10s"
``` ```
??? info "`traefik.http.services.<service_name>.loadbalancer.healthcheck.unhealthyinterval`"
See [health check](../http/load-balancing/service.md#health-check) for more information.
```yaml
"traefik.http.services.myservice.loadbalancer.healthcheck.unhealthyinterval=10s"
```
??? info "`traefik.http.services.<service_name>.loadbalancer.healthcheck.path`" ??? info "`traefik.http.services.<service_name>.loadbalancer.healthcheck.path`"
See [health check](../http/load-balancing/service.md#health-check) for more information. See [health check](../http/load-balancing/service.md#health-check) for more information.

View File

@ -218,14 +218,6 @@ you'd add the label `traefik.http.services.{name-of-your-choice}.loadbalancer.pa
traefik.http.services.myservice.loadbalancer.healthcheck.interval=10 traefik.http.services.myservice.loadbalancer.healthcheck.interval=10
``` ```
??? info "`traefik.http.services.<service_name>.loadbalancer.healthcheck.unhealthyinterval`"
See [health check](../http/load-balancing/service.md#health-check) for more information.
```yaml
traefik.http.services.myservice.loadbalancer.healthcheck.unhealthyinterval=10
```
??? info "`traefik.http.services.<service_name>.loadbalancer.healthcheck.path`" ??? info "`traefik.http.services.<service_name>.loadbalancer.healthcheck.path`"
See [health check](../http/load-balancing/service.md#health-check) for more information. See [health check](../http/load-balancing/service.md#health-check) for more information.

View File

@ -203,14 +203,6 @@ description: "Read the technical documentation to learn the Traefik Routing Conf
|---------------------------------------------------------------------|-------| |---------------------------------------------------------------------|-------|
| `traefik/http/services/myservice/loadbalancer/healthcheck/interval` | `10` | | `traefik/http/services/myservice/loadbalancer/healthcheck/interval` | `10` |
??? info "`traefik/http/services/<service_name>/loadbalancer/healthcheck/unhealthyinterval`"
See [health check](../http/load-balancing/service.md#health-check) for more information.
| Key (Path) | Value |
|------------------------------------------------------------------------------|-------|
| `traefik/http/services/myservice/loadbalancer/healthcheck/unhealthyinterval` | `10` |
??? info "`traefik/http/services/<service_name>/loadbalancer/healthcheck/path`" ??? info "`traefik/http/services/<service_name>/loadbalancer/healthcheck/path`"
See [health check](../http/load-balancing/service.md#health-check) for more information. See [health check](../http/load-balancing/service.md#health-check) for more information.

View File

@ -222,14 +222,6 @@ you'd add the tag `traefik.http.services.{name-of-your-choice}.loadbalancer.pass
traefik.http.services.myservice.loadbalancer.healthcheck.interval=10 traefik.http.services.myservice.loadbalancer.healthcheck.interval=10
``` ```
??? info "`traefik.http.services.<service_name>.loadbalancer.healthcheck.unhealthyinterval`"
See [health check](../http/load-balancing/service.md#health-check) for more information.
```yaml
traefik.http.services.myservice.loadbalancer.healthcheck.unhealthyinterval=10
```
??? info "`traefik.http.services.<service_name>.loadbalancer.healthcheck.path`" ??? info "`traefik.http.services.<service_name>.loadbalancer.healthcheck.path`"
See [health check](../http/load-balancing/service.md#health-check) for more information. See [health check](../http/load-balancing/service.md#health-check) for more information.

View File

@ -351,14 +351,6 @@ you'd add the label `traefik.http.services.<name-of-your-choice>.loadbalancer.pa
- "traefik.http.services.myservice.loadbalancer.healthcheck.interval=10s" - "traefik.http.services.myservice.loadbalancer.healthcheck.interval=10s"
``` ```
??? info "`traefik.http.services.<service_name>.loadbalancer.healthcheck.unhealthyinterval`"
See [health check](../http/load-balancing/service.md#health-check) for more information.
```yaml
- "traefik.http.services.myservice.loadbalancer.healthcheck.unhealthyinterval=10s"
```
??? info "`traefik.http.services.<service_name>.loadbalancer.healthcheck.path`" ??? info "`traefik.http.services.<service_name>.loadbalancer.healthcheck.path`"
See [health check](../http/load-balancing/service.md#health-check) for more information. See [health check](../http/load-balancing/service.md#health-check) for more information.

View File

@ -129,12 +129,6 @@ Define if the certificates pool must use a copy of the system cert pool. (Defaul
`--certificatesresolvers.<name>.acme.certificatesduration`: `--certificatesresolvers.<name>.acme.certificatesduration`:
Certificates' duration in hours. (Default: ```2160```) Certificates' duration in hours. (Default: ```2160```)
`--certificatesresolvers.<name>.acme.clientresponseheadertimeout`:
Timeout for receiving the response headers when communicating with the ACME server. (Default: ```30```)
`--certificatesresolvers.<name>.acme.clienttimeout`:
Timeout for a complete HTTP transaction with the ACME server. (Default: ```120```)
`--certificatesresolvers.<name>.acme.dnschallenge`: `--certificatesresolvers.<name>.acme.dnschallenge`:
Activate DNS-01 Challenge. (Default: ```false```) Activate DNS-01 Challenge. (Default: ```false```)
@ -180,9 +174,6 @@ CSR email addresses to use.
`--certificatesresolvers.<name>.acme.httpchallenge`: `--certificatesresolvers.<name>.acme.httpchallenge`:
Activate HTTP-01 Challenge. (Default: ```false```) Activate HTTP-01 Challenge. (Default: ```false```)
`--certificatesresolvers.<name>.acme.httpchallenge.delay`:
Delay between the creation of the challenge and the validation. (Default: ```0```)
`--certificatesresolvers.<name>.acme.httpchallenge.entrypoint`: `--certificatesresolvers.<name>.acme.httpchallenge.entrypoint`:
HTTP challenge EntryPoint HTTP challenge EntryPoint
@ -354,9 +345,6 @@ Environment variables to forward to the wasm guest.
`--experimental.localplugins.<name>.settings.mounts`: `--experimental.localplugins.<name>.settings.mounts`:
Directory to mount to the wasm guest. Directory to mount to the wasm guest.
`--experimental.localplugins.<name>.settings.useunsafe`:
Allow the plugin to use unsafe package. (Default: ```false```)
`--experimental.otlplogs`: `--experimental.otlplogs`:
Enables the OpenTelemetry logs integration. (Default: ```false```) Enables the OpenTelemetry logs integration. (Default: ```false```)
@ -372,9 +360,6 @@ Environment variables to forward to the wasm guest.
`--experimental.plugins.<name>.settings.mounts`: `--experimental.plugins.<name>.settings.mounts`:
Directory to mount to the wasm guest. Directory to mount to the wasm guest.
`--experimental.plugins.<name>.settings.useunsafe`:
Allow the plugin to use unsafe package. (Default: ```false```)
`--experimental.plugins.<name>.version`: `--experimental.plugins.<name>.version`:
plugin's version. plugin's version.

View File

@ -129,12 +129,6 @@ Define if the certificates pool must use a copy of the system cert pool. (Defaul
`TRAEFIK_CERTIFICATESRESOLVERS_<NAME>_ACME_CERTIFICATESDURATION`: `TRAEFIK_CERTIFICATESRESOLVERS_<NAME>_ACME_CERTIFICATESDURATION`:
Certificates' duration in hours. (Default: ```2160```) Certificates' duration in hours. (Default: ```2160```)
`TRAEFIK_CERTIFICATESRESOLVERS_<NAME>_ACME_CLIENTRESPONSEHEADERTIMEOUT`:
Timeout for receiving the response headers when communicating with the ACME server. (Default: ```30```)
`TRAEFIK_CERTIFICATESRESOLVERS_<NAME>_ACME_CLIENTTIMEOUT`:
Timeout for a complete HTTP transaction with the ACME server. (Default: ```120```)
`TRAEFIK_CERTIFICATESRESOLVERS_<NAME>_ACME_DNSCHALLENGE`: `TRAEFIK_CERTIFICATESRESOLVERS_<NAME>_ACME_DNSCHALLENGE`:
Activate DNS-01 Challenge. (Default: ```false```) Activate DNS-01 Challenge. (Default: ```false```)
@ -180,9 +174,6 @@ CSR email addresses to use.
`TRAEFIK_CERTIFICATESRESOLVERS_<NAME>_ACME_HTTPCHALLENGE`: `TRAEFIK_CERTIFICATESRESOLVERS_<NAME>_ACME_HTTPCHALLENGE`:
Activate HTTP-01 Challenge. (Default: ```false```) Activate HTTP-01 Challenge. (Default: ```false```)
`TRAEFIK_CERTIFICATESRESOLVERS_<NAME>_ACME_HTTPCHALLENGE_DELAY`:
Delay between the creation of the challenge and the validation. (Default: ```0```)
`TRAEFIK_CERTIFICATESRESOLVERS_<NAME>_ACME_HTTPCHALLENGE_ENTRYPOINT`: `TRAEFIK_CERTIFICATESRESOLVERS_<NAME>_ACME_HTTPCHALLENGE_ENTRYPOINT`:
HTTP challenge EntryPoint HTTP challenge EntryPoint
@ -354,9 +345,6 @@ Environment variables to forward to the wasm guest.
`TRAEFIK_EXPERIMENTAL_LOCALPLUGINS_<NAME>_SETTINGS_MOUNTS`: `TRAEFIK_EXPERIMENTAL_LOCALPLUGINS_<NAME>_SETTINGS_MOUNTS`:
Directory to mount to the wasm guest. Directory to mount to the wasm guest.
`TRAEFIK_EXPERIMENTAL_LOCALPLUGINS_<NAME>_SETTINGS_USEUNSAFE`:
Allow the plugin to use unsafe package. (Default: ```false```)
`TRAEFIK_EXPERIMENTAL_OTLPLOGS`: `TRAEFIK_EXPERIMENTAL_OTLPLOGS`:
Enables the OpenTelemetry logs integration. (Default: ```false```) Enables the OpenTelemetry logs integration. (Default: ```false```)
@ -372,9 +360,6 @@ Environment variables to forward to the wasm guest.
`TRAEFIK_EXPERIMENTAL_PLUGINS_<NAME>_SETTINGS_MOUNTS`: `TRAEFIK_EXPERIMENTAL_PLUGINS_<NAME>_SETTINGS_MOUNTS`:
Directory to mount to the wasm guest. Directory to mount to the wasm guest.
`TRAEFIK_EXPERIMENTAL_PLUGINS_<NAME>_SETTINGS_USEUNSAFE`:
Allow the plugin to use unsafe package. (Default: ```false```)
`TRAEFIK_EXPERIMENTAL_PLUGINS_<NAME>_VERSION`: `TRAEFIK_EXPERIMENTAL_PLUGINS_<NAME>_VERSION`:
plugin's version. plugin's version.

View File

@ -511,8 +511,6 @@
storage = "foobar" storage = "foobar"
keyType = "foobar" keyType = "foobar"
certificatesDuration = 42 certificatesDuration = 42
clientTimeout = "42s"
clientResponseHeaderTimeout = "42s"
caCertificates = ["foobar", "foobar"] caCertificates = ["foobar", "foobar"]
caSystemCertPool = true caSystemCertPool = true
caServerName = "foobar" caServerName = "foobar"
@ -531,7 +529,6 @@
delayBeforeChecks = "42s" delayBeforeChecks = "42s"
[certificatesResolvers.CertificateResolver0.acme.httpChallenge] [certificatesResolvers.CertificateResolver0.acme.httpChallenge]
entryPoint = "foobar" entryPoint = "foobar"
delay = "42s"
[certificatesResolvers.CertificateResolver0.acme.tlsChallenge] [certificatesResolvers.CertificateResolver0.acme.tlsChallenge]
[certificatesResolvers.CertificateResolver0.tailscale] [certificatesResolvers.CertificateResolver0.tailscale]
[certificatesResolvers.CertificateResolver1] [certificatesResolvers.CertificateResolver1]
@ -544,8 +541,6 @@
storage = "foobar" storage = "foobar"
keyType = "foobar" keyType = "foobar"
certificatesDuration = 42 certificatesDuration = 42
clientTimeout = "42s"
clientResponseHeaderTimeout = "42s"
caCertificates = ["foobar", "foobar"] caCertificates = ["foobar", "foobar"]
caSystemCertPool = true caSystemCertPool = true
caServerName = "foobar" caServerName = "foobar"
@ -564,7 +559,6 @@
delayBeforeChecks = "42s" delayBeforeChecks = "42s"
[certificatesResolvers.CertificateResolver1.acme.httpChallenge] [certificatesResolvers.CertificateResolver1.acme.httpChallenge]
entryPoint = "foobar" entryPoint = "foobar"
delay = "42s"
[certificatesResolvers.CertificateResolver1.acme.tlsChallenge] [certificatesResolvers.CertificateResolver1.acme.tlsChallenge]
[certificatesResolvers.CertificateResolver1.tailscale] [certificatesResolvers.CertificateResolver1.tailscale]
@ -579,27 +573,23 @@
[experimental.plugins.Descriptor0.settings] [experimental.plugins.Descriptor0.settings]
envs = ["foobar", "foobar"] envs = ["foobar", "foobar"]
mounts = ["foobar", "foobar"] mounts = ["foobar", "foobar"]
useUnsafe = true
[experimental.plugins.Descriptor1] [experimental.plugins.Descriptor1]
moduleName = "foobar" moduleName = "foobar"
version = "foobar" version = "foobar"
[experimental.plugins.Descriptor1.settings] [experimental.plugins.Descriptor1.settings]
envs = ["foobar", "foobar"] envs = ["foobar", "foobar"]
mounts = ["foobar", "foobar"] mounts = ["foobar", "foobar"]
useUnsafe = true
[experimental.localPlugins] [experimental.localPlugins]
[experimental.localPlugins.LocalDescriptor0] [experimental.localPlugins.LocalDescriptor0]
moduleName = "foobar" moduleName = "foobar"
[experimental.localPlugins.LocalDescriptor0.settings] [experimental.localPlugins.LocalDescriptor0.settings]
envs = ["foobar", "foobar"] envs = ["foobar", "foobar"]
mounts = ["foobar", "foobar"] mounts = ["foobar", "foobar"]
useUnsafe = true
[experimental.localPlugins.LocalDescriptor1] [experimental.localPlugins.LocalDescriptor1]
moduleName = "foobar" moduleName = "foobar"
[experimental.localPlugins.LocalDescriptor1.settings] [experimental.localPlugins.LocalDescriptor1.settings]
envs = ["foobar", "foobar"] envs = ["foobar", "foobar"]
mounts = ["foobar", "foobar"] mounts = ["foobar", "foobar"]
useUnsafe = true
[experimental.fastProxy] [experimental.fastProxy]
debug = true debug = true

View File

@ -557,8 +557,6 @@ certificatesResolvers:
kid: foobar kid: foobar
hmacEncoded: foobar hmacEncoded: foobar
certificatesDuration: 42 certificatesDuration: 42
clientTimeout: 42s
clientResponseHeaderTimeout: 42s
caCertificates: caCertificates:
- foobar - foobar
- foobar - foobar
@ -578,7 +576,6 @@ certificatesResolvers:
disablePropagationCheck: true disablePropagationCheck: true
httpChallenge: httpChallenge:
entryPoint: foobar entryPoint: foobar
delay: 42s
tlsChallenge: {} tlsChallenge: {}
tailscale: {} tailscale: {}
CertificateResolver1: CertificateResolver1:
@ -596,8 +593,6 @@ certificatesResolvers:
kid: foobar kid: foobar
hmacEncoded: foobar hmacEncoded: foobar
certificatesDuration: 42 certificatesDuration: 42
clientTimeout: 42s
clientResponseHeaderTimeout: 42s
caCertificates: caCertificates:
- foobar - foobar
- foobar - foobar
@ -617,7 +612,6 @@ certificatesResolvers:
disablePropagationCheck: true disablePropagationCheck: true
httpChallenge: httpChallenge:
entryPoint: foobar entryPoint: foobar
delay: 42s
tlsChallenge: {} tlsChallenge: {}
tailscale: {} tailscale: {}
experimental: experimental:
@ -632,7 +626,6 @@ experimental:
mounts: mounts:
- foobar - foobar
- foobar - foobar
useUnsafe: true
Descriptor1: Descriptor1:
moduleName: foobar moduleName: foobar
version: foobar version: foobar
@ -643,7 +636,6 @@ experimental:
mounts: mounts:
- foobar - foobar
- foobar - foobar
useUnsafe: true
localPlugins: localPlugins:
LocalDescriptor0: LocalDescriptor0:
moduleName: foobar moduleName: foobar
@ -654,7 +646,6 @@ experimental:
mounts: mounts:
- foobar - foobar
- foobar - foobar
useUnsafe: true
LocalDescriptor1: LocalDescriptor1:
moduleName: foobar moduleName: foobar
settings: settings:
@ -664,7 +655,6 @@ experimental:
mounts: mounts:
- foobar - foobar
- foobar - foobar
useUnsafe: true
abortOnPluginFailure: true abortOnPluginFailure: true
fastProxy: fastProxy:
debug: true debug: true

View File

@ -218,14 +218,6 @@ you'd add the tag `traefik.http.services.{name-of-your-choice}.loadbalancer.pass
traefik.http.services.myservice.loadbalancer.healthcheck.interval=10 traefik.http.services.myservice.loadbalancer.healthcheck.interval=10
``` ```
??? info "`traefik.http.services.<service_name>.loadbalancer.healthcheck.unhealthyinterval`"
See [health check](../services/index.md#health-check) for more information.
```yaml
traefik.http.services.myservice.loadbalancer.healthcheck.unhealthyinterval=10
```
??? info "`traefik.http.services.<service_name>.loadbalancer.healthcheck.path`" ??? info "`traefik.http.services.<service_name>.loadbalancer.healthcheck.path`"
See [health check](../services/index.md#health-check) for more information. See [health check](../services/index.md#health-check) for more information.

View File

@ -333,14 +333,6 @@ you'd add the label `traefik.http.services.<name-of-your-choice>.loadbalancer.pa
- "traefik.http.services.myservice.loadbalancer.healthcheck.interval=10s" - "traefik.http.services.myservice.loadbalancer.healthcheck.interval=10s"
``` ```
??? info "`traefik.http.services.<service_name>.loadbalancer.healthcheck.unhealthyinterval`"
See [health check](../services/index.md#health-check) for more information.
```yaml
- "traefik.http.services.myservice.loadbalancer.healthcheck.unhealthyinterval=10s"
```
??? info "`traefik.http.services.<service_name>.loadbalancer.healthcheck.path`" ??? info "`traefik.http.services.<service_name>.loadbalancer.healthcheck.path`"
See [health check](../services/index.md#health-check) for more information. See [health check](../services/index.md#health-check) for more information.

View File

@ -220,14 +220,6 @@ you'd add the label `traefik.http.services.{name-of-your-choice}.loadbalancer.pa
traefik.http.services.myservice.loadbalancer.healthcheck.interval=10 traefik.http.services.myservice.loadbalancer.healthcheck.interval=10
``` ```
??? info "`traefik.http.services.<service_name>.loadbalancer.healthcheck.unhealthyinterval`"
See [health check](../services/index.md#health-check) for more information.
```yaml
traefik.http.services.myservice.loadbalancer.healthcheck.unhealthyinterval=10
```
??? info "`traefik.http.services.<service_name>.loadbalancer.healthcheck.path`" ??? info "`traefik.http.services.<service_name>.loadbalancer.healthcheck.path`"
See [health check](../services/index.md#health-check) for more information. See [health check](../services/index.md#health-check) for more information.

View File

@ -180,14 +180,6 @@ A Story of key & values
|---------------------------------------------------------------------|-------| |---------------------------------------------------------------------|-------|
| `traefik/http/services/myservice/loadbalancer/healthcheck/interval` | `10` | | `traefik/http/services/myservice/loadbalancer/healthcheck/interval` | `10` |
??? info "`traefik/http/services/<service_name>/loadbalancer/healthcheck/unhealthyinterval`"
See [health check](../services/index.md#health-check) for more information.
| Key (Path) | Value |
|------------------------------------------------------------------------------|-------|
| `traefik/http/services/myservice/loadbalancer/healthcheck/unhealthyinterval` | `10` |
??? info "`traefik/http/services/<service_name>/loadbalancer/healthcheck/path`" ??? info "`traefik/http/services/<service_name>/loadbalancer/healthcheck/path`"
See [health check](../services/index.md#health-check) for more information. See [health check](../services/index.md#health-check) for more information.

View File

@ -218,14 +218,6 @@ you'd add the tag `traefik.http.services.{name-of-your-choice}.loadbalancer.pass
traefik.http.services.myservice.loadbalancer.healthcheck.interval=10 traefik.http.services.myservice.loadbalancer.healthcheck.interval=10
``` ```
??? info "`traefik.http.services.<service_name>.loadbalancer.healthcheck.unhealthyinterval`"
See [health check](../services/index.md#health-check) for more information.
```yaml
traefik.http.services.myservice.loadbalancer.healthcheck.unhealthyinterval=10
```
??? info "`traefik.http.services.<service_name>.loadbalancer.healthcheck.path`" ??? info "`traefik.http.services.<service_name>.loadbalancer.healthcheck.path`"
See [health check](../services/index.md#health-check) for more information. See [health check](../services/index.md#health-check) for more information.

View File

@ -347,14 +347,6 @@ you'd add the label `traefik.http.services.<name-of-your-choice>.loadbalancer.pa
- "traefik.http.services.myservice.loadbalancer.healthcheck.interval=10s" - "traefik.http.services.myservice.loadbalancer.healthcheck.interval=10s"
``` ```
??? info "`traefik.http.services.<service_name>.loadbalancer.healthcheck.unhealthyinterval`"
See [health check](../services/index.md#health-check) for more information.
```yaml
- "traefik.http.services.myservice.loadbalancer.healthcheck.unhealthyinterval=10s"
```
??? info "`traefik.http.services.<service_name>.loadbalancer.healthcheck.path`" ??? info "`traefik.http.services.<service_name>.loadbalancer.healthcheck.path`"
See [health check](../services/index.md#health-check) for more information. See [health check](../services/index.md#health-check) for more information.

View File

@ -415,8 +415,7 @@ Below are the available options for the health check mechanism:
- `mode` (default: http), if defined to `grpc`, will use the gRPC health check protocol to probe the server. - `mode` (default: http), if defined to `grpc`, will use the gRPC health check protocol to probe the server.
- `hostname` (optional), sets the value of `hostname` in the `Host` header of the health check request. - `hostname` (optional), sets the value of `hostname` in the `Host` header of the health check request.
- `port` (optional), replaces the server URL `port` for the health check endpoint. - `port` (optional), replaces the server URL `port` for the health check endpoint.
- `interval` (default: 30s), defines the frequency of the health check calls for healthy targets. - `interval` (default: 30s), defines the frequency of the health check calls.
- `unhealthyInterval` (default: 30s), defines the frequency of the health check calls for unhealthy targets. When not defined, it defaults to the `interval` value.
- `timeout` (default: 5s), defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy. - `timeout` (default: 5s), defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy.
- `headers` (optional), defines custom headers to be sent to the health check endpoint. - `headers` (optional), defines custom headers to be sent to the health check endpoint.
- `followRedirects` (default: true), defines whether redirects should be followed during the health check calls. - `followRedirects` (default: true), defines whether redirects should be followed during the health check calls.
@ -425,7 +424,7 @@ Below are the available options for the health check mechanism:
!!! info "Interval & Timeout Format" !!! info "Interval & Timeout Format"
Interval, UnhealthyInterval and Timeout are to be given in a format understood by [time.ParseDuration](https://golang.org/pkg/time/#ParseDuration). Interval and timeout are to be given in a format understood by [time.ParseDuration](https://golang.org/pkg/time/#ParseDuration).
!!! info "Recovering Servers" !!! info "Recovering Servers"

View File

@ -136,7 +136,7 @@ spec:
- type: integer - type: integer
- type: string - type: string
description: |- description: |-
Interval defines the frequency of the health check calls for healthy targets. Interval defines the frequency of the health check calls.
Default: 30s Default: 30s
x-kubernetes-int-or-string: true x-kubernetes-int-or-string: true
method: method:
@ -172,15 +172,6 @@ spec:
Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy. Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy.
Default: 5s Default: 5s
x-kubernetes-int-or-string: true x-kubernetes-int-or-string: true
unhealthyInterval:
anyOf:
- type: integer
- type: string
description: |-
UnhealthyInterval defines the frequency of the health check calls for unhealthy targets.
When UnhealthyInterval is not defined, it defaults to the Interval value.
Default: 30s
x-kubernetes-int-or-string: true
type: object type: object
kind: kind:
description: Kind defines the kind of the Service. description: Kind defines the kind of the Service.
@ -1078,7 +1069,7 @@ spec:
- type: integer - type: integer
- type: string - type: string
description: |- description: |-
Interval defines the frequency of the health check calls for healthy targets. Interval defines the frequency of the health check calls.
Default: 30s Default: 30s
x-kubernetes-int-or-string: true x-kubernetes-int-or-string: true
method: method:
@ -1114,15 +1105,6 @@ spec:
Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy. Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy.
Default: 5s Default: 5s
x-kubernetes-int-or-string: true x-kubernetes-int-or-string: true
unhealthyInterval:
anyOf:
- type: integer
- type: string
description: |-
UnhealthyInterval defines the frequency of the health check calls for unhealthy targets.
When UnhealthyInterval is not defined, it defaults to the Interval value.
Default: 30s
x-kubernetes-int-or-string: true
type: object type: object
kind: kind:
description: Kind defines the kind of the Service. description: Kind defines the kind of the Service.
@ -2759,7 +2741,7 @@ spec:
- type: integer - type: integer
- type: string - type: string
description: |- description: |-
Interval defines the frequency of the health check calls for healthy targets. Interval defines the frequency of the health check calls.
Default: 30s Default: 30s
x-kubernetes-int-or-string: true x-kubernetes-int-or-string: true
method: method:
@ -2795,15 +2777,6 @@ spec:
Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy. Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy.
Default: 5s Default: 5s
x-kubernetes-int-or-string: true x-kubernetes-int-or-string: true
unhealthyInterval:
anyOf:
- type: integer
- type: string
description: |-
UnhealthyInterval defines the frequency of the health check calls for unhealthy targets.
When UnhealthyInterval is not defined, it defaults to the Interval value.
Default: 30s
x-kubernetes-int-or-string: true
type: object type: object
kind: kind:
description: Kind defines the kind of the Service. description: Kind defines the kind of the Service.
@ -2853,7 +2826,7 @@ spec:
- type: integer - type: integer
- type: string - type: string
description: |- description: |-
Interval defines the frequency of the health check calls for healthy targets. Interval defines the frequency of the health check calls.
Default: 30s Default: 30s
x-kubernetes-int-or-string: true x-kubernetes-int-or-string: true
method: method:
@ -2889,15 +2862,6 @@ spec:
Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy. Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy.
Default: 5s Default: 5s
x-kubernetes-int-or-string: true x-kubernetes-int-or-string: true
unhealthyInterval:
anyOf:
- type: integer
- type: string
description: |-
UnhealthyInterval defines the frequency of the health check calls for unhealthy targets.
When UnhealthyInterval is not defined, it defaults to the Interval value.
Default: 30s
x-kubernetes-int-or-string: true
type: object type: object
kind: kind:
description: Kind defines the kind of the Service. description: Kind defines the kind of the Service.
@ -3199,7 +3163,7 @@ spec:
- type: integer - type: integer
- type: string - type: string
description: |- description: |-
Interval defines the frequency of the health check calls for healthy targets. Interval defines the frequency of the health check calls.
Default: 30s Default: 30s
x-kubernetes-int-or-string: true x-kubernetes-int-or-string: true
method: method:
@ -3235,15 +3199,6 @@ spec:
Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy. Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy.
Default: 5s Default: 5s
x-kubernetes-int-or-string: true x-kubernetes-int-or-string: true
unhealthyInterval:
anyOf:
- type: integer
- type: string
description: |-
UnhealthyInterval defines the frequency of the health check calls for unhealthy targets.
When UnhealthyInterval is not defined, it defaults to the Interval value.
Default: 30s
x-kubernetes-int-or-string: true
type: object type: object
kind: kind:
description: Kind defines the kind of the Service. description: Kind defines the kind of the Service.

View File

@ -306,7 +306,6 @@ type ServerHealthCheck struct {
Status int `json:"status,omitempty" toml:"status,omitempty" yaml:"status,omitempty" export:"true"` Status int `json:"status,omitempty" toml:"status,omitempty" yaml:"status,omitempty" export:"true"`
Port int `json:"port,omitempty" toml:"port,omitempty,omitzero" yaml:"port,omitempty" export:"true"` Port int `json:"port,omitempty" toml:"port,omitempty,omitzero" yaml:"port,omitempty" export:"true"`
Interval ptypes.Duration `json:"interval,omitempty" toml:"interval,omitempty" yaml:"interval,omitempty" export:"true"` Interval ptypes.Duration `json:"interval,omitempty" toml:"interval,omitempty" yaml:"interval,omitempty" export:"true"`
UnhealthyInterval *ptypes.Duration `json:"unhealthyInterval,omitempty" toml:"unhealthyInterval,omitempty" yaml:"unhealthyInterval,omitempty" export:"true"`
Timeout ptypes.Duration `json:"timeout,omitempty" toml:"timeout,omitempty" yaml:"timeout,omitempty" export:"true"` Timeout ptypes.Duration `json:"timeout,omitempty" toml:"timeout,omitempty" yaml:"timeout,omitempty" export:"true"`
Hostname string `json:"hostname,omitempty" toml:"hostname,omitempty" yaml:"hostname,omitempty"` Hostname string `json:"hostname,omitempty" toml:"hostname,omitempty" yaml:"hostname,omitempty"`
FollowRedirects *bool `json:"followRedirects,omitempty" toml:"followRedirects,omitempty" yaml:"followRedirects,omitempty" export:"true"` FollowRedirects *bool `json:"followRedirects,omitempty" toml:"followRedirects,omitempty" yaml:"followRedirects,omitempty" export:"true"`

View File

@ -1428,11 +1428,6 @@ func (in *Server) DeepCopy() *Server {
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ServerHealthCheck) DeepCopyInto(out *ServerHealthCheck) { func (in *ServerHealthCheck) DeepCopyInto(out *ServerHealthCheck) {
*out = *in *out = *in
if in.UnhealthyInterval != nil {
in, out := &in.UnhealthyInterval, &out.UnhealthyInterval
*out = new(paersertypes.Duration)
**out = **in
}
if in.FollowRedirects != nil { if in.FollowRedirects != nil {
in, out := &in.FollowRedirects, &out.FollowRedirects in, out := &in.FollowRedirects, &out.FollowRedirects
*out = new(bool) *out = new(bool)

View File

@ -162,7 +162,6 @@ func TestDecodeConfiguration(t *testing.T) {
"traefik.http.services.Service0.loadbalancer.healthcheck.headers.name1": "foobar", "traefik.http.services.Service0.loadbalancer.healthcheck.headers.name1": "foobar",
"traefik.http.services.Service0.loadbalancer.healthcheck.hostname": "foobar", "traefik.http.services.Service0.loadbalancer.healthcheck.hostname": "foobar",
"traefik.http.services.Service0.loadbalancer.healthcheck.interval": "1s", "traefik.http.services.Service0.loadbalancer.healthcheck.interval": "1s",
"traefik.http.services.Service0.loadbalancer.healthcheck.unhealthyinterval": "1s",
"traefik.http.services.Service0.loadbalancer.healthcheck.path": "foobar", "traefik.http.services.Service0.loadbalancer.healthcheck.path": "foobar",
"traefik.http.services.Service0.loadbalancer.healthcheck.method": "foobar", "traefik.http.services.Service0.loadbalancer.healthcheck.method": "foobar",
"traefik.http.services.Service0.loadbalancer.healthcheck.status": "401", "traefik.http.services.Service0.loadbalancer.healthcheck.status": "401",
@ -187,7 +186,6 @@ func TestDecodeConfiguration(t *testing.T) {
"traefik.http.services.Service1.loadbalancer.healthcheck.headers.name1": "foobar", "traefik.http.services.Service1.loadbalancer.healthcheck.headers.name1": "foobar",
"traefik.http.services.Service1.loadbalancer.healthcheck.hostname": "foobar", "traefik.http.services.Service1.loadbalancer.healthcheck.hostname": "foobar",
"traefik.http.services.Service1.loadbalancer.healthcheck.interval": "1s", "traefik.http.services.Service1.loadbalancer.healthcheck.interval": "1s",
"traefik.http.services.Service1.loadbalancer.healthcheck.unhealthyinterval": "1s",
"traefik.http.services.Service1.loadbalancer.healthcheck.path": "foobar", "traefik.http.services.Service1.loadbalancer.healthcheck.path": "foobar",
"traefik.http.services.Service1.loadbalancer.healthcheck.method": "foobar", "traefik.http.services.Service1.loadbalancer.healthcheck.method": "foobar",
"traefik.http.services.Service1.loadbalancer.healthcheck.status": "401", "traefik.http.services.Service1.loadbalancer.healthcheck.status": "401",
@ -710,7 +708,6 @@ func TestDecodeConfiguration(t *testing.T) {
Status: 401, Status: 401,
Port: 42, Port: 42,
Interval: ptypes.Duration(time.Second), Interval: ptypes.Duration(time.Second),
UnhealthyInterval: pointer(ptypes.Duration(time.Second)),
Timeout: ptypes.Duration(time.Second), Timeout: ptypes.Duration(time.Second),
Hostname: "foobar", Hostname: "foobar",
Headers: map[string]string{ Headers: map[string]string{
@ -745,7 +742,6 @@ func TestDecodeConfiguration(t *testing.T) {
Status: 401, Status: 401,
Port: 42, Port: 42,
Interval: ptypes.Duration(time.Second), Interval: ptypes.Duration(time.Second),
UnhealthyInterval: pointer(ptypes.Duration(time.Second)),
Timeout: ptypes.Duration(time.Second), Timeout: ptypes.Duration(time.Second),
Hostname: "foobar", Hostname: "foobar",
Headers: map[string]string{ Headers: map[string]string{
@ -1254,7 +1250,6 @@ func TestEncodeConfiguration(t *testing.T) {
Status: 401, Status: 401,
Port: 42, Port: 42,
Interval: ptypes.Duration(time.Second), Interval: ptypes.Duration(time.Second),
UnhealthyInterval: pointer(ptypes.Duration(time.Second)),
Timeout: ptypes.Duration(time.Second), Timeout: ptypes.Duration(time.Second),
Hostname: "foobar", Hostname: "foobar",
Headers: map[string]string{ Headers: map[string]string{
@ -1287,7 +1282,6 @@ func TestEncodeConfiguration(t *testing.T) {
Status: 401, Status: 401,
Port: 42, Port: 42,
Interval: ptypes.Duration(time.Second), Interval: ptypes.Duration(time.Second),
UnhealthyInterval: pointer(ptypes.Duration(time.Second)),
Timeout: ptypes.Duration(time.Second), Timeout: ptypes.Duration(time.Second),
Hostname: "foobar", Hostname: "foobar",
Headers: map[string]string{ Headers: map[string]string{
@ -1477,7 +1471,6 @@ func TestEncodeConfiguration(t *testing.T) {
"traefik.HTTP.Services.Service0.LoadBalancer.HealthCheck.Headers.name1": "foobar", "traefik.HTTP.Services.Service0.LoadBalancer.HealthCheck.Headers.name1": "foobar",
"traefik.HTTP.Services.Service0.LoadBalancer.HealthCheck.Hostname": "foobar", "traefik.HTTP.Services.Service0.LoadBalancer.HealthCheck.Hostname": "foobar",
"traefik.HTTP.Services.Service0.LoadBalancer.HealthCheck.Interval": "1000000000", "traefik.HTTP.Services.Service0.LoadBalancer.HealthCheck.Interval": "1000000000",
"traefik.HTTP.Services.Service0.LoadBalancer.HealthCheck.UnhealthyInterval": "1000000000",
"traefik.HTTP.Services.Service0.LoadBalancer.HealthCheck.Path": "foobar", "traefik.HTTP.Services.Service0.LoadBalancer.HealthCheck.Path": "foobar",
"traefik.HTTP.Services.Service0.LoadBalancer.HealthCheck.Method": "foobar", "traefik.HTTP.Services.Service0.LoadBalancer.HealthCheck.Method": "foobar",
"traefik.HTTP.Services.Service0.LoadBalancer.HealthCheck.Status": "401", "traefik.HTTP.Services.Service0.LoadBalancer.HealthCheck.Status": "401",
@ -1502,7 +1495,6 @@ func TestEncodeConfiguration(t *testing.T) {
"traefik.HTTP.Services.Service1.LoadBalancer.HealthCheck.Headers.name1": "foobar", "traefik.HTTP.Services.Service1.LoadBalancer.HealthCheck.Headers.name1": "foobar",
"traefik.HTTP.Services.Service1.LoadBalancer.HealthCheck.Hostname": "foobar", "traefik.HTTP.Services.Service1.LoadBalancer.HealthCheck.Hostname": "foobar",
"traefik.HTTP.Services.Service1.LoadBalancer.HealthCheck.Interval": "1000000000", "traefik.HTTP.Services.Service1.LoadBalancer.HealthCheck.Interval": "1000000000",
"traefik.HTTP.Services.Service1.LoadBalancer.HealthCheck.UnhealthyInterval": "1000000000",
"traefik.HTTP.Services.Service1.LoadBalancer.HealthCheck.Path": "foobar", "traefik.HTTP.Services.Service1.LoadBalancer.HealthCheck.Path": "foobar",
"traefik.HTTP.Services.Service1.LoadBalancer.HealthCheck.Method": "foobar", "traefik.HTTP.Services.Service1.LoadBalancer.HealthCheck.Method": "foobar",
"traefik.HTTP.Services.Service1.LoadBalancer.HealthCheck.Status": "401", "traefik.HTTP.Services.Service1.LoadBalancer.HealthCheck.Status": "401",

View File

@ -40,27 +40,18 @@ type metricsHealthCheck interface {
ServiceServerUpGauge() gokitmetrics.Gauge ServiceServerUpGauge() gokitmetrics.Gauge
} }
type target struct {
targetURL *url.URL
name string
}
type ServiceHealthChecker struct { type ServiceHealthChecker struct {
balancer StatusSetter balancer StatusSetter
info *runtime.ServiceInfo info *runtime.ServiceInfo
config *dynamic.ServerHealthCheck config *dynamic.ServerHealthCheck
interval time.Duration interval time.Duration
unhealthyInterval time.Duration
timeout time.Duration timeout time.Duration
metrics metricsHealthCheck metrics metricsHealthCheck
client *http.Client client *http.Client
targets map[string]*url.URL
healthyTargets chan target
unhealthyTargets chan target
serviceName string serviceName string
} }
@ -69,26 +60,13 @@ func NewServiceHealthChecker(ctx context.Context, metrics metricsHealthCheck, co
interval := time.Duration(config.Interval) interval := time.Duration(config.Interval)
if interval <= 0 { if interval <= 0 {
logger.Error().Msg("Health check interval smaller than zero, default value will be used instead.") logger.Error().Msg("Health check interval smaller than zero")
interval = time.Duration(dynamic.DefaultHealthCheckInterval) interval = time.Duration(dynamic.DefaultHealthCheckInterval)
} }
// If the unhealthyInterval option is not set, we use the interval option value,
// to check the unhealthy targets as often as the healthy ones.
var unhealthyInterval time.Duration
if config.UnhealthyInterval == nil {
unhealthyInterval = interval
} else {
unhealthyInterval = time.Duration(*config.UnhealthyInterval)
if unhealthyInterval <= 0 {
logger.Error().Msg("Health check unhealthy interval smaller than zero, default value will be used instead.")
unhealthyInterval = time.Duration(dynamic.DefaultHealthCheckInterval)
}
}
timeout := time.Duration(config.Timeout) timeout := time.Duration(config.Timeout)
if timeout <= 0 { if timeout <= 0 {
logger.Error().Msg("Health check timeout smaller than zero, default value will be used instead.") logger.Error().Msg("Health check timeout smaller than zero")
timeout = time.Duration(dynamic.DefaultHealthCheckTimeout) timeout = time.Duration(dynamic.DefaultHealthCheckTimeout)
} }
@ -102,24 +80,13 @@ func NewServiceHealthChecker(ctx context.Context, metrics metricsHealthCheck, co
} }
} }
healthyTargets := make(chan target, len(targets))
for name, targetURL := range targets {
healthyTargets <- target{
targetURL: targetURL,
name: name,
}
}
unhealthyTargets := make(chan target, len(targets))
return &ServiceHealthChecker{ return &ServiceHealthChecker{
balancer: service, balancer: service,
info: info, info: info,
config: config, config: config,
interval: interval, interval: interval,
unhealthyInterval: unhealthyInterval,
timeout: timeout, timeout: timeout,
healthyTargets: healthyTargets, targets: targets,
unhealthyTargets: unhealthyTargets,
serviceName: serviceName, serviceName: serviceName,
client: client, client: client,
metrics: metrics, metrics: metrics,
@ -127,13 +94,7 @@ func NewServiceHealthChecker(ctx context.Context, metrics metricsHealthCheck, co
} }
func (shc *ServiceHealthChecker) Launch(ctx context.Context) { func (shc *ServiceHealthChecker) Launch(ctx context.Context) {
go shc.healthcheck(ctx, shc.unhealthyTargets, shc.unhealthyInterval) ticker := time.NewTicker(shc.interval)
shc.healthcheck(ctx, shc.healthyTargets, shc.interval)
}
func (shc *ServiceHealthChecker) healthcheck(ctx context.Context, targets chan target, interval time.Duration) {
ticker := time.NewTicker(interval)
defer ticker.Stop() defer ticker.Stop()
for { for {
@ -142,23 +103,7 @@ func (shc *ServiceHealthChecker) healthcheck(ctx context.Context, targets chan t
return return
case <-ticker.C: case <-ticker.C:
// We collect the targets to check once for all, for proxyName, target := range shc.targets {
// to avoid rechecking a target that has been moved during the health check.
var targetsToCheck []target
hasMoreTargets := true
for hasMoreTargets {
select {
case <-ctx.Done():
return
case target := <-targets:
targetsToCheck = append(targetsToCheck, target)
default:
hasMoreTargets = false
}
}
// Now we can check the targets.
for _, target := range targetsToCheck {
select { select {
case <-ctx.Done(): case <-ctx.Done():
return return
@ -168,14 +113,14 @@ func (shc *ServiceHealthChecker) healthcheck(ctx context.Context, targets chan t
up := true up := true
serverUpMetricValue := float64(1) serverUpMetricValue := float64(1)
if err := shc.executeHealthCheck(ctx, shc.config, target.targetURL); err != nil { if err := shc.executeHealthCheck(ctx, shc.config, target); err != nil {
// The context is canceled when the dynamic configuration is refreshed. // The context is canceled when the dynamic configuration is refreshed.
if errors.Is(err, context.Canceled) { if errors.Is(err, context.Canceled) {
return return
} }
log.Ctx(ctx).Warn(). log.Ctx(ctx).Warn().
Str("targetURL", target.targetURL.String()). Str("targetURL", target.String()).
Err(err). Err(err).
Msg("Health check failed.") Msg("Health check failed.")
@ -183,21 +128,17 @@ func (shc *ServiceHealthChecker) healthcheck(ctx context.Context, targets chan t
serverUpMetricValue = float64(0) serverUpMetricValue = float64(0)
} }
shc.balancer.SetStatus(ctx, target.name, up) shc.balancer.SetStatus(ctx, proxyName, up)
var statusStr string statusStr := runtime.StatusDown
if up { if up {
statusStr = runtime.StatusUp statusStr = runtime.StatusUp
shc.healthyTargets <- target
} else {
statusStr = runtime.StatusDown
shc.unhealthyTargets <- target
} }
shc.info.UpdateServerStatus(target.targetURL.String(), statusStr) shc.info.UpdateServerStatus(target.String(), statusStr)
shc.metrics.ServiceServerUpGauge(). shc.metrics.ServiceServerUpGauge().
With("service", shc.serviceName, "url", target.targetURL.String()). With("service", shc.serviceName, "url", target.String()).
Set(serverUpMetricValue) Set(serverUpMetricValue)
} }
} }

View File

@ -423,7 +423,6 @@ func TestServiceHealthChecker_Launch(t *testing.T) {
Status: test.status, Status: test.status,
Path: "/path", Path: "/path",
Interval: ptypes.Duration(500 * time.Millisecond), Interval: ptypes.Duration(500 * time.Millisecond),
UnhealthyInterval: pointer(ptypes.Duration(500 * time.Millisecond)),
Timeout: ptypes.Duration(499 * time.Millisecond), Timeout: ptypes.Duration(499 * time.Millisecond),
} }
@ -457,54 +456,3 @@ func TestServiceHealthChecker_Launch(t *testing.T) {
}) })
} }
} }
func TestDifferentIntervals(t *testing.T) {
// The context is passed to the health check and
// canonically canceled by the test server once all expected requests have been received.
ctx, cancel := context.WithCancel(context.Background())
t.Cleanup(cancel)
healthyServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
w.WriteHeader(http.StatusOK)
}))
healthyURL := testhelpers.MustParseURL(healthyServer.URL)
unhealthyServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
w.WriteHeader(http.StatusServiceUnavailable)
}))
unhealthyURL := testhelpers.MustParseURL(unhealthyServer.URL)
lb := &testLoadBalancer{RWMutex: &sync.RWMutex{}}
config := &dynamic.ServerHealthCheck{
Mode: "http",
Path: "/path",
Interval: ptypes.Duration(500 * time.Millisecond),
UnhealthyInterval: pointer(ptypes.Duration(50 * time.Millisecond)),
Timeout: ptypes.Duration(499 * time.Millisecond),
}
gauge := &testhelpers.CollectingGauge{}
serviceInfo := &runtime.ServiceInfo{}
hc := NewServiceHealthChecker(ctx, &MetricsMock{gauge}, config, lb, serviceInfo, http.DefaultTransport, map[string]*url.URL{"healthy": healthyURL, "unhealthy": unhealthyURL}, "foobar")
wg := sync.WaitGroup{}
wg.Add(1)
go func() {
hc.Launch(ctx)
wg.Done()
}()
select {
case <-time.After(2 * time.Second):
break
case <-ctx.Done():
wg.Wait()
}
lb.Lock()
defer lb.Unlock()
assert.Greater(t, lb.numRemovedServers, lb.numUpsertedServers, "removed servers greater than upserted servers")
}

View File

@ -212,9 +212,11 @@ func (h *Handler) ServeHTTP(rw http.ResponseWriter, req *http.Request, next http
if span := trace.SpanFromContext(req.Context()); span != nil { if span := trace.SpanFromContext(req.Context()); span != nil {
spanContext := span.SpanContext() spanContext := span.SpanContext()
if spanContext.HasTraceID() && spanContext.HasSpanID() {
logDataTable.Core[TraceID] = spanContext.TraceID().String() logDataTable.Core[TraceID] = spanContext.TraceID().String()
logDataTable.Core[SpanID] = spanContext.SpanID().String() logDataTable.Core[SpanID] = spanContext.SpanID().String()
} }
}
reqWithDataTable := req.WithContext(context.WithValue(req.Context(), DataTableKey, logDataTable)) reqWithDataTable := req.WithContext(context.WithValue(req.Context(), DataTableKey, logDataTable))

View File

@ -27,8 +27,10 @@ import (
"github.com/traefik/traefik/v3/pkg/middlewares/capture" "github.com/traefik/traefik/v3/pkg/middlewares/capture"
"github.com/traefik/traefik/v3/pkg/types" "github.com/traefik/traefik/v3/pkg/types"
"go.opentelemetry.io/collector/pdata/plog/plogotlp" "go.opentelemetry.io/collector/pdata/plog/plogotlp"
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/codes"
"go.opentelemetry.io/otel/trace" "go.opentelemetry.io/otel/trace"
"go.opentelemetry.io/otel/trace/noop" "go.opentelemetry.io/otel/trace/embedded"
) )
const delta float64 = 1e-10 const delta float64 = 1e-10
@ -310,7 +312,7 @@ func TestLoggerHeaderFields(t *testing.T) {
func TestLoggerCLF(t *testing.T) { func TestLoggerCLF(t *testing.T) {
logFilePath := filepath.Join(t.TempDir(), logFileNameSuffix) logFilePath := filepath.Join(t.TempDir(), logFileNameSuffix)
config := &types.AccessLog{FilePath: logFilePath, Format: CommonFormat} config := &types.AccessLog{FilePath: logFilePath, Format: CommonFormat}
doLogging(t, config) doLogging(t, config, false)
logData, err := os.ReadFile(logFilePath) logData, err := os.ReadFile(logFilePath)
require.NoError(t, err) require.NoError(t, err)
@ -322,7 +324,7 @@ func TestLoggerCLF(t *testing.T) {
func TestLoggerCLFWithBufferingSize(t *testing.T) { func TestLoggerCLFWithBufferingSize(t *testing.T) {
logFilePath := filepath.Join(t.TempDir(), logFileNameSuffix) logFilePath := filepath.Join(t.TempDir(), logFileNameSuffix)
config := &types.AccessLog{FilePath: logFilePath, Format: CommonFormat, BufferingSize: 1024} config := &types.AccessLog{FilePath: logFilePath, Format: CommonFormat, BufferingSize: 1024}
doLogging(t, config) doLogging(t, config, false)
// wait a bit for the buffer to be written in the file. // wait a bit for the buffer to be written in the file.
time.Sleep(50 * time.Millisecond) time.Sleep(50 * time.Millisecond)
@ -371,10 +373,11 @@ func TestLoggerJSON(t *testing.T) {
desc string desc string
config *types.AccessLog config *types.AccessLog
tls bool tls bool
tracing bool
expected map[string]func(t *testing.T, value interface{}) expected map[string]func(t *testing.T, value interface{})
}{ }{
{ {
desc: "default config", desc: "default config without tracing",
config: &types.AccessLog{ config: &types.AccessLog{
FilePath: "", FilePath: "",
Format: JSONFormat, Format: JSONFormat,
@ -410,8 +413,48 @@ func TestLoggerJSON(t *testing.T) {
"time": assertNotEmpty(), "time": assertNotEmpty(),
"StartLocal": assertNotEmpty(), "StartLocal": assertNotEmpty(),
"StartUTC": assertNotEmpty(), "StartUTC": assertNotEmpty(),
TraceID: assertNotEmpty(), },
SpanID: assertNotEmpty(), },
{
desc: "default config with tracing",
config: &types.AccessLog{
FilePath: "",
Format: JSONFormat,
},
tracing: true,
expected: map[string]func(t *testing.T, value interface{}){
RequestContentSize: assertFloat64(0),
RequestHost: assertString(testHostname),
RequestAddr: assertString(testHostname),
RequestMethod: assertString(testMethod),
RequestPath: assertString(testPath),
RequestProtocol: assertString(testProto),
RequestScheme: assertString(testScheme),
RequestPort: assertString("-"),
DownstreamStatus: assertFloat64(float64(testStatus)),
DownstreamContentSize: assertFloat64(float64(len(testContent))),
OriginContentSize: assertFloat64(float64(len(testContent))),
OriginStatus: assertFloat64(float64(testStatus)),
RequestRefererHeader: assertString(testReferer),
RequestUserAgentHeader: assertString(testUserAgent),
RouterName: assertString(testRouterName),
ServiceURL: assertString(testServiceName),
ClientUsername: assertString(testUsername),
ClientHost: assertString(testHostname),
ClientPort: assertString(strconv.Itoa(testPort)),
ClientAddr: assertString(fmt.Sprintf("%s:%d", testHostname, testPort)),
"level": assertString("info"),
"msg": assertString(""),
"downstream_Content-Type": assertString("text/plain; charset=utf-8"),
RequestCount: assertFloat64NotZero(),
Duration: assertFloat64NotZero(),
Overhead: assertFloat64NotZero(),
RetryAttempts: assertFloat64(float64(testRetryAttempts)),
"time": assertNotEmpty(),
"StartLocal": assertNotEmpty(),
"StartUTC": assertNotEmpty(),
TraceID: assertString("01000000000000000000000000000000"),
SpanID: assertString("0100000000000000"),
}, },
}, },
{ {
@ -455,8 +498,6 @@ func TestLoggerJSON(t *testing.T) {
"time": assertNotEmpty(), "time": assertNotEmpty(),
StartLocal: assertNotEmpty(), StartLocal: assertNotEmpty(),
StartUTC: assertNotEmpty(), StartUTC: assertNotEmpty(),
TraceID: assertNotEmpty(),
SpanID: assertNotEmpty(),
}, },
}, },
{ {
@ -578,9 +619,9 @@ func TestLoggerJSON(t *testing.T) {
test.config.FilePath = logFilePath test.config.FilePath = logFilePath
if test.tls { if test.tls {
doLoggingTLS(t, test.config) doLoggingTLS(t, test.config, test.tracing)
} else { } else {
doLogging(t, test.config) doLogging(t, test.config, test.tracing)
} }
logData, err := os.ReadFile(logFilePath) logData, err := os.ReadFile(logFilePath)
@ -632,8 +673,6 @@ func TestLogger_AbortedRequest(t *testing.T) {
"downstream_Content-Type": assertString("text/plain"), "downstream_Content-Type": assertString("text/plain"),
"downstream_Transfer-Encoding": assertString("chunked"), "downstream_Transfer-Encoding": assertString("chunked"),
"downstream_Cache-Control": assertString("no-cache"), "downstream_Cache-Control": assertString("no-cache"),
TraceID: assertNotEmpty(),
SpanID: assertNotEmpty(),
} }
config := &types.AccessLog{ config := &types.AccessLog{
@ -854,7 +893,7 @@ func TestNewLogHandlerOutputStdout(t *testing.T) {
file, restoreStdout := captureStdout(t) file, restoreStdout := captureStdout(t)
defer restoreStdout() defer restoreStdout()
doLogging(t, test.config) doLogging(t, test.config, false)
written, err := os.ReadFile(file.Name()) written, err := os.ReadFile(file.Name())
require.NoError(t, err, "unable to read captured stdout from file") require.NoError(t, err, "unable to read captured stdout from file")
@ -913,7 +952,7 @@ func captureStdout(t *testing.T) (out *os.File, restoreStdout func()) {
return file, restoreStdout return file, restoreStdout
} }
func doLoggingTLSOpt(t *testing.T, config *types.AccessLog, enableTLS bool) { func doLoggingTLSOpt(t *testing.T, config *types.AccessLog, enableTLS, tracing bool) {
t.Helper() t.Helper()
logger, err := NewHandler(config) logger, err := NewHandler(config)
require.NoError(t, err) require.NoError(t, err)
@ -952,9 +991,10 @@ func doLoggingTLSOpt(t *testing.T, config *types.AccessLog, enableTLS bool) {
} }
} }
tracer := noop.Tracer{} if tracing {
spanCtx, _ := tracer.Start(req.Context(), "test") contextWithSpan := trace.ContextWithSpan(req.Context(), &mockSpan{})
req = req.WithContext(spanCtx) req = req.WithContext(contextWithSpan)
}
chain := alice.New() chain := alice.New()
chain = chain.Append(capture.Wrap) chain = chain.Append(capture.Wrap)
@ -965,16 +1005,16 @@ func doLoggingTLSOpt(t *testing.T, config *types.AccessLog, enableTLS bool) {
handler.ServeHTTP(httptest.NewRecorder(), req) handler.ServeHTTP(httptest.NewRecorder(), req)
} }
func doLoggingTLS(t *testing.T, config *types.AccessLog) { func doLoggingTLS(t *testing.T, config *types.AccessLog, tracing bool) {
t.Helper() t.Helper()
doLoggingTLSOpt(t, config, true) doLoggingTLSOpt(t, config, true, tracing)
} }
func doLogging(t *testing.T, config *types.AccessLog) { func doLogging(t *testing.T, config *types.AccessLog, tracing bool) {
t.Helper() t.Helper()
doLoggingTLSOpt(t, config, false) doLoggingTLSOpt(t, config, false, tracing)
} }
func logWriterTestHandlerFunc(rw http.ResponseWriter, r *http.Request) { func logWriterTestHandlerFunc(rw http.ResponseWriter, r *http.Request) {
@ -1091,3 +1131,27 @@ func streamBackend(rw http.ResponseWriter, r *http.Request) {
} }
} }
} }
// mockSpan is an implementation of Span that preforms no operations.
type mockSpan struct {
embedded.Span
}
var _ trace.Span = &mockSpan{}
func (*mockSpan) SpanContext() trace.SpanContext {
return trace.NewSpanContext(trace.SpanContextConfig{TraceID: trace.TraceID{1}, SpanID: trace.SpanID{1}})
}
func (*mockSpan) IsRecording() bool { return true }
func (s *mockSpan) SetStatus(_ codes.Code, _ string) {}
func (s *mockSpan) SetAttributes(...attribute.KeyValue) {}
func (s *mockSpan) End(...trace.SpanEndOption) {}
func (s *mockSpan) RecordError(_ error, _ ...trace.EventOption) {}
func (s *mockSpan) AddEvent(_ string, _ ...trace.EventOption) {}
func (s *mockSpan) AddLink(_ trace.Link) {}
func (s *mockSpan) SetName(_ string) {}
func (s *mockSpan) TracerProvider() trace.TracerProvider {
return nil
}

View File

@ -60,7 +60,7 @@ func NewBuilder(client *Client, plugins map[string]Descriptor, localPlugins map[
pb.middlewareBuilders[pName] = middleware pb.middlewareBuilders[pName] = middleware
case typeProvider: case typeProvider:
pBuilder, err := newProviderBuilder(logCtx, manifest, client.GoPath(), desc.Settings) pBuilder, err := newProviderBuilder(logCtx, manifest, client.GoPath())
if err != nil { if err != nil {
return nil, fmt.Errorf("%s: %w", desc.ModuleName, err) return nil, fmt.Errorf("%s: %w", desc.ModuleName, err)
} }
@ -95,7 +95,7 @@ func NewBuilder(client *Client, plugins map[string]Descriptor, localPlugins map[
pb.middlewareBuilders[pName] = middleware pb.middlewareBuilders[pName] = middleware
case typeProvider: case typeProvider:
builder, err := newProviderBuilder(logCtx, manifest, localGoPath, desc.Settings) builder, err := newProviderBuilder(logCtx, manifest, localGoPath)
if err != nil { if err != nil {
return nil, fmt.Errorf("%s: %w", desc.ModuleName, err) return nil, fmt.Errorf("%s: %w", desc.ModuleName, err)
} }
@ -139,7 +139,7 @@ func newMiddlewareBuilder(ctx context.Context, goPath string, manifest *Manifest
return newWasmMiddlewareBuilder(goPath, moduleName, wasmPath, settings) return newWasmMiddlewareBuilder(goPath, moduleName, wasmPath, settings)
case runtimeYaegi, "": case runtimeYaegi, "":
i, err := newInterpreter(ctx, goPath, manifest, settings) i, err := newInterpreter(ctx, goPath, manifest.Import)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to create Yaegi interpreter: %w", err) return nil, fmt.Errorf("failed to create Yaegi interpreter: %w", err)
} }
@ -151,10 +151,10 @@ func newMiddlewareBuilder(ctx context.Context, goPath string, manifest *Manifest
} }
} }
func newProviderBuilder(ctx context.Context, manifest *Manifest, goPath string, settings Settings) (providerBuilder, error) { func newProviderBuilder(ctx context.Context, manifest *Manifest, goPath string) (providerBuilder, error) {
switch manifest.Runtime { switch manifest.Runtime {
case runtimeYaegi, "": case runtimeYaegi, "":
i, err := newInterpreter(ctx, goPath, manifest, settings) i, err := newInterpreter(ctx, goPath, manifest.Import)
if err != nil { if err != nil {
return providerBuilder{}, err return providerBuilder{}, err
} }

View File

@ -2,7 +2,6 @@ package plugins
import ( import (
"context" "context"
"errors"
"fmt" "fmt"
"net/http" "net/http"
"os" "os"
@ -16,7 +15,6 @@ import (
"github.com/traefik/traefik/v3/pkg/logs" "github.com/traefik/traefik/v3/pkg/logs"
"github.com/traefik/yaegi/interp" "github.com/traefik/yaegi/interp"
"github.com/traefik/yaegi/stdlib" "github.com/traefik/yaegi/stdlib"
"github.com/traefik/yaegi/stdlib/unsafe"
) )
type yaegiMiddlewareBuilder struct { type yaegiMiddlewareBuilder struct {
@ -121,7 +119,7 @@ func (m *YaegiMiddleware) NewHandler(ctx context.Context, next http.Handler) (ht
return m.builder.newHandler(ctx, next, m.config, m.middlewareName) return m.builder.newHandler(ctx, next, m.config, m.middlewareName)
} }
func newInterpreter(ctx context.Context, goPath string, manifest *Manifest, settings Settings) (*interp.Interpreter, error) { func newInterpreter(ctx context.Context, goPath string, manifestImport string) (*interp.Interpreter, error) {
i := interp.New(interp.Options{ i := interp.New(interp.Options{
GoPath: goPath, GoPath: goPath,
Env: os.Environ(), Env: os.Environ(),
@ -134,25 +132,14 @@ func newInterpreter(ctx context.Context, goPath string, manifest *Manifest, sett
return nil, fmt.Errorf("failed to load symbols: %w", err) return nil, fmt.Errorf("failed to load symbols: %w", err)
} }
if manifest.UseUnsafe && !settings.UseUnsafe {
return nil, errors.New("this plugin uses unsafe import. If you want to use it, you need to allow useUnsafe in the settings")
}
if settings.UseUnsafe && manifest.UseUnsafe {
err := i.Use(unsafe.Symbols)
if err != nil {
return nil, fmt.Errorf("failed to load unsafe symbols: %w", err)
}
}
err = i.Use(ppSymbols()) err = i.Use(ppSymbols())
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to load provider symbols: %w", err) return nil, fmt.Errorf("failed to load provider symbols: %w", err)
} }
_, err = i.Eval(fmt.Sprintf(`import "%s"`, manifest.Import)) _, err = i.Eval(fmt.Sprintf(`import "%s"`, manifestImport))
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to import plugin code %q: %w", manifest.Import, err) return nil, fmt.Errorf("failed to import plugin code %q: %w", manifestImport, err)
} }
return i, nil return i, nil

View File

@ -13,7 +13,6 @@ const (
type Settings struct { type Settings struct {
Envs []string `description:"Environment variables to forward to the wasm guest." json:"envs,omitempty" toml:"envs,omitempty" yaml:"envs,omitempty"` Envs []string `description:"Environment variables to forward to the wasm guest." json:"envs,omitempty" toml:"envs,omitempty" yaml:"envs,omitempty"`
Mounts []string `description:"Directory to mount to the wasm guest." json:"mounts,omitempty" toml:"mounts,omitempty" yaml:"mounts,omitempty"` Mounts []string `description:"Directory to mount to the wasm guest." json:"mounts,omitempty" toml:"mounts,omitempty" yaml:"mounts,omitempty"`
UseUnsafe bool `description:"Allow the plugin to use unsafe package." json:"useUnsafe,omitempty" toml:"useUnsafe,omitempty" yaml:"useUnsafe,omitempty"`
} }
// Descriptor The static part of a plugin configuration. // Descriptor The static part of a plugin configuration.
@ -47,7 +46,6 @@ type Manifest struct {
BasePkg string `yaml:"basePkg"` BasePkg string `yaml:"basePkg"`
Compatibility string `yaml:"compatibility"` Compatibility string `yaml:"compatibility"`
Summary string `yaml:"summary"` Summary string `yaml:"summary"`
UseUnsafe bool `yaml:"useUnsafe"`
TestData map[string]interface{} `yaml:"testData"` TestData map[string]interface{} `yaml:"testData"`
} }

View File

@ -20,7 +20,6 @@ import (
"github.com/go-acme/lego/v4/certificate" "github.com/go-acme/lego/v4/certificate"
"github.com/go-acme/lego/v4/challenge" "github.com/go-acme/lego/v4/challenge"
"github.com/go-acme/lego/v4/challenge/dns01" "github.com/go-acme/lego/v4/challenge/dns01"
"github.com/go-acme/lego/v4/challenge/http01"
"github.com/go-acme/lego/v4/lego" "github.com/go-acme/lego/v4/lego"
"github.com/go-acme/lego/v4/providers/dns" "github.com/go-acme/lego/v4/providers/dns"
"github.com/go-acme/lego/v4/registration" "github.com/go-acme/lego/v4/registration"
@ -50,9 +49,6 @@ type Configuration struct {
EAB *EAB `description:"External Account Binding to use." json:"eab,omitempty" toml:"eab,omitempty" yaml:"eab,omitempty"` EAB *EAB `description:"External Account Binding to use." json:"eab,omitempty" toml:"eab,omitempty" yaml:"eab,omitempty"`
CertificatesDuration int `description:"Certificates' duration in hours." json:"certificatesDuration,omitempty" toml:"certificatesDuration,omitempty" yaml:"certificatesDuration,omitempty" export:"true"` CertificatesDuration int `description:"Certificates' duration in hours." json:"certificatesDuration,omitempty" toml:"certificatesDuration,omitempty" yaml:"certificatesDuration,omitempty" export:"true"`
ClientTimeout ptypes.Duration `description:"Timeout for a complete HTTP transaction with the ACME server." json:"clientTimeout,omitempty" toml:"clientTimeout,omitempty" yaml:"clientTimeout,omitempty" label:"allowEmpty" file:"allowEmpty" export:"true"`
ClientResponseHeaderTimeout ptypes.Duration `description:"Timeout for receiving the response headers when communicating with the ACME server." json:"clientResponseHeaderTimeout,omitempty" toml:"clientResponseHeaderTimeout,omitempty" yaml:"clientResponseHeaderTimeout,omitempty" label:"allowEmpty" file:"allowEmpty" export:"true"`
CACertificates []string `description:"Specify the paths to PEM encoded CA Certificates that can be used to authenticate an ACME server with an HTTPS certificate not issued by a CA in the system-wide trusted root list." json:"caCertificates,omitempty" toml:"caCertificates,omitempty" yaml:"caCertificates,omitempty"` CACertificates []string `description:"Specify the paths to PEM encoded CA Certificates that can be used to authenticate an ACME server with an HTTPS certificate not issued by a CA in the system-wide trusted root list." json:"caCertificates,omitempty" toml:"caCertificates,omitempty" yaml:"caCertificates,omitempty"`
CASystemCertPool bool `description:"Define if the certificates pool must use a copy of the system cert pool." json:"caSystemCertPool,omitempty" toml:"caSystemCertPool,omitempty" yaml:"caSystemCertPool,omitempty" export:"true"` CASystemCertPool bool `description:"Define if the certificates pool must use a copy of the system cert pool." json:"caSystemCertPool,omitempty" toml:"caSystemCertPool,omitempty" yaml:"caSystemCertPool,omitempty" export:"true"`
CAServerName string `description:"Specify the CA server name that can be used to authenticate an ACME server with an HTTPS certificate not issued by a CA in the system-wide trusted root list." json:"caServerName,omitempty" toml:"caServerName,omitempty" yaml:"caServerName,omitempty" export:"true"` CAServerName string `description:"Specify the CA server name that can be used to authenticate an ACME server with an HTTPS certificate not issued by a CA in the system-wide trusted root list." json:"caServerName,omitempty" toml:"caServerName,omitempty" yaml:"caServerName,omitempty" export:"true"`
@ -68,8 +64,6 @@ func (a *Configuration) SetDefaults() {
a.Storage = "acme.json" a.Storage = "acme.json"
a.KeyType = "RSA4096" a.KeyType = "RSA4096"
a.CertificatesDuration = 3 * 30 * 24 // 90 Days a.CertificatesDuration = 3 * 30 * 24 // 90 Days
a.ClientTimeout = ptypes.Duration(2 * time.Minute)
a.ClientResponseHeaderTimeout = ptypes.Duration(30 * time.Second)
} }
// CertAndStore allows mapping a TLS certificate to a TLS store. // CertAndStore allows mapping a TLS certificate to a TLS store.
@ -113,7 +107,6 @@ type Propagation struct {
// HTTPChallenge contains HTTP challenge configuration. // HTTPChallenge contains HTTP challenge configuration.
type HTTPChallenge struct { type HTTPChallenge struct {
EntryPoint string `description:"HTTP challenge EntryPoint" json:"entryPoint,omitempty" toml:"entryPoint,omitempty" yaml:"entryPoint,omitempty" export:"true"` EntryPoint string `description:"HTTP challenge EntryPoint" json:"entryPoint,omitempty" toml:"entryPoint,omitempty" yaml:"entryPoint,omitempty" export:"true"`
Delay ptypes.Duration `description:"Delay between the creation of the challenge and the validation." json:"delay,omitempty" toml:"delay,omitempty" yaml:"delay,omitempty" export:"true"`
} }
// TLSChallenge contains TLS challenge configuration. // TLSChallenge contains TLS challenge configuration.
@ -169,10 +162,6 @@ func (p *Provider) Init() error {
return errors.New("cannot manage certificates with duration lower than 1 hour") return errors.New("cannot manage certificates with duration lower than 1 hour")
} }
if p.ClientTimeout < p.ClientResponseHeaderTimeout {
return errors.New("clientTimeout must be at least clientResponseHeaderTimeout")
}
var err error var err error
p.account, err = p.Store.GetAccount(p.ResolverName) p.account, err = p.Store.GetAccount(p.ResolverName)
if err != nil { if err != nil {
@ -362,7 +351,7 @@ func (p *Provider) getClient() (*lego.Client, error) {
if p.HTTPChallenge != nil && len(p.HTTPChallenge.EntryPoint) > 0 { if p.HTTPChallenge != nil && len(p.HTTPChallenge.EntryPoint) > 0 {
logger.Debug().Msg("Using HTTP Challenge provider.") logger.Debug().Msg("Using HTTP Challenge provider.")
err = client.Challenge.SetHTTP01Provider(p.HTTPChallengeProvider, http01.SetDelay(time.Duration(p.HTTPChallenge.Delay))) err = client.Challenge.SetHTTP01Provider(p.HTTPChallengeProvider)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -388,7 +377,7 @@ func (p *Provider) createHTTPClient() (*http.Client, error) {
} }
return &http.Client{ return &http.Client{
Timeout: time.Duration(p.ClientTimeout), Timeout: 2 * time.Minute,
Transport: &http.Transport{ Transport: &http.Transport{
Proxy: http.ProxyFromEnvironment, Proxy: http.ProxyFromEnvironment,
DialContext: (&net.Dialer{ DialContext: (&net.Dialer{
@ -396,7 +385,7 @@ func (p *Provider) createHTTPClient() (*http.Client, error) {
KeepAlive: 30 * time.Second, KeepAlive: 30 * time.Second,
}).DialContext, }).DialContext,
TLSHandshakeTimeout: 30 * time.Second, TLSHandshakeTimeout: 30 * time.Second,
ResponseHeaderTimeout: time.Duration(p.ClientResponseHeaderTimeout), ResponseHeaderTimeout: 30 * time.Second,
TLSClientConfig: tlsConfig, TLSClientConfig: tlsConfig,
}, },
}, nil }, nil

View File

@ -9,7 +9,6 @@ import (
"strings" "strings"
"github.com/rs/zerolog/log" "github.com/rs/zerolog/log"
ptypes "github.com/traefik/paerser/types"
"github.com/traefik/traefik/v3/pkg/config/dynamic" "github.com/traefik/traefik/v3/pkg/config/dynamic"
"github.com/traefik/traefik/v3/pkg/logs" "github.com/traefik/traefik/v3/pkg/logs"
"github.com/traefik/traefik/v3/pkg/provider" "github.com/traefik/traefik/v3/pkg/provider"
@ -374,17 +373,6 @@ func (c configBuilder) buildServersLB(namespace string, svc traefikv1alpha1.Load
return nil, err return nil, err
} }
} }
// If the UnhealthyInterval option is not set, we use the Interval option value,
// to check the unhealthy targets as often as the healthy ones.
if svc.HealthCheck.UnhealthyInterval == nil {
lb.HealthCheck.UnhealthyInterval = &lb.HealthCheck.Interval
} else {
var unhealthyInterval ptypes.Duration
if err := unhealthyInterval.Set(svc.HealthCheck.UnhealthyInterval.String()); err != nil {
return nil, err
}
lb.HealthCheck.UnhealthyInterval = &unhealthyInterval
}
if svc.HealthCheck.Timeout != nil { if svc.HealthCheck.Timeout != nil {
if err := lb.HealthCheck.Timeout.Set(svc.HealthCheck.Timeout.String()); err != nil { if err := lb.HealthCheck.Timeout.Set(svc.HealthCheck.Timeout.String()); err != nil {
return nil, err return nil, err

View File

@ -2650,7 +2650,6 @@ func TestLoadIngressRoutes(t *testing.T) {
Path: "/health", Path: "/health",
Timeout: 5000000000, Timeout: 5000000000,
Interval: 15000000000, Interval: 15000000000,
UnhealthyInterval: pointer(ptypes.Duration(15000000000)),
FollowRedirects: pointer(true), FollowRedirects: pointer(true),
}, },
}, },
@ -2716,7 +2715,6 @@ func TestLoadIngressRoutes(t *testing.T) {
Path: "/health1", Path: "/health1",
Timeout: 5000000000, Timeout: 5000000000,
Interval: 15000000000, Interval: 15000000000,
UnhealthyInterval: pointer(ptypes.Duration(15000000000)),
FollowRedirects: pointer(true), FollowRedirects: pointer(true),
}, },
}, },
@ -2737,7 +2735,6 @@ func TestLoadIngressRoutes(t *testing.T) {
Path: "/health2", Path: "/health2",
Timeout: 5000000000, Timeout: 5000000000,
Interval: 20000000000, Interval: 20000000000,
UnhealthyInterval: pointer(ptypes.Duration(20000000000)),
FollowRedirects: pointer(true), FollowRedirects: pointer(true),
}, },
}, },
@ -2782,7 +2779,6 @@ func TestLoadIngressRoutes(t *testing.T) {
Path: "/health1", Path: "/health1",
Timeout: 5000000000, Timeout: 5000000000,
Interval: 15000000000, Interval: 15000000000,
UnhealthyInterval: pointer(ptypes.Duration(15000000000)),
FollowRedirects: pointer(true), FollowRedirects: pointer(true),
}, },
}, },

View File

@ -170,13 +170,9 @@ type ServerHealthCheck struct {
Status int `json:"status,omitempty"` Status int `json:"status,omitempty"`
// Port defines the server URL port for the health check endpoint. // Port defines the server URL port for the health check endpoint.
Port int `json:"port,omitempty"` Port int `json:"port,omitempty"`
// Interval defines the frequency of the health check calls for healthy targets. // Interval defines the frequency of the health check calls.
// Default: 30s // Default: 30s
Interval *intstr.IntOrString `json:"interval,omitempty"` Interval *intstr.IntOrString `json:"interval,omitempty"`
// UnhealthyInterval defines the frequency of the health check calls for unhealthy targets.
// When UnhealthyInterval is not defined, it defaults to the Interval value.
// Default: 30s
UnhealthyInterval *intstr.IntOrString `json:"unhealthyInterval,omitempty"`
// Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy. // Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy.
// Default: 5s // Default: 5s
Timeout *intstr.IntOrString `json:"timeout,omitempty"` Timeout *intstr.IntOrString `json:"timeout,omitempty"`

View File

@ -1280,11 +1280,6 @@ func (in *ServerHealthCheck) DeepCopyInto(out *ServerHealthCheck) {
*out = new(intstr.IntOrString) *out = new(intstr.IntOrString)
**out = **in **out = **in
} }
if in.UnhealthyInterval != nil {
in, out := &in.UnhealthyInterval, &out.UnhealthyInterval
*out = new(intstr.IntOrString)
**out = **in
}
if in.Timeout != nil { if in.Timeout != nil {
in, out := &in.Timeout, &out.Timeout in, out := &in.Timeout, &out.Timeout
*out = new(intstr.IntOrString) *out = new(intstr.IntOrString)

View File

@ -45,7 +45,6 @@ func Test_buildConfiguration(t *testing.T) {
"traefik/http/services/Service01/loadBalancer/healthCheck/path": "foobar", "traefik/http/services/Service01/loadBalancer/healthCheck/path": "foobar",
"traefik/http/services/Service01/loadBalancer/healthCheck/port": "42", "traefik/http/services/Service01/loadBalancer/healthCheck/port": "42",
"traefik/http/services/Service01/loadBalancer/healthCheck/interval": "1s", "traefik/http/services/Service01/loadBalancer/healthCheck/interval": "1s",
"traefik/http/services/Service01/loadBalancer/healthCheck/unhealthyinterval": "1s",
"traefik/http/services/Service01/loadBalancer/healthCheck/timeout": "1s", "traefik/http/services/Service01/loadBalancer/healthCheck/timeout": "1s",
"traefik/http/services/Service01/loadBalancer/healthCheck/hostname": "foobar", "traefik/http/services/Service01/loadBalancer/healthCheck/hostname": "foobar",
"traefik/http/services/Service01/loadBalancer/healthCheck/headers/name0": "foobar", "traefik/http/services/Service01/loadBalancer/healthCheck/headers/name0": "foobar",
@ -671,7 +670,6 @@ func Test_buildConfiguration(t *testing.T) {
Path: "foobar", Path: "foobar",
Port: 42, Port: 42,
Interval: ptypes.Duration(time.Second), Interval: ptypes.Duration(time.Second),
UnhealthyInterval: pointer(ptypes.Duration(time.Second)),
Timeout: ptypes.Duration(time.Second), Timeout: ptypes.Duration(time.Second),
Hostname: "foobar", Hostname: "foobar",
FollowRedirects: pointer(true), FollowRedirects: pointer(true),

View File

@ -4,11 +4,11 @@ RepositoryName = "traefik"
OutputType = "file" OutputType = "file"
FileName = "traefik_changelog.md" FileName = "traefik_changelog.md"
# example new bugfix v3.3.6 # example new bugfix v3.3.7
CurrentRef = "v3.3" CurrentRef = "v3.3"
PreviousRef = "v3.3.5" PreviousRef = "v3.3.6"
BaseBranch = "v3.3" BaseBranch = "v3.3"
FutureCurrentRefName = "v3.3.6" FutureCurrentRefName = "v3.3.7"
ThresholdPreviousRef = 10 ThresholdPreviousRef = 10
ThresholdCurrentRef = 10 ThresholdCurrentRef = 10

View File

@ -4,11 +4,11 @@ RepositoryName = "traefik"
OutputType = "file" OutputType = "file"
FileName = "traefik_changelog.md" FileName = "traefik_changelog.md"
# example final release of v3.3.0 # example final release of v3.4.0
CurrentRef = "v3.3" CurrentRef = "v3.4"
PreviousRef = "v3.3.0-rc1" PreviousRef = "v3.4.0-rc1"
BaseBranch = "v3.3" BaseBranch = "v3.4"
FutureCurrentRefName = "v3.3.0" FutureCurrentRefName = "v3.4.0"
ThresholdPreviousRef = 10 ThresholdPreviousRef = 10
ThresholdCurrentRef = 10 ThresholdCurrentRef = 10

View File

@ -4,11 +4,11 @@ RepositoryName = "traefik"
OutputType = "file" OutputType = "file"
FileName = "traefik_changelog.md" FileName = "traefik_changelog.md"
# example final release of v3.3.0 # example final release of v3.4.0
CurrentRef = "v3.3.0-rc1" CurrentRef = "v3.4.0-rc1"
PreviousRef = "v3.2.0-rc1" PreviousRef = "v3.3.0-rc1"
BaseBranch = "master" BaseBranch = "master"
FutureCurrentRefName = "v3.3.0" FutureCurrentRefName = "v3.4.0"
ThresholdPreviousRef = 10 ThresholdPreviousRef = 10
ThresholdCurrentRef = 10 ThresholdCurrentRef = 10

View File

@ -8,7 +8,7 @@
:thumb-style="appThumbStyle" :thumb-style="appThumbStyle"
style="height:100%;" style="height:100%;"
> >
<q-card-section v-if="data.scheme || data.interval || data.unhealthyInterval"> <q-card-section v-if="data.scheme || data.interval">
<div class="row items-start no-wrap"> <div class="row items-start no-wrap">
<div <div
v-if="data.scheme" v-if="data.scheme"
@ -38,20 +38,6 @@
{{ data.interval }} {{ data.interval }}
</q-chip> </q-chip>
</div> </div>
<div
v-if="data.unhealthyInterval"
class="col"
>
<div class="text-subtitle2">
UNHEALTHY INTERVAL
</div>
<q-chip
dense
class="app-chip app-chip-interval"
>
{{ data.unhealthyInterval }}
</q-chip>
</div>
</div> </div>
</q-card-section> </q-card-section>
<q-card-section v-if="data.path || data.timeout"> <q-card-section v-if="data.path || data.timeout">