Des clusters Kubernetes imbriqués avec Ignite, Firecracker, Containerd, Kind et Rancher …
Tags: rancher, scaleway, serverless, kubernetes
Published: 2019-09-16 01:23:44

---
title: Des clusters Kubernetes imbriqués avec Ignite, Firecracker, Containerd, Kind et Rancher …
published: true
tags: rancher,scaleway,serverless,kubernetes
canonical_url: https://medium.com/@abenahmed1/des-clusters-kubernetes-imbriqu%C3%A9s-avec-ignite-firecracker-containerd-kind-et-rancher-34e5e92c257b
---

![](https://cdn-images-1.medium.com/max/2314/1*49EQymfT3_G9k3dN8kbRCw.jpeg)

J’avais déjà parlé dans un précédent article de Weave Ignite et Footloose qui continuent de se développer :

[**Weave Ignite et Weave Footloose dans Scaleway : quand les machines virtuelles se prennent pour des…**
*Weave a mis au point Ignite sur la base de Firecracker et qui comme Docker gère les conteneurs runC. Ignite construit…*medium.com](https://medium.com/@abenahmed1/weave-ignite-et-weave-footloose-dans-scaleway-quand-les-machines-virtuelles-se-prennent-pour-des-e28f5312a59f)

Une nouvelle version d’Ignite permet maintenant de s’affranchir de l’utilisation du moteur Docker avec Containerd et CNI :

[**Ignite Documentation - Ignite documentation**
*In this folder you can read more about how to use Ignite, and how it works:*ignite.readthedocs.io](https://ignite.readthedocs.io/en/stable/index.html)

![](https://cdn-images-1.medium.com/max/2000/0*g_xmwUgw-R5PH_o-.png)
[**Fire Up Your VMs with Weave Ignite**
*Happy birthday Weaveworks! Today we turn FIVE! It feels like we are older: startup years are a bit like dog years…*www.weave.works](https://www.weave.works/blog/fire-up-your-vms-with-weave-ignite)

Focus sur cette nouvelle version avec pour commencer le lancement d’une instance Bare Metal de type C2L dans Scaleway sur laquelle tourne Ubuntu 18.04 LTS :

![](https://cdn-images-1.medium.com/max/2000/1*rCsGshDXuIoawYPxTxy-nQ.jpeg)

![](https://cdn-images-1.medium.com/max/2688/1*3oan_n94XecAFj8BOsSnZQ.jpeg)
>  A noter que Scaleway permet également de faire tourner en version Beta des serveurs de la gamme Dedibox et facturés comme les instances classiques à l’heure :

![](https://cdn-images-1.medium.com/max/2000/1*Jtc5fuMaEZD0Stxv4A0xTg.jpeg)

Je profite du second disque de 250 Go pour créer un point de montage dédié au moteur Containerd. L’extension virtualisation nécessaire à Ignite est active :

![](https://cdn-images-1.medium.com/max/2434/1*I1hs5LiZ0FM5vqRPR2nS2w.jpeg)

Sur cette instance de Scaleway, j’installe les dépendances nécessaires à Ignite :

    $ apt-get update && apt-get install -y --no-install-recommends containerd dmsetup openssh-client git binutils

![](https://cdn-images-1.medium.com/max/2730/1*g4dmaOH3CDu3Q8Vl5Sa9Qw.jpeg)

Puis les binaires nécessaires à CNI :

    $ export CNI_VERSION=v0.8.2
    $ export ARCH=$([ $(uname -m) = "x86_64" ] && echo amd64 || echo arm64)
    $ mkdir -p /opt/cni/bin

    $ curl -sSL https://github.com/containernetworking/plugins/releases/download/${CNI_VERSION}/cni-plugins-linux-${ARCH}-${CNI_VERSION}.tgz | tar -xz -C /opt/cni/bin

suivi d’Ignite :

    $ for binary in ignite ignited; do
        echo "Installing ${binary}..."
        curl -sfLo ${binary} [https://github.com/weaveworks/ignite/releases/download/${VERSION}/${binary}-${GOARCH](https://github.com/weaveworks/ignite/releases/download/${VERSION}/${binary}-${GOARCH)}
        chmod +x ${binary}
        mv ${binary} /usr/bin
    done

![](https://cdn-images-1.medium.com/max/2722/1*kIOWsVsSyoyzc7orTYk-bQ.jpeg)

Weave Ignite est un gestionnaire de machine virtuelle (VM) open source avec un conteneur UX et une gestion GitOps intégrée. Ignite combine les MicroVM Firecracker avec les images Docker / OCI pour unifier containers et machines virtuelles. Ignite peut gérer les VMs de manière déclarative et automatique comme Kubernetes et Terraform.

[**Firecracker**
*Firecracker is an open source virtualization technology that is purpose-built for creating and managing secure…*firecracker-microvm.github.io](https://firecracker-microvm.github.io/)

Pour rappel, Firecracker est une implémentation KVM open source d’AWS optimisée pour une haute sécurité, une isolation, une vitesse et une faible consommation de ressources. AWS l’utilise comme base pour ses offres serverless (AWS Lambda et Fargate) qui doivent être chargées presque instantanément tout en maintenant les utilisateurs isolés (multilocation). Firecracker a prouvé sa capacité à faire fonctionner 4000 microVMs sur le même hôte ! …

![](https://cdn-images-1.medium.com/max/2000/0*9CNwSy82DkTCCOm6.png)

![](https://cdn-images-1.medium.com/max/2000/0*z0NQsi87UyrDsS7k.jpg)

Je vais utiliser une image Ubuntu fournie par Weaveworks dans le Docker Hub pour lancer une première microVM ***mais sans Docker ***(avec uniquement Ignite, Containerd et CNI plugins) :

    $ ignite run weaveworks/ignite-ubuntu \
        --cpus 2 \
        --memory 8GB \
        --ssh \
        --size 50GB \
        --name k8s1

![](https://cdn-images-1.medium.com/max/2726/1*cNVnAcj7NQrYqlvCm5BUKQ.jpeg)

Je peux m’y connecter via SSH directement :

![](https://cdn-images-1.medium.com/max/2694/1*gczUvQwrESVFouqB8Il8xQ.jpeg)

Je mets les bonnes entrées DNS (en utilisant par exemple celui de Google) dans le fichier */etc/resolv.conf* :

![](https://cdn-images-1.medium.com/max/2358/1*k7jWI1-Hy0z5czZz3H0LYQ.jpeg)

Et dans l’optique de l’installation de Kind (Kubernetes in Docker), j’installe dans cette microVM le moteur Docker :

    $ curl -fsSL [https://get.docker.com](https://get.docker.com) -o get-docker.sh; sh get-docker.sh; systemctl enable docker; systemctl start docker

![](https://cdn-images-1.medium.com/max/2628/1*PylDn3r-eFr9HhAlQQ4gKA.jpeg)

Je peux alors récuperer Kind depuis son dépôt sur Github …

[**kind**
*If you want to get started with kind, checkout our user guide. Here you will find all details to get you started along…*kind.sigs.k8s.io](https://kind.sigs.k8s.io/docs)
[**kubernetes-sigs/kind**
*You can't perform that action at this time. You signed in with another tab or window. You signed out in another tab or…*github.com](https://github.com/kubernetes-sigs/kind/releases)

![](https://cdn-images-1.medium.com/max/2136/1*WlUbCx3XdnsZRc3W3Q6zUQ.jpeg)

et le déployer …

![](https://cdn-images-1.medium.com/max/2694/1*5Wd4dhnA4tF-HDMGSBnSwQ.jpeg)

>  Kind (Kubernetes IN Docker) est un outil permettant d’exécuter des clusters Kubernetes locaux à l’aide de “nœuds” sous la forme de containers Docker. Kind a été à l’origine principalement conçu pour tester les versions Kubernetes 1.11 et ultérieures, en ciblant notamment les tests de conformité.

Pour rappel :

* Kind prend en charge les clusters multi-nœuds (y compris HA)

* Kind supporte les builds de Kubernetes à partir des sources
pour make / bash / docker, ou bazel, en plus des builds pré-publiées.

* Kind est écrit en Go, peut être utilisé comme bibliothèque et a des versions stables

* Kind supporte Windows en plus de MacOS et Linux

* Et Kind est un installer Kubernetes certifié conforme par la CNCF

Je vais créer avec Kind un cluster à trois noeuds (1 noeud Maîtres et deux noeuds Workers) à partir de ce fichier de configuration en YAML :

![config.yaml](https://cdn-images-1.medium.com/max/3824/1*b975W-e9KdgBqKc91tHeJA.png)

    $ kind create cluster --config config.yaml

![](https://cdn-images-1.medium.com/max/2676/1*0VhNryoGiAUryJ5t1D1-yw.jpeg)

Le cluster est actif et j’installe le client Kubectl pour intéragir avec lui:

    $ curl -LO [https://storage.googleapis.com/kubernetes-release/release/v1.15.3/bin/linux/amd64/kubectl](https://storage.googleapis.com/kubernetes-release/release/v1.15.3/bin/linux/amd64/kubectl); chmod +rwx kubectl; mv kubectl /usr/bin

    $ export KUBECONFIG="$(kind get kubeconfig-path --name="kind")"

![](https://cdn-images-1.medium.com/max/2722/1*kH0rmbU4FGnh4tyNbRvtdQ.jpeg)

Déploiement de MetalLB avec Kind nécessaire à mon premier test :

[**Using MetalLb with Kind**
*Preamble: When using metallb with kind we are going to deploy it in l2-mode. This means that we need to be able to…*mauilion.dev](https://mauilion.dev/posts/kind-metallb/)
[**MetalLB**
*MetalLB is a load-balancer implementation for bare metal Kubernetes clusters, using standard routing protocols. MetalLB…*metallb.universe.tf](https://metallb.universe.tf/)

    $ kubectl apply -f https://raw.githubusercontent.com/google/metallb/v0.8.1/manifests/metallb.yaml

avec cette configuration utilisant ce plan d’adressage interne 172.17.0.0/16 :

![l2.yaml](https://cdn-images-1.medium.com/max/3440/1*OXTvJFPLTP4sd0xEpb8W1A.png)

Je peux procéder au désormais traditionnel démonstrateur FC :

![](https://cdn-images-1.medium.com/max/2670/1*YHZ38B48D1lVIYEvqffjWg.jpeg)

![deployment.yml](https://cdn-images-1.medium.com/max/2136/1*LDPabaFN8NKyRyacSNWxlw.png)

Une adresse IP m’a été attribuée par MetalLB pour le démonstrateur FC :

![](https://cdn-images-1.medium.com/max/2686/1*jq_7j1YVp3alIyJKSn164g.jpeg)

Réutilisation de Gobetween, un Load Balancer et proxy inverse libre, open-source et minimaliste dans le cluster Kind :

![](https://cdn-images-1.medium.com/max/2000/0*yyLxfuAF7ipMu7Jz.png)

    $ curl -s https://api.github.com/repos/yyyar/gobetween/releases | grep browser_download_url | grep linux_amd64 | cut -d '"' -f 4 | head -n 1 | wget -i -

[**gobetween - modern & minimalistic L4 load balancer**
*gobetween is free, open-source, modern & minimalistic L4 load balancer and reverse proxy for the Cloud era. Plays nice…*gobetween.io](http://gobetween.io/index.html)

Il va servir à me permettre d’accéder en externe au démonstrateur via l’adresse IP interne attribuée par MetalLB. Pour cela, je me base sur cette configuration en TOML pour Gobetween :

![gobetween.toml](https://cdn-images-1.medium.com/max/3544/1*fa4I8tk0_FK-SUGR4CAVsQ.png)

Je peux lancer Gotbetween avec cette configuration :

    $ gobetween -c config/gobetween.toml

![](https://cdn-images-1.medium.com/max/2654/1*KzpEGXBSeXqboajf1ZQAXA.jpeg)

J’avais également liée cette microVM à un réseau ZeroTier ce qui me permet d’accéder au démonstrateur depuis mon navigateur :

![](https://cdn-images-1.medium.com/max/2666/1*vl_B4Mq10IssIqYECaaGhQ.jpeg)
>  Gobetween peut activer son API Restful pour plus d’infos :

![](https://cdn-images-1.medium.com/max/2008/1*IqOfpqdLZVlzOo1g3BNF4Q.jpeg)

Lancement d’une seconde microVM qui va servir à porter un second cluster Kubernetes avec Kind :

![](https://cdn-images-1.medium.com/max/2720/1*RK7DgVfP3wSI0L3R4EKAEQ.jpeg)

![](https://cdn-images-1.medium.com/max/2000/0*OKotEgdkDHZgIR29.jpg)

à trois noeuds (1 noeud maître et deux noeuds workers) :

![config.yaml](https://cdn-images-1.medium.com/max/3824/1*b975W-e9KdgBqKc91tHeJA.png)

![](https://cdn-images-1.medium.com/max/2722/1*q4YBNuNzGyxuKhgl1xU6EQ.jpeg)

avec encore une fois MetalLB :

![](https://cdn-images-1.medium.com/max/2688/1*ZKOdbHUbhpim4UoU19ZgQQ.jpeg)

et cette fois-çi le déploiement du deuxième démonstrateur FC :

![deployment.yml](https://cdn-images-1.medium.com/max/2136/1*s_ezqVKKjjwG8BZR88VJUA.png)

Une adresse IP interne est fournie par MetalLB pour l’accès au démonstrateur :

![](https://cdn-images-1.medium.com/max/2724/1*FQFgrMg_EDA-7tMw_j3eqQ.jpeg)

Je réutilise comme précédemment Gobetween avec cette microVM liée à ZeroTier :

![](https://cdn-images-1.medium.com/max/2708/1*-gm9u8BX8p1DPhQcUcsT0Q.jpeg)

avec cette configuration en TOML (très proche de la précédente) :

![gobetween.toml](https://cdn-images-1.medium.com/max/3312/1*36NaFNf6h3j5b87jz7L8uA.png)

Ce second démonstrateur est accessible depuis mon navigateur via une adresse du réseau configurée en amont dans ZeroTier :

![](https://cdn-images-1.medium.com/max/2674/1*LZsZzsoSLTB5bKdO49XjLQ.jpeg)

Lancement d’une dernière microVM qui va me servir à héberger un serveur Rancher :

![](https://cdn-images-1.medium.com/max/2672/1*nXhbCdiEqjFQ82gk0oTFLQ.jpeg)

Installation du moteur Docker et du serveur Rancher :

    $ curl -fsSL [https://get.docker.com](https://get.docker.com) -o get-docker.sh; sh get-docker.sh; systemctl enable docker; systemctl start docker; docker run -d --restart=unless-stopped -p 80:80 -p 443:443 -v /opt/rancher:/var/lib/rancher rancher/rancher:latest

![](https://cdn-images-1.medium.com/max/2714/1*t1Hm8LNQ7vcZoxDuwd_Yrg.jpeg)

Je peux alors importer mes deux clusters Kubernetes construits avec l’aide de Kind dans Rancher. Importation du premier cluster k8s1 :

![](https://cdn-images-1.medium.com/max/2632/1*cxlTg6-LaUh32FNrkvFhNQ.jpeg)

![](https://cdn-images-1.medium.com/max/2720/1*O0ykyiNP7TATfPhK6JM3ww.jpeg)

Puis du second cluster nommé k8s2 :

![](https://cdn-images-1.medium.com/max/2590/1*-gfh-WScSGZWzLk8ygQmLw.jpeg)

![](https://cdn-images-1.medium.com/max/2724/1*D0wRFayKEtwFFwl2pOUAYA.jpeg)

Tous les clusters sont importés dans Rancher :

![](https://cdn-images-1.medium.com/max/2566/1*sgCcIEc2JInPXywCK9vZXQ.jpeg)

![](https://cdn-images-1.medium.com/max/2554/1*g1KoeOo3aAeyXJccWBkWZg.jpeg)

![](https://cdn-images-1.medium.com/max/2640/1*HpO7MvTj_P8qBEH6p5Z5QQ.jpeg)

![](https://cdn-images-1.medium.com/max/2566/1*ZUDBcY9YYsAF-Zf8Ze2BcA.jpeg)

![](https://cdn-images-1.medium.com/max/2548/1*H4GMQOKEUDdeuDJC-T-uzA.jpeg)

![](https://cdn-images-1.medium.com/max/2564/1*RIgyV5WY26KcCN66_m7dUQ.jpeg)

Sur le serveur hôte C2L j’effectue la liaison avec ZeroTier :

![](https://cdn-images-1.medium.com/max/2598/1*7u9ipLcdMlP08Zn2y7C33g.jpeg)

Obtention au final de cette configuration schématique :

![](https://cdn-images-1.medium.com/max/2594/1*soxMuiNH9FzQNddktdvUqw.jpeg)

et je réutilise une dernière fois Gobetween avec cette configuration en TOML qui reprend les adresses IP des microVMs dans ZeroTier :

![gobetween.toml](https://cdn-images-1.medium.com/max/3376/1*xeIfqeAiHHqtGk8jHnOUkw.png)

![](https://cdn-images-1.medium.com/max/2680/1*Yv_v28nh_W8o2E_FEZav3w.jpeg)

Ici j’ai utilisé des poids dans Gobetween pour simuler une sorte d’A/B Testing avec deux versions différentes du démonstrateur FC accessibles avec l’adresse IP publique du serveur C2L dans Scaleway :

![](https://cdn-images-1.medium.com/max/2534/1*Z1p7eWr7lTEWQSg-rj3Bxg.jpeg)

![](https://cdn-images-1.medium.com/max/2672/1*FM6MSF41SAgqtbABRhH5fg.jpeg)

Le monitoring des deux clusters Kubernetes est assurée par le serveur Rancher via Prometheus et Grafana :

![](https://cdn-images-1.medium.com/max/2558/1*XfMVpw0VkCoKF2AfReNbLQ.jpeg)

![](https://cdn-images-1.medium.com/max/2568/1*Ehl8gChO4etIdBjPbyH3LQ.jpeg)

![](https://cdn-images-1.medium.com/max/2664/1*1vvuEDWdK0Rv61KcSinlbQ.jpeg)

![](https://cdn-images-1.medium.com/max/2648/1*IihSv2cFhKkR9cuNXqmLHg.jpeg)

![](https://cdn-images-1.medium.com/max/2620/1*orX_4V1osA8G1vhkE6vcjA.jpeg)

![](https://cdn-images-1.medium.com/max/2630/1*oqQ2EQi0iQ1FyfInI-NCDQ.jpeg)

Ignite utilise une boîte à outils en interne pour exécuter ses fonctions GitOps et depuis les dernière versions, vous pouvez facilement utiliser ces fonctionnalités, aussi !

[**weaveworks/ignite**
*Ignite is a "GitOps-first" project, GitOps is supported out of the box using the ignited gitops command. Previously…*github.com](https://github.com/weaveworks/ignite/blob/master/docs/gitops.md)
[**weaveworks/gitops-toolkit**
*You can't perform that action at this time. You signed in with another tab or window. You signed out in another tab or…*github.com](https://github.com/weaveworks/gitops-toolkit)

![](https://cdn-images-1.medium.com/max/2000/0*4GQ-nqsgkQBMSHIW.jpg)

A suivre !