Effectivement la version présente nativement est encore la 1.7. Ce n'est pas réellement un soucis mais tout de même, cette version commence à dater et nous utilisons depuis un petit moment maintenant des configurations en version 2. Autant être à jour !

Nous allons donc revoir dans ce tutoriel, l'installation de K3S mais cette fois avec l'utilisation de Traefik et de son contrôleur Ingress en 2.1 !

Installation de K3S

Je ne vais pas revenir en détail sur l'installation de K3S, je vous laisserai éventuellement revenir sur le tutoriel dédié à cela.

Installons rapidement K3S :

curl -sfL https://get.k3s.io | sh -s - --no-deploy=traefik

On vérifie son installation :

kubectl get nodes

Installation de Traefik

Pour déployer notre service Traefik, il va être nécessaire de réaliser les étapes suivantes :

  • Déployer un service Traefik,
  • Créer des CustomRessources,
  • Déclarer les rôles et ClusterRole,
  • Configurer Traefik.

Pour réaliser ce déploiement, je vais me baser sur la documentation officielle présente sur le site : https://docs.traefik.io/providers/kubernetes-ingress/

Je ne vais pas vous mettre ici les configurations en détail de chaque éléments à configurer. Cela allongerait fortement le contenu de l'article et nuirait complètement à la lisibilité des explications.

Voici un lien github pour récupérer l'intégralité des configurations :

lfache/K3S_TRAEFIK2.1
Contribute to lfache/K3S_TRAEFIK2.1 development by creating an account on GitHub.

Occupons nous d'abord du dossier "Traefik" qui contient la déclaration nécessaire à son utilisation. Voici les fichiers contenus dans ce dossier :

Traefik.yml : C'est la déclaration même de votre service et de son déploiement.
CustomResourceDefinition.yml : Ce sont les ressources "Custom" utilisées par Traefik.
ConfigMap.yml : Il s'agit du fichier qui contient la configuration de Traefik. Notre traefik.yml que nous utilisons habituellement pour configurer Traefik, il s'agit de la configuration statique du logiciel.
RBAC.yml : Ce fichier contient les éléments d'autorisation de l'application Traefik dans notre cluster.

Je ne vais pas m'attarder dans ce tutoriel sur la gestion des droits afin de nous concentrer sur la déclaration du déploiement, du service et de la configuration mise en place.

Quelques explications ! Commençons par le fichier ConfigMap.yml, ce fichier sert à déclarer la configuration de Traefik. Comme à mon habitude, j'utilise un fichier de type YAML.

Regardons rapidement la déclaration de la configuration :

data:
  traefik.yml: |
    # Global settings
    entryPoints:
      http:
        address: :80
  
      https:
        address: :443

    api:
      insecure: true
    
    providers:
      kubernetesCRD: {}

Rien d'exceptionnel, vous remarquerez juste la déclaration du providers qui est dans notre cas une ressource custom Kubernetes ( abrégé CRD : Custom Ressource Definition ).

Continuons justement avec la déclaration des CRD, je supprime volontairement quelques lignes afin de faciliter la lecture :

apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
spec:
  names:
    kind: IngressRoute
---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
spec:
  names:
    kind: IngressRouteTCP
---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
  names:
    kind: Middleware
---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
spec:
  names:
    kind: TLSOption
---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
spec:
  names:
    kind: TraefikService

Il est important de comprendre qu'ici nous déclarons 5 ressources :

  • IngressRoute ( Pour la gestion du HTTP/S )
  • IngressRouteTCP ( Pour la gestion du flux TCP )
  • Middleware ( Vous connaissez ? 😃 )
  • Les options TLS
  • Le service Traefik.

Enfin le dernier fichier Traefik.yml vous permettra de déclarer le service Traefik et de le déployer ! Nous allons juste nous attarder sur la déclaration du déploiement :

kind: Deployment
apiVersion: apps/v1
metadata:
  namespace: kube-system
  name: traefik
  labels:
    app: traefik

spec:
  replicas: 1
  selector:
    matchLabels:
      app: traefik
  template:
    metadata:
      labels:
        app: traefik
    spec:
      serviceAccountName: traefik-ingress-controller
      containers:
        - name: traefik
          image: traefik:2.1
          volumeMounts:
            - name: traefik-config
              mountPath: /etc/traefik/
          ports:
            - name: http
              containerPort: 80
            - name: traefik
              containerPort: 8080
      volumes:
        - name: traefik-config
          configMap:
            name: traefik-config

Vous pouvez remarquer ici que l'on charge la configuration présente dans ConfigMap afin de l'utiliser.

Maintenant que tout est prêt, nous allons pouvoir appliquer nos modifications !

kubectl apply -f traefik/

Vous pouvez vérifier que tout fonctionne correctement avec la commande suivante :

kubectl get po --all-namespaces

Si votre instance de Traefik ne démarre pas, vous pouvez consulter le log du container en question :

sudo kubectl logs -f MONCONTAINER -n kube-system

Si vous avez récupéré le dossier sur GitHub, il ne devrait y avoir aucun soucis !

Vérifions cela en nous connectant directement au Dashboard :

http://MONIP:8080

Et vous devriez obtenir le résultat suivant :

dashboard traefik

Ok Traefik fonctionne mais avec un exemple c'est mieux non ?

Déploiement d'une instance Whoami

Nous allons pouvoir déployer une instance de whoami sur notre cluster kubernetes.

Pour cela créeons un fichier whoami.yml :

kind: Namespace
apiVersion: v1
metadata:
  name: whoami
---
kind: Deployment
apiVersion: apps/v1
metadata:
  name: whoami
  namespace: whoami

spec:
  replicas: 1
  template:
    metadata:

    spec:
      containers:
        - name: whoami
          image: containous/whoami
          ports:
            - name: web
              containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: whoami
  namespace: whoami
spec:
  ports:
    - protocol: TCP
      name: web
      port: 80
  selector:
    app: whoami
---
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: whoami-http
  namespace: whoami
spec:
  entryPoints:
    - http
  routes:
  - match: Host(`test.mondomain.com`)
    kind: Rule
    services:
    - name: whoami
      port: 80

Il ne reste plus qu'à appliquer la configuration que nous venons de créer :

kubectl apply -f whoami.yml

Il ne nous reste plus qu'à vérifier que tout fonctionne correctement à l'adresse : http://test.domaine.com/

MAGIC
MAGIC !

Vous pouvez bien sûr envisager de déployer d'autres services que whoami à partir de cette configuration !


Dans ce tutoriel, nous avons pu installer K3S et Traefik en version 2.1. Nous avons également pu tester notre installation avec le déploiement d'une instance whoami.

Mais pour le moment, nous n'avons pas mis en place de SSL, ou même de restriction par IP sur notre dashboard, ce qui est potentiellement dangeureux. C'est pourquoi, dans un prochain article, nous aurons l'occasion d'aller encore plus loin avec notre installation.

En mettant en place le HTTPS et quelques règles de middlewares.

J'espère en tout cas que cet article vous aura apporté une aide dans l'installation de K3S avec Traefik en version 2.1 !

En tout cas  n'hésitez pas à m'apporter des remarques ou des commentaires sur Twitter