Initier un cluster K3S en mode HA …
Tags: kubernetes, docker, k3s, hetzner
Published: 2019-08-24 16:36:27

---
title: Initier un cluster K3S en mode HA …
published: true
tags: kubernetes,docker,k3s,hetzner
canonical_url: https://medium.com/@abenahmed1/initier-un-cluster-rancher-k3s-en-mode-ha-15d469abea19
---

# Initier un cluster K3S en mode HA …

![](https://cdn-images-1.medium.com/max/1024/1*BYb9iQWkSJaou3b3IQSUdg.png)

Il est visiblement possible d’initier expérimentalement un cluster Kubernetes avec Rancher K3S en haute disponibilité vis à vis des noeuds maîtres depuis la version 0.7.0 (même si une issue sur le dépôt github de K3S a été ouverte à ce sujet) :

[Initial "v1" HA Support · Issue #618 · rancher/k3s](https://github.com/rancher/k3s/issues/618)

Car officiellement on était habituellement sur ce type de structure dans un cluster K3S :

[k3s: Lightweight Kubernetes](https://k3s.io/)

![](https://cdn-images-1.medium.com/max/1024/1*5mH4sLy417Wynv6UAEL8lg.png)

Je commence par créer un premier noeud Ubuntu 18.04 LTS sur Hetzner Cloud qui fera office de noeud Etcd et de Load Balancer pour ce futur cluster :

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

En utilisant toujours le même gabarit CX11 à l’avenir avec 1 vCPU et 2 Go de RAM :

![](https://cdn-images-1.medium.com/max/1024/0*5cByqtLGOoudJnQi.jpeg)

Je récupère les binaires relatifs à Etcd sur le dépôt Github de ce dernier :

- [etcd](https://etcd.io/)
- [etcd-io/etcd](https://github.com/etcd-io/etcd/releases)

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

Et je les installe sur l’instance :

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

Je peux lancer mon serveur Etcd qui fait office ici de backend de stockage pour ce futur cluster :

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

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

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

A ce stade, je crée trois autres instances Ubuntu 18.04 LTS qui vont servir de noeuds maîtres du cluster K3S :

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

Avec ces adresses IP publiques, je peux commncer l’installation d’un Load Balancer avec l’utilisation de gobetween :

> *un équilibreur de charge L4 (et proxy inverse) libre, open-source, moderne et minimaliste …*

[gobetween - modern & minimalistic L4 load balancer](http://gobetween.io/index.html)

![](https://cdn-images-1.medium.com/max/670/1*lxJtLnSSRZzoK6-e_QACEQ.jpeg)

On peut l’installer simplement via snap :

```
$ snap install gobetween --edge
```

[Install gobetween for Linux using the Snap Store | Snapcraft](https://snapcraft.io/gobetween)

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

Je modifie avec les adresses IP publiques des noeuds maîtres le fichier `/var/snap/gobetween/common/gobetween.toml`

![](https://cdn-images-1.medium.com/max/1024/1*oeOgRiAGk86-rQV4d5oStg.jpeg)

Je relance le service et le Load Balancer est prêt :

    $ snap restart gobetween

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

Un équilibreur de charge externe a donc été configuré pour ces nœuds maître sur le port TCP 6443 :

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

Par la suite j’installe la nouvelle version de Rancher K3S sur les noeuds maîtres :

[rancher/k3s](https://github.com/rancher/k3s/releases)

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

ainsi qu’une connexion à ZeroTier pour MetalLB :

![](https://cdn-images-1.medium.com/max/1024/1*ZFE0NAk7dS16yImKPSQJpQ.png)

> *Quand une adresse IP est utilisée au lieu d’un nom d’hôte pour l’équilibreur de charge, cette adresse IP est incluse comme ici avec un indicateur tls-san lors de la procédure de lancement des noeuds maîtres :*

![](https://cdn-images-1.medium.com/max/1024/1*FOw6-zCyxXuA5GRl2Zm8Fw.jpeg)

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

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

> *Pour amorcer les nœuds maîtres en haute disponibilité, les mots de passe appropriés doivent être copiés sur tous les nœuds. En passant `--bootstrap full` le noeud maître essaiera de lire les données d’amorçage à partir du serveur Etcd. Si elles n’existent pas, elles seront créées, puis les certificats seront écrits dans le serveur Etcd s’ils n’existent pas déjà. L’utilisation de `--bootstrap read` ne récupérera que les données du serveur Etcd et une erreur s’il n’en existe aucune, et `--bootstrap write` écrira toujours les données d’amorçage sur le serveur etcd mais ne les lira pas. La valeur par défaut consiste à n’effectuer aucune opération d’amorçage.*

Le cluster K3S laisse alors apparaitre les trois noeuds maîtres en haute disponibilité :

![](https://cdn-images-1.medium.com/max/1024/1*uobt-p_diiUgEwM5tnM4FA.jpeg)

Je peux substituer l’adresse du serveur dans le fichier _Kubeconfig_ avec celle du Load Balancer :

![](https://cdn-images-1.medium.com/max/1024/1*9EX28jAzC2pNYbJCr1sAyw.jpeg)

Il est alors possible de relier des noeuds _“Agent”_ dans ce cluster K3S :

![](https://cdn-images-1.medium.com/max/1024/1*t3ASnwnkPEnoYwmIkMhwpg.png)

Par l’ajout de trois nouveaux noeuds Ubuntu 18.04 LTS dans Hetzner :

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

J’ai donc septs noeuds au total pour ce cluster K3S en mode HA (trois autres noeuds agents ont été créés, en se connectant à l’adresse IP publique de l’équilibreur de charge des nœuds principaux) :

![](https://cdn-images-1.medium.com/max/1024/1*uA7S8l_YQQ0-hN77njPf-A.jpeg)

> *Lorsqu’un agent se connecte au serveur, il parcourt tous les noeuds finaux du cluster K3S et se connecte à un tunnel inverse aux noeuds maîtres afin que ces derniers puissent communiquer avec lui. Les points de terminaison du cluster K3S sont surveillés et toute modification entraînera des déconnexions d’anciens nœuds ou une connexion à de nouveaux nœuds.*

Ici tous les noeuds sont opérationnels :

![](https://cdn-images-1.medium.com/max/1024/1*PXeVsWJ5hApt7R-gJwI-kQ.jpeg)

Installation de MetalLB pour fournir un service de Load Balancing interne au cluster K3S en lien avec ZeroTier :

![](https://cdn-images-1.medium.com/max/1024/1*UmjO0nZV-0ibFYl96tq62A.jpeg)

[MetalLB](https://metallb.universe.tf/)

![](https://cdn-images-1.medium.com/max/1024/1*OZOqbTGrXfG5Mu7GsN5-xA.jpeg)

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

> *Le mode couche 2 avec MetalLB est le plus simple à configurer et n’exige pas que les adresses IP soient liées aux interfaces réseau des noeuds de ce cluster. Il fonctionne en répondant directement aux requêtes ARP pour donner l’adresse MAC de la machine aux clients. J’utilise donc ici un segment d’adresses IP en lien avec le plan d’adressage défini dans ZeroTier dans la configuration de MetalLB via ce fichier de manifest YAML :*

![](https://cdn-images-1.medium.com/max/968/1*jgrdKgtsImioEXTvEubyig.png)<figcaption>dhcp.yaml</figcaption>

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

Je peux tester simplement mon traditionnel démonstrateur FC avec ce manifest YAML :

    $ kubectl apply -f deployment.yaml

![](https://cdn-images-1.medium.com/max/1024/1*BfDlx9k0pF7F9d17TDpSYw.png)<figcaption>deployment.yaml</figcaption>

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

L’adresse IP retournée me permet d’accéder sans surprise à la page web du demonstrateur FC :

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

Avec le déploiement du metrics-server dans le cluster, j’ai accès rapidement à un simple monitoring de ce dernier :

```
$ git clone https://github.com/kubernetes-incubator/metrics-server

$ kubectl create -f deploy/1.8+/
```

[kubernetes-incubator/metrics-server](https://github.com/kubernetes-incubator/metrics-server)

![](https://cdn-images-1.medium.com/max/1024/1*SrAMZQ-2qF7rn73Tqf-pTQ.jpeg)

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

Pour vérifier la haute disponibilité des trois noeuds maîtres du cluster K3S, j’arrête les deux dernières instances de ce trio :

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

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

Je n’ai alors plus qu’un seul noeud maître :

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

Et le cluster K3S est toujours actif :

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

Pour conclure, comme l’indiquait Erik Wilson dans l’issue sur Github, il est prévu dans l’avenir la mise en place d’un proxy d’équilibrage de charge sur chaque noeud du cluster K3S afin d’éviter le recours à un équilibreur de charge externe. Et également la mise en place de MySQL & PostgreSQL derrière une interface Etcd3 …

![](https://cdn-images-1.medium.com/max/571/0*rw1Z96UhRyDYKlDm.jpeg)

A suivre !