Traefik & Kubernetes
Configuring Kubernetes Gateway provider and Deploying/Exposing Services
Gateway API
Whoami Service
---
kind: Deployment
apiVersion: apps/v1
metadata:
name: whoami
spec:
replicas: 2
selector:
matchLabels:
app: whoami
template:
metadata:
labels:
app: whoami
spec:
containers:
- name: whoami
image: traefik/whoami
---
apiVersion: v1
kind: Service
metadata:
name: whoami
spec:
ports:
- protocol: TCP
port: 80
selector:
app: whoami
Traefik Service
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: traefik-controller
---
kind: Deployment
apiVersion: apps/v1
metadata:
name: traefik
spec:
replicas: 1
selector:
matchLabels:
app: traefik-lb
template:
metadata:
labels:
app: traefik-lb
spec:
serviceAccountName: traefik-controller
containers:
- name: traefik
image: traefik/traefik:latest
imagePullPolicy: IfNotPresent
args:
- --entrypoints.web.address=:80
- --entrypoints.websecure.address=:443
- --experimental.kubernetesgateway
- --providers.kubernetesgateway
ports:
- name: web
containerPort: 80
- name: websecure
containerPort: 443
---
apiVersion: v1
kind: Service
metadata:
name: traefik
spec:
selector:
app: traefik-lb
ports:
port: 80
targetPort: web
name: web
- protocol: TCP
port: 443
targetPort: websecure
name: websecure
type: LoadBalancer
RBAC
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: gateway-role
rules:
- apiGroups:
- ""
resources:
- services
- endpoints
- secrets
verbs:
- get
- list
- watch
- apiGroups:
- networking.x-k8s.io
resources:
- gatewayclasses
- gateways
- httproutes
- tcproutes
verbs:
- get
- list
- watch
- apiGroups:
- networking.x-k8s.io
resources:
- gatewayclasses/status
- gateways/status
- httproutes/status
- tcproutes/status
- tlsroutes/status
verbs:
- update
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: gateway-controller
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: gateway-role
subjects:
- kind: ServiceAccount
name: traefik-controller
namespace: default
Routing Configuration
- You can find an exhaustive list, of the custom resources and their attributes in or in the Kubernetes Sigs
Gateway API
repository. - Validate that are fulfilled before using the Traefik Kubernetes Gateway Provider.
You can find an excerpt of the supported Kubernetes Gateway API resources in the table below:
Kind: GatewayClass
GatewayClass
is cluster-scoped resource defined by the infrastructure provider. This resource represents a class of Gateways that can be instantiated. More details on the GatewayClass .
The GatewayClass
should be declared by the infrastructure provider, otherwise please register the GatewayClass
definition in the Kubernetes cluster before creating GatewayClass
objects.
A Gateway
is 1:1 with the life cycle of the configuration of infrastructure. When a user creates a Gateway, some load balancing infrastructure is provisioned or configured by the GatewayClass controller. More details on the Gateway .
Register the Gateway
definition in the Kubernetes cluster before creating Gateway
objects.
Depending on the Listener Protocol, different modes and Route types are supported.
Listener Protocol | TLS Mode | Route Type Supported |
---|---|---|
TCP | Not applicable | |
TLS | Passthrough | TLSRoute |
TLS | Terminate | |
HTTP | Not applicable | HTTPRoute |
HTTPS | Terminate |
Declaring Gateway
HTTP Listener
kind: Gateway
apiVersion: networking.x-k8s.io/v1alpha1
metadata:
name: my-http-gateway
namespace: default
spec:
gatewayClassName: my-gateway-class # [1]
listeners: # [2]
- protocol: HTTP # [3]
port: 80 # [4]
routes: # [8]
kind: HTTPRoute # [9]
selector: # [10]
matchLabels: # [11]
app: foo
HTTPS Listener
kind: Gateway
apiVersion: networking.x-k8s.io/v1alpha1
metadata:
name: my-https-gateway
namespace: default
spec:
gatewayClassName: my-gateway-class # [1]
listeners: # [2]
- protocol: HTTPS # [3]
tls: # [6]
certificateRef: # [7]
group: "core"
kind: "Secret"
name: "mysecret"
routes: # [8]
kind: HTTPRoute # [9]
selector: # [10]
matchLabels: # [11]
app: foo
TCP Listener
kind: Gateway
apiVersion: networking.x-k8s.io/v1alpha1
metadata:
name: my-tcp-gateway
namespace: default
spec:
gatewayClassName: my-gateway-class # [1]
listeners: # [2]
- protocol: TCP # [3]
port: 8000 # [4]
routes: # [8]
kind: TCPRoute # [9]
selector: # [10]
matchLabels: # [11]
app: footcp
TLS Listener
Kind: HTTPRoute
Register the HTTPRoute
in the Kubernetes cluster before creating HTTPRoute
objects.
Declaring HTTPRoute
kind: HTTPRoute
apiVersion: networking.x-k8s.io/v1alpha1
metadata:
name: http-app-1
namespace: default
labels: # [1]
app: foo
spec:
hostnames: # [2]
- "whoami"
- matches: # [4]
- path: # [5]
type: Exact # [6]
value: /bar # [7]
- headers: # [8]
type: Exact # [9]
values: # [10]
foo: bar
forwardTo: # [11]
- serviceName: whoami # [12]
weight: 1 # [13]
port: 80 # [14]
- backendRef: # [15]
group: traefik.containo.us # [16]
kind: TraefikService # [17]
name: api@internal # [18]
port: 80
weight: 1
Ref | Attribute | Description |
---|---|---|
[1] | labels | Labels to match with the Gateway labelselector. |
[2] | hostnames | A set of hostname that should match against the HTTP Host header to select a HTTPRoute to process the request. |
[3] | rules | A list of HTTP matchers, filters and actions. |
[4] | matches | Conditions used for matching the rule against incoming HTTP requests. Each match is independent, i.e. this rule will be matched if any one of the matches is satisfied. |
[5] | path | An HTTP request path matcher. If this field is not specified, a default prefix match on the “/“ path is provided. |
[6] | type | Type of match against the path Value (supported types: Exact , Prefix ). |
[7] | value | The value of the HTTP path to match against. |
[8] | headers | Conditions to select a HTTP route by matching HTTP request headers. |
[9] | type | Type of match for the HTTP request header match against the values (supported types: Exact ). |
[10] | values | A map of HTTP Headers to be matched. It MUST contain at least one entry. |
[11] | forwardTo | The upstream target(s) where the request should be sent. |
[12] | serviceName | The name of the referent service. |
[13] | weight | The proportion of traffic forwarded to a targetRef, computed as weight/(sum of all weights in targetRefs). |
[14] | port | The port of the referent service. |
[15] | backendRef | The BackendRef is a reference to a backend (API object within a known namespace) to forward matched requests to. If both BackendRef and ServiceName are specified, ServiceName will be given precedence. Only TraefikService is supported. |
[16] | group | Group is the group of the referent. Only traefik.containo.us value is supported. |
[17] | kind | Kind is kind of the referent. Only TraefikService value is supported. |
[18] | name | Name is the name of the referent. |
TCPRoute
allows mapping TCP requests from a Gateway
to Kubernetes Services
Register the TCPRoute
definition in the Kubernetes cluster before creating TCPRoute
objects.
Declaring TCPRoute
kind: TCPRoute
apiVersion: networking.x-k8s.io/v1alpha1
metadata:
name: tcp-app-1
namespace: default
labels: # [1]
app: tcp-app-1
spec:
rules: # [2]
- forwardTo: # [3]
- serviceName: whoamitcp # [4]
weight: 1 # [5]
port: 8080 # [6]
- backendRef: # [7]
group: traefik.containo.us # [8]
kind: TraefikService # [9]
name: api@internal # [10]
Kind: TLSRoute
TLSRoute
allows mapping TLS requests from a Gateway
to Kubernetes Services
Register the TLSRoute
definition in the Kubernetes cluster before creating TLSRoute
objects.
Declaring TCPRoute
kind: TLSRoute
apiVersion: networking.x-k8s.io/v1alpha1
metadata:
name: tls-app-1
namespace: default
labels: # [1]
app: tls-app-1
spec:
rules: # [2]
- forwardTo: # [3]
- serviceName: whoamitcp # [4]
weight: 1 # [5]
port: 8080 # [6]
- backendRef: # [7]
group: traefik.containo.us # [8]
kind: TraefikService # [9]
Ref | Attribute | Description |
---|---|---|
[1] | labels | Labels to match with the Gateway labelselector. |
[2] | rules | Rules are a list of TCP matchers and actions. |
[3] | forwardTo | The upstream target(s) where the request should be sent. |
[4] | serviceName | The name of the referent service. |
[5] | weight | The proportion of traffic forwarded to a targetRef, computed as weight/(sum of all weights in targetRefs). |
[6] | port | The port of the referent service. |
[7] | backendRef | The BackendRef is a reference to a backend (API object within a known namespace) to forward matched requests to. If both BackendRef and ServiceName are specified, ServiceName will be given precedence. Only TraefikService is supported. |
[8] | group | Group is the group of the referent. Only traefik.containo.us value is supported. |
[9] | kind | Kind is kind of the referent. Only TraefikService value is supported. |
[10] | Name is the name of the referent. |