Traefik

Qu’est-ce que Traefik ?

Traefik est un reverse proxy et un load balancer moderne qui prend en charge les services de conteneurs.

Il est conçu pour fonctionner avec des conteneurs Docker, mais il peut également être utilisé avec des conteneurs non-Docker.

Traefik est un logiciel open source qui fournit un moyen simple et efficace de configurer un serveur proxy inverse pour les applications conteneurisées.

Configuration Traefik

Nous avons décidé d’utiliser helm pour déployer Traefik sur notre cluster Kubernetes et non avec la methodologie gitops car dans ce cas concret, nous avions besoin de plus de flexibilité pour la configuration de Traefik.

Installation de Traefik

helm repo add traefik https://helm.traefik.io/traefik
helm repo update
helm install traefik traefik/traefik --namespace traefik

Une fois cela fait, il est possible de verifier l’installation de Traefik en utilisant la commande suivante:

kubectl get pods -n traefik

Voici ce que cela devrait donner:

traefik on  helm-version [?] 
 k get pod -n traefik 
NAME                       READY   STATUS    RESTARTS   AGE
traefik-7d9b646484-vwhkk   1/1     Running   0          24h

Il est aussi possible de regarder si le repo helm s’est correctement déployé.

helm status 

Voici ce que cela devrait donner:

traefik on  helm-version [?] 
 helm status traefik -n traefik 
NAME: traefik
LAST DEPLOYED: Tue Jun 18 10:38:58 2024
NAMESPACE: traefik
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Traefik Proxy v3.0.2 has been deployed successfully on traefik namespace !

🚨 When enabling persistence for certificates, permissions on acme.json can be
lost when Traefik restarts. You can ensure correct permissions with an
initContainer. See https://github.com/traefik/traefik-helm-chart/blob/master/EXAMPLES.md#
use-traefik-native-lets-encrypt-integration-without-cert-manager
for more info. 🚨

Configuration de Traefik

Pour configurer Traefik, il faut override le fichier values.yaml de Traefik. Voici notre fichier traefik-values.yaml:

additionalArguments:
# Pour configurer le certificatesresolvers
# 
# DNS Challenge
# ---

  - --certificatesresolvers.ovh.acme.dnschallenge.provider=ovh
  - --certificatesresolvers.ovh.acme.email=matthieu.daniel.thomas.2@gmail.com
  - --certificatesresolvers.ovh.acme.dnschallenge.resolvers=213.251.188.146,213.251.128.146
  - --certificatesresolvers.ovh.acme.storage=/ssl-certs/acme-ovh.json

## Enable debug log for loki
logs:
  general:
    level: DEBUG


## expose entrypoints
ports:
  web:
    redirectTo:
       port: websecure
  websecure:
    tls:
      enabled: true
      certResolver: ovh


env:
# 
# DNS Challenge 
# ---
## Authentification OVH
- name: OVH_ENDPOINT
  valueFrom:
    secretKeyRef:
      key: OVH_ENDPOINT
      name: ovh-credentials
- name: OVH_APPLICATION_KEY
  valueFrom:
    secretKeyRef:
      key: OVH_APPLICATION_KEY
      name: ovh-credentials
- name: OVH_APPLICATION_SECRET
  valueFrom:
    secretKeyRef:
      key: OVH_APPLICATION_SECRET
      name: ovh-credentials
- name: OVH_CONSUMER_KEY
  valueFrom:
    secretKeyRef:
      key: OVH_CONSUMER_KEY
      name: ovh-credentials

## Ingress custom pour le dashboard
ingressRoute:
  dashboard:
    enabled: true

# Stocakge des ACME
persistence:
  enabled: true
  name: ssl-certs
  size: 1Gi
  path: /ssl-certs
  storageClass: local-path
## Patch traefik pour les permissions
deployment:
  initContainers:
    # issue: https://github.com/containous/traefik/issues/6972
    - name: volume-permissions
      image: busybox:1.36.1
      command: ["sh", "-c", "touch /ssl-certs/acme.json && chmod 
      -v 600 /ssl-certs/acme.json"]
      volumeMounts:
        - name: ssl-certs
          mountPath: /ssl-certs

# Mettre traefik en ingress controller par défaut
ingressClass:
  enabled: true
  isDefaultClass: true

Ensuite elle doit être configurée pour faire un challenge à OVH afin de valider le certificat SSL. Pour cela nous devons configurer des secrets dans le namespace traefik.

Exemple du fichier de secrets :

apiVersion: v1
kind: Secret
metadata:
  name: ovh-credentials
  namespace: traefik
type: Opaque
stringData:
  OVH_ENDPOINT: ovh-eu
  OVH_APPLICATION_KEY: ********
  OVH_APPLICATION_SECRET: 4***************
  OVH_CONSUMER_KEY: ae3**************
  OVH_CLIENT_ID: ef******
  OVH_CLIENT_SECRET: da*******

Voici un exemple de certificat :

demonstration ssl