Déploiement d’un cluster Kubernetes sur du BareMetal dans Scaleway avec Kontena Pharos, MetalLB et ZeroTier …

Karim
8 min readApr 22, 2019

Scaleway a renouvelé l’ensemble de ses gammes d’instances Public Cloud et propose notamment des serveurs BareMetal 64 Bits :

Physiquement, là où Dell met 4 serveurs bi-cpu dans un chassis 2U, Scaleway peut placer 14 serveurs (appelés node) mono cpu dans un châssis 3U : 3 cartes de 2 serveurs à gauche et 4 cartes de 2 serveurs à droite. Par défaut, ces serveurs n’ont pas de disques en local et démarrent sur un disque réseau comme l’explique cet article :

Des instances que l’on retrouve également sur ce type de chassis dôté par exemple de 27 noeuds physiques :

Je pars de trois instances physiques (de type C2S et C2M) avec Ubuntu 18.04 LTS 64 Bits qui vont me servir à l’installation de mon cluster Kubernetes :

Ces trois instances sont en possession d’un adresse IP publique ainsi que deux adresses IP internes. Je commence par y installer le client ZeroTier. Pour rappel, ZeroTier offre des capacités des VPN (en Peer to Peer), SDN et SD-WAN avec un seul système. Toutes les ressources sont alors connectées sur des réseaux locaux et étendus comme l’ensemble était rassemblé dans un seul datacenter unique :

Au préalable, il faut installer sudo et python dans ces instances :

$ apt install python -y
$ apt install sudo iputils-ping -y
$ curl -s https://install.zerotier.com/ | bash$ zerotier-cli join <network ID>$ zerotier-cli status$ zerotier-cli listnetworks

Ce qui me permet de voir les adresses attribuées par ZeroTier à ces instances dans cette plage en 192.168.196.0/24 :

et de son binaire à récupérer sur Github :

Ceci passe par la création d’un fichier de configuration en YAML :

cluster.yml

et je lance l’installation du cluster sur la base des adresses IP fournies par ZeroTier :

Depuis ma station connectée elle aussi à ZeroTier je peux utiliser le client Kubectl pour me connecter au cluster :

Pour bénéficier d’un service de LoadBalancing et de l’attribution automatique d’adresses IP pour les services déployés dans ce cluster Kubernetes, je procède à l’installation de MetalLB. Metallb est un projet « open sourcé » initié par Google fin 2017. Son but est de gérer des IPs externes sur des déploiements bare-metal de kubernetes :

MetalLB se branche dans le cluster Kubernetes et fournit une implémentation d’équilibreur de charge réseau. En bref, il permet de créer des services Kubernetes de type “LoadBalancer” dans des clusters qui ne fonctionnent pas sur un fournisseur de cloud computing, et ne peuvent donc pas simplement se connecter à des produits payants pour fournir des LoadBalancers. Il a deux caractéristiques qui fonctionnent ensemble pour fournir ce service : l’attribution d’adresses IP et l’annonce externe. Installation via un manifest YAML :

J’utilise cette configuration pour utiliser le mode Couche 2 (L2) dont l’avantage est qu’il n’a besoin d’aucun matériel réseau sophistiqué, il devrait donc fonctionner sur n’importe quel réseau ethernet. Ici avec ce segment d’adresses IP :

dans la plage d’adresses “192.168.196.200–192.168.196.240” que j’ai configurées dans le tableau de bord de ZeroTier :

Déploiement de la configuration réussie et active dans MetalLB :

J’autorise également la fonction Ethernet Bridging pour les noeuds connectés à ZeroTier :

J’obtiens ici ce type de liaison entre le cluster, MetalLB et ZeroTier :

Je réalise ce petit test avec Nginx pour vérifier le bon fonctionnement de MetalLB :

avec cette configuration :

Une adresse IP du pool configuré dans ZeroTier m’est retournée pour visualiser la page par défaut du serveur Web Nginx :

Je réalise un autre test avec le traditionnel démonstrateur FC Particulier :

Avec encore une fois une nouvelle adresse IP retournée pour accéder à mon service :

Si je ne souhaite pas utiliser ce service de LoadBalancing, je peux utiliser celui fourni en beta dans Scaleway :

Lors de l’installation du demonstrateur FC, je peux utiliser un service en NodePort :

avec le port TCP 30469 (ouvert sur chacun des noeuds physiques) que je vais utiliser dans le LoadBalancer:

Configuration du LoadBalancer externe fourni par Scaleway :

Pour la partie configuration des backends pour ce LoadBalancer, je reprends les adresses IP de ces instances physiques :

Et le LoadBalancer se voit attribuer une adresse IP publique pour exposer le démonstrateur en exécution dans le cluster Kubernetes :

WeaveCloud permet de visualiser comme d’habitude les éléments déployés dans le cluster :

Là encore, une adresse IP a été fournie par MetalLB via le pool d’IP configuré dans ZeroTier.

Pour terminer, si je ne veux pas utiliser le traditionnel dashboard de Kubernetes, il est possible d’utiliser une solution alternative avec k8dash :

L’adresse fournie par MetalLB me permet d’accéder sur ce dashboard alternatif avec le port TCP 80 :

et la génération d’un token d’accès :

Je retrouve les éléments précedemment installés dans le cluster depuis le début :

--

--