Déployer une application sur Kubernetes avec Traefik v2

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.

ArchiKube

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.

DigitalOcean

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

Do01

Do02

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

Do03

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 

Do04

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.

Do05

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

Do06

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é.

Do07

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.

Do08

Do09

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