Aller au contenu principal

Exposer un service avec Traefik

Ce guide explique comment exposer un service Kubernetes via une route de reverse proxy avec Traefik, en utilisant une ressource IngressRoute, et comment ajouter des protections optionnelles comme le filtrage IP.

Étapes

Définir le service Kubernetes

Voici un exemple de service Kubernetes que nous souhaitons exposer :

apiVersion: v1
kind: Service
metadata:
name: my-site
namespace: my-namespace
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
type: ClusterIP
selector:
app: my-app
remarque

Ce service est accessible uniquement à l’intérieur du cluster.

Créer une ressource IngressRoute Traefik

Pour exposer ce service via le FQDN suivant my-site.my-cluster.kumba.adista.fr, nous créons une ressource IngressRoute.

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: my-site-ingressroute
namespace: kumba
spec:
entryPoints:
- websecure
routes:
- match: Host(`my-site.my-cluster.kumba.adista.fr`) && PathPrefix(`/`)
kind: Rule
services:
- name: my-site
namespace: my-namespace
port: 80
tls:
secretName: kumba-wildcard-certificate-secret
domains:
- main: "my-cluster.kumba.adista.fr"
sans:
- "*.my-cluster.kumba.adista.fr"

Cette ressource déclare l’interception du FQDN et redirige les requêtes vers le port 80 du service nommé my-site dans le namespace my-namespace.

Le certificat utilisé est contenu dans le secret kumba-wildcard-certificate-secret, négocié automatiquement par Cert-Manager. Il s’agit d’un certificat wildcard couvrant tout le sous-domaine *.my-cluster.kumba.adista.fr.

Protéger l’accès avec un filtrage (optionnel)

Vous pouvez restreindre l’accès à certaines adresses IP avec une ressource Middleware.

apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
name: ipwhitelist
namespace: my-namespace
spec:
ipWhiteList:
sourceRange:
- 0.0.0.0/0 # autorise toutes les IP

Puis, vous l’ajoutez à la ressource IngressRoute, au niveau de la route que vous souhaitez filtrer.

...
routes:
- match: Host(`my-site.my-cluster.kumba.adista.fr`) && PathPrefix(`/`)
kind: Rule
middlewares:
- name: ipwhitelist
namespace: my-namespace
services:
...

Vous pouvez également limiter l’accès aux utilisateurs présents dans la liste des utilisateurs kumba de votre cluster.

...
routes:
- match: Host(`my-site.my-cluster.kumba.adista.fr`) && PathPrefix(`/`)
kind: Rule
middlewares:
# The traefik-forward-auth resource already exists in a Kumba cluster
- name: traefik-forward-auth
namespace: kumba
services:
...