Service
Service
is the implementation of a Traefik HTTP service.
There is no dedicated CRD, a Service
is part of:
Note that, before creating IngressRoute
or TraefikService
objects, you need to apply the Traefik Kubernetes CRDs to your Kubernetes cluster.
This registers the Traefik-specific resources.
Configuration Example¶
You can declare a Service
either as part of an IngressRoute
or a TraefikService
as detailed below:
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: test-name
namespace: apps
spec:
entryPoints:
- web
routes:
- kind: Rule
# Rule on the Host
match: Host(`test.example.com`)
services:
# Target a Kubernetes Service
- kind: Service
name: foo
namespace: apps
# Customize the connection between Traefik and the backend
passHostHeader: true
port: 80
responseForwarding:
flushInterval: 1ms
scheme: https
sticky:
cookie:
httpOnly: true
name: cookie
secure: true
strategy: RoundRobin
apiVersion: traefik.io/v1alpha1
kind: TraefikService
metadata:
name: wrr1
namespace: apps
spec:
weighted:
services:
# Target a Kubernetes Service
- kind: Service
name: foo
namespace: apps
# Customize the connection between Traefik and the backend
passHostHeader: true
port: 80
responseForwarding:
flushInterval: 1ms
scheme: https
sticky:
cookie:
httpOnly: true
name: cookie
secure: true
strategy: RoundRobin
Configuration Options¶
Field | Description | Default | Required |
---|---|---|---|
kind |
Kind of the service targeted. Two values allowed: - Service: Kubernetes Service TraefikService: Traefik Service. More information here. |
"Service" | No |
name |
Service name. The character @ is not authorized. More information here. |
Yes | |
namespace |
Service namespace. Can be empty if the service belongs to the same namespace as the IngressRoute. More information here. |
No | |
port |
Service port (number or port name). Evaluated only if the kind is Service. |
No | |
responseForwarding. flushInterval |
Interval, in milliseconds, in between flushes to the client while copying the response body. A negative value means to flush immediately after each write to the client. This configuration is ignored when a response is a streaming response; for such responses, writes are flushed to the client immediately. Evaluated only if the kind is Service. |
100ms | No |
scheme |
Scheme to use for the request to the upstream Kubernetes Service. Evaluated only if the kind is Service. |
"http" "https" if port is 443 or contains the string https. |
No |
serversTransport |
Name of ServersTransport resource to use to configure the transport between Traefik and your servers. Evaluated only if the kind is Service. |
"" | No |
passHostHeader |
Forward client Host header to server. Evaluated only if the kind is Service. |
true | No |
healthCheck.scheme |
Server URL scheme for the health check endpoint. Evaluated only if the kind is Service. Only for Kubernetes service of type ExternalName. |
"" | No |
healthCheck.mode |
Health check mode. If defined to grpc, will use the gRPC health check protocol to probe the server. Evaluated only if the kind is Service. Only for Kubernetes service of type ExternalName. |
"http" | No |
healthCheck.path |
Server URL path for the health check endpoint. Evaluated only if the kind is Service. Only for Kubernetes service of type ExternalName. |
"" | No |
healthCheck.interval |
Frequency of the health check calls for healthy targets. Evaluated only if the kind is Service. Only for Kubernetes service of type ExternalName. |
"100ms" | No |
healthCheck.unhealthyInterval |
Frequency of the health check calls for unhealthy targets. When not defined, it defaults to the interval value.Evaluated only if the kind is Service. Only for Kubernetes service of type ExternalName. |
"100ms" | No |
healthCheck.method |
HTTP method for the health check endpoint. Evaluated only if the kind is Service. Only for Kubernetes service of type ExternalName. |
"GET" | No |
healthCheck.status |
Expected HTTP status code of the response to the health check request. Only for Kubernetes service of type ExternalName. If not set, expect a status between 200 and 399. Evaluated only if the kind is Service. |
No | |
healthCheck.port |
URL port for the health check endpoint. Evaluated only if the kind is Service. Only for Kubernetes service of type ExternalName. |
No | |
healthCheck.timeout |
Maximum duration to wait before considering the server unhealthy. Evaluated only if the kind is Service. Only for Kubernetes service of type ExternalName. |
"5s" | No |
healthCheck.hostname |
Value in the Host header of the health check request. Evaluated only if the kind is Service. Only for Kubernetes service of type ExternalName. |
"" | No |
healthCheck. followRedirect |
Follow the redirections during the healtchcheck. Evaluated only if the kind is Service. Only for Kubernetes service of type ExternalName. |
true | No |
healthCheck.headers |
Map of header to send to the health check endpoint Evaluated only if the kind is Service. Only for Kubernetes service of type ExternalName). |
No | |
sticky. cookie.name |
Name of the cookie used for the stickiness. When sticky sessions are enabled, a Set-Cookie header is set on the initial response to let the client know which server handles the first response.On subsequent requests, to keep the session alive with the same server, the client should send the cookie with the value set. If the server pecified in the cookie becomes unhealthy, the request will be forwarded to a new server (and the cookie will keep track of the new server). Evaluated only if the kind is Service. |
"" | No |
sticky. cookie.httpOnly |
Allow the cookie can be accessed by client-side APIs, such as JavaScript. Evaluated only if the kind is Service. |
false | No |
sticky. cookie.secure |
Allow the cookie can only be transmitted over an encrypted connection (i.e. HTTPS). Evaluated only if the kind is Service. |
false | No |
sticky. cookie.sameSite |
SameSite policy Allowed values: - none - lax strict Evaluated only if the kind is Service. |
"" | No |
sticky. cookie.maxAge |
Number of seconds until the cookie expires. Negative number, the cookie expires immediately. 0, the cookie never expires. Evaluated only if the kind is Service. |
0 | No |
strategy |
Load balancing strategy between the servers. RoundRobin is the only supported value yet. Evaluated only if the kind is Service. |
"RoundRobin" | No |
nativeLB |
Allow using the Kubernetes Service load balancing between the pods instead of the one provided by Traefik. Evaluated only if the kind is Service. |
false | No |
nodePortLB |
Use the nodePort IP address when the service type is NodePort. It allows services to be reachable when Traefik runs externally from the Kubernetes cluster but within the same network of the nodes. Evaluated only if the kind is Service. |
false | No |
ExternalName Service¶
Traefik backends creation needs a port to be set, however Kubernetes ExternalName Service could be defined without any port. Accordingly, Traefik supports defining a port in two ways:
- only on
IngressRoute
service - on both sides, you'll be warned if the ports don't match, and the
IngressRoute
service port is used
Thus, in case of two sides port definition, Traefik expects a match between ports.
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: test.route
namespace: apps
spec:
entryPoints:
- foo
routes:
- match: Host(`example.net`)
kind: Rule
services:
- name: external-svc
port: 80
apiVersion: v1
kind: Service
metadata:
name: external-svc
namespace: apps
spec:
externalName: external.domain
type: ExternalName
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: test.route
namespace: apps
spec:
entryPoints:
- foo
routes:
- match: Host(`example.net`)
kind: Rule
services:
- name: external-svc
apiVersion: v1
kind: Service
metadata:
name: external-svc
namespace: apps
spec:
externalName: external.domain
type: ExternalName
ports:
- port: 80
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: test.route
namespace: apps
spec:
entryPoints:
- foo
routes:
- match: Host(`example.net`)
kind: Rule
services:
- name: external-svc
port: 80
apiVersion: v1
kind: Service
metadata:
name: external-svc
namespace: apps
spec:
externalName: external.domain
type: ExternalName
ports:
- port: 80
Port Definition¶
Traefik backends creation needs a port to be set, however Kubernetes ExternalName Service could be defined without any port. Accordingly, Traefik supports defining a port in two ways:
- only on
IngressRoute
service - on both sides, you'll be warned if the ports don't match, and the
IngressRoute
service port is used
Thus, in case of two sides port definition, Traefik expects a match between ports.
Example
---
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: test.route
namespace: default
spec:
entryPoints:
- foo
routes:
- match: Host(`example.net`)
kind: Rule
services:
- name: external-svc
port: 80
---
apiVersion: v1
kind: Service
metadata:
name: external-svc
namespace: default
spec:
externalName: external.domain
type: ExternalName
---
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: test.route
namespace: default
spec:
entryPoints:
- foo
routes:
- match: Host(`example.net`)
kind: Rule
services:
- name: external-svc
---
apiVersion: v1
kind: Service
metadata:
name: external-svc
namespace: default
spec:
externalName: external.domain
type: ExternalName
ports:
- port: 80
---
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: test.route
namespace: default
spec:
entryPoints:
- foo
routes:
- match: Host(`example.net`)
kind: Rule
services:
- name: external-svc
port: 80
---
apiVersion: v1
kind: Service
metadata:
name: external-svc
namespace: default
spec:
externalName: external.domain
type: ExternalName
ports:
- port: 80
Load Balancing¶
You can declare and use Kubernetes Service load balancing as detailed below:
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: ingressroutebar
namespace: default
spec:
entryPoints:
- web
routes:
- match: Host(`example.com`) && PathPrefix(`/foo`)
kind: Rule
services:
- name: svc1
namespace: default
- name: svc2
namespace: default
apiVersion: v1
kind: Service
metadata:
name: svc1
namespace: default
spec:
ports:
- name: http
port: 80
selector:
app: traefiklabs
task: app1
---
apiVersion: v1
kind: Service
metadata:
name: svc2
namespace: default
spec:
ports:
- name: http
port: 80
selector:
app: traefiklabs
task: app2
Kubernetes Service Native Load-Balancing
To avoid creating the server load-balancer with the pod IPs and use Kubernetes Service clusterIP directly,
one should set the service NativeLB
option to true.
Please note that, by default, Traefik reuses the established connections to the backends for performance purposes. This can prevent the requests load balancing between the replicas from behaving as one would expect when the option is set.
By default, NativeLB
is false.
Example
---
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: test.route
namespace: default
spec:
entryPoints:
- foo
routes:
- match: Host(`example.net`)
kind: Rule
services:
- name: svc
port: 80
# Here, nativeLB instructs to build the server load-balancer with the Kubernetes Service clusterIP only.
nativeLB: true
---
apiVersion: v1
kind: Service
metadata:
name: svc
namespace: default
spec:
type: ClusterIP
...
Configuring Backend Protocol¶
There are 3 ways to configure the backend protocol for communication between Traefik and your pods:
- Setting the scheme explicitly (http/https/h2c)
- Configuring the name of the kubernetes service port to start with https (https)
- Setting the kubernetes service port to use port 443 (https)
If you do not configure the above, Traefik will assume an http connection.