Déployer une application sur Kubernetes avec Traefik v2
Il est fort problable que en 2021 vous n’ayez pas vu passer Kubernetes, ne serais-ce que simplement par Linkedin. Pour résumer rapidement, Kubernetes est un orchestrateur de containers qui va vous permettre de déployer votre application en haute disponibilité (avec ou sans auto scaling) et bien sûr de façon autonome.
Pour schematiser, un cluster Kubernetes va se reposer généralement sur des services cloud pour le storage et le load balancer. Ce qui va nous permettre d’avoir des infrastructures résilientes et déployables très rapidement.
Le but de cet article est de vous montrer la puissance de kubernetes et comment déployer votre application rapidement, et bien sûr avec quelques morceaux de SSL par le biais de traefik.

Par choix personnel et pour cette démonstration, j’utilise le cloud provider DigitalOcean.
Vous pourrez via ce lien, obtenir 100$ de crédit gratuits.

Pré-requis :
doctl (https://github.com/digitalocean/doctl)
kubectl (https://kubernetes.io/fr/docs/tasks/tools/install-kubectl/)
helm (https://helm.sh/docs/intro/install/)
Commençons par déployer notre cluster Kubernetes


Choisissez l’emplacement, le sizing des instances et le nom à votre convenance.
Une fois déployé, il faudra télécharger télécharger la configuration de votre cluster au sein de votre système pour pouvoir intéragir avec lui.
J’utilise “doctl”, qui est très pratique pour rapidement mettre en place la configuration.
~ # doctl kubernetes cluster kubeconfig save k8s-nyc3-lfje-01

Pour vérifier si tout est correct, vous pouvez vérifier l’état de vos pods (normalement vide sur le namespace par default).
~ # kubectl get pods

Qu’est-ce que traefik?
traefik est communement ce qu’on appelle un “reverse-proxy”. Il prend les requêtes entrantes, analyse la domaine de se provenance, puis, redirige le traffic au bon service.

Installation de Traefik
Maintenant que notre cluster kubernetes est disponible nous allons mettre en place traefik sur notre cluster Kubernetes.
Par la même occasion, nous allons procéder à la mise en place du dispositif de check Letsencrypt par DNS.
Cela nous demande également de générer une API Key depuis votre compte Digitalocean.
Mais également que votre nom de domaine soit sur les serveurs de noms Digitalocean.
Pas d’inquiétude, il existe une multitude d’intégration possible! Liste liste est disponible via ce lien.
Il vous faudra donc juste à mettre en concordance la configuration avec les variables necessaires.
Installation du repository
~ # helm repo add traefik https://containous.github.io/traefik-helm-chart
Création du secret API
Kubernetes possède un système de gestion de variables d’environments, appelé “secrets”. Celle-ci peuvent être de type opaque, ce qui permet de ne pas apparaitre directement en clair lors d’un listing.
~ # kubectl create secret generic digitalocean --from-literal=do_auth_token=DO_API_KEY
Remplacez DO_API_KEY, par votre api key obtenu dans votre compte digitalocean
Créons maintenant la configuration pour traefik, editez dans un fichier (traefik-values.yaml)
additionalArguments:
- "--certificatesresolvers.letsencrypt.acme.email=VOTRE_EMAIL"
- "--certificatesresolvers.letsencrypt.acme.storage=/data/acme.json"
- "--certificatesresolvers.letsencrypt.acme.caserver=https://acme-v02.api.letsencrypt.org/directory"
- "--certificatesResolvers.letsencrypt.acme.dnschallenge=true"
- "--certificatesResolvers.letsencrypt.acme.dnschallenge.provider=digitalocean"
- "--api.insecure=true"
- "--accesslog=true"
- "--log.level=INFO"
- "--entrypoints.web.http.redirections.entrypoint.to=:443"
- "--entrypoints.web.http.redirections.entrypoint.permanent=true"
env:
- name: DO_AUTH_TOKEN
valueFrom:
secretKeyRef:
name: digitalocean
key: do_auth_token
Il ne nous reste plus qu’à installer Traeffik sur notre cluster avec notre fichier de paramètres.
~ # helm install traefik traefik/traefik -f traefik-values.yaml
Vous devriez observer un nouveau pod

Installation de notre application
Créons un fichier “app.yaml”, avec pour contenu notre application:
apiVersion: v1
kind: Service
metadata:
name: app
spec:
ports:
- port: 80
targetPort: 5678
selector:
app: app
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: app
spec:
selector:
matchLabels:
app: app
replicas: 2
template:
metadata:
labels:
app: app
spec:
containers:
- name: app
image: hashicorp/http-echo
args:
- "-text=Hello YGZ"
ports:
- containerPort: 80
Maintenant déployons notre application.
~ # kubectl apply -f app.yaml
Si vous vérifiez vos pods, vous devrier apercevoir qu’il est bien déployé.

Notez que vous apercevez deux pods, car notre replica a été défini sur 2
Déploiement de l’ingress controller
Un ingress controller est donc ce qui va permettre à traeffik de faire la correspondance entre votre domain et l’application.
C’est également ce qui va nous permettre de définir si nous souhaitons du https ou non.
Créez un nouveau fichier app-ingress.yaml
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: app-ingress
spec:
entryPoints:
- websecure
routes:
- match: Host(`demo.ff.ht`)
kind: Rule
services:
- name: app
port: 80
tls:
certResolver: letsencrypt
Vous remarquerez que nous avons défini l’entrypoint sur “websecure”, pour obtenir un point de montage en https, et également le certResolver avec letsencrypt.
Déployez votre ingress.
~ # kubectl apply -f app-ingress.yaml
N’oubliez pas d’ajouter un enregistrement A vers l’IP du LoadBalancer créé par Traefik un peu plus tôt vers le nom de domaine que vous souhaitez.
demo.ff.ht dans notre exemple.
Il ne vous reste plus qu’à tester votre URL et apercevoir que votre certificat fonctionne bien et que nous avons bien accès à notre application.


Cependant il se peut que vous ayez quelques minutes à patienter avant la génération du certificat.
Merci d’avoir suivi cet article, n’hésitez pas à me contacter via les réseaux sociaux ou par courriel si vous avez des questions à f(at)ff.ht
