( version pour commentaires )
Pour permettre de mettre en place votre environnement de travail avec un cluster kubernetes. Un choix assez large d'options est disponible, cet article propose plusieurs approches pour créer le votre. Il vous permet de construire un cluster et progressivement utiliser une chaine de livraison logicielle compatible avec l'offre Cloud Pi Native proposée par le ministère de l'Intérieur. Il vous faudra respecter quelques conditions ou adapter votre code au choix de processeur, rootless, liste des images de références. Cf. liste de compatibilité citée en annexes.
Pour découvrir la conteneurisation et Kubernetes, vous pouvez suivre des tutoriaux tels que ceux présents au sein de ce répertoire github, ainsi qu'à travers une offre de tutoriaux vidéo en ligne. Tel que ceux proposés par "Tech With Nana" (Activer la traduction des sous titre dans YouTube) : https://www.youtube.com/watch?v=VnvRFRk_51k ( acculturation rapide de 15 min ) https://www.youtube.com/watch?v=s_o8dwzRlu4 ( 'crash course' en 1H ) https://www.youtube.com/watch?v=X48VuDVv0do ( court complet 4H )
Vous disposer de plusieurs possibilités pour monter votre environnement, dans le cloud ou en local. Vous commencerez probablement sur votre poste de travail et irez ensuite vers une combinaison hybride :
L'option généralement la plus confortable pour débuter ou pour un développeur. Pré-requis : un ordinateur Mac ou Unix (PC possible) avec à minima 8Go de RAM et plusieurs processeurs. Note: Cet article a été réalisé à partir de MacBook Pro 'M1' (processeur de type Arm) et testé sur des VM linux Ubuntu Arm. Là vous disposer de plusieurs options également.
Permet d'activer simultanément l'ensembles des outils docker et d'un minicluster kubernetes. ( à activer dans les préférences) cf https://www.docker.com/.
Option 1.2: Installer un cluster K3s, version économe en ressource cf. https://k3s.io/
Sur Mac et PC vous devez disposer de la capacité d'exécution de VM linux, vous pouvez utiliser https://multipass.run, suivez les instructions pour l'installation, cela s'installe comme un charme.
# Lancer la commande suivate pour créer une VM d'accueil pour le mini cluster kubernetes : 8Go Ram, 4 vcpu, 60G de disque), vous pouvez modifier ces valeurs.
multipass launch lts --name k3s-server -m 8g -c 4 -d 60G
# Installer un master k3s avec les droits d'accès sur l'ensemble des utilisateurs
multipass shell k3s-server
sudo curl -sfL https://get.k3s.io | sh -s - --write-kubeconfig-mode 644
# Vérifier la disponibilité du worker node.
ubuntu@k3s-server:~$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
k3s-server Ready control-plane,master 3m25s v1.25.4+k3s1
ubuntu@k3s-server:~$ kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system local-path-provisioner-79f67d76f8-nkslg 1/1 Running 0 3m47s
kube-system coredns-597584b69b-g9h4m 1/1 Running 0 3m47s
kube-system helm-install-traefik-crd-frxpb 0/1 Completed 0 3m47s
kube-system svclb-traefik-162592aa-zzfqb 2/2 Running 0 3m38s
kube-system helm-install-traefik-h276n 0/1 Completed 1 3m47s
kube-system traefik-bb69b68cd-x257d 1/1 Running 0 3m38s
kube-system metrics-server-5c8978b444-g55zj 1/1 Running 0 3m47s
#Rechercher l'ip locale de votre machine dans le haut de la fenêtres en déroulant vers le haut pour retrouver dans les messages initiaux de la VM
Welcome to Ubuntu 22.04.1 LTS (GNU/Linux 5.15.0-56-generic aarch64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
System information as of Wed Dec 28 18:43:32 CET 2022
System load: 1.35009765625
Usage of /: 4.0% of 57.97GB
Memory usage: 9%
Swap usage: 0%
Processes: 157
Users logged in: 1
IPv4 address for cni0: 10.42.0.1
*> IPv4 address for enp0s1: 192.168.64.X <******* CETTE IP ICI
IPv6 address for enp0s1: fd12:d3ea:b18f:437b:5054:ff:fecd:9738
Lens permet d'interagir facilement / monitorer votre cluster sans nécessiter d'installer des services dans le cluster. Pour installer le logiciel : https://k8slens.dev/ Vous devrez vous créer un compte sur Lens, utiliser votre login github pour vous logguer .
# Une fois l'application installée pour accéder à votre cluster
# vous devez récupérer le fichier de configuration kubernetes.
# >Copier le résultat de la commande suivante dans Lens.
cat /etc/rancher/k3s/k3s.yaml
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: LS0t
.../... (réponse coupée)
Dans Lens ajoutez un nouveau cluster :
Copier le convenu du 'cat' dans la nouvelle fenêtre et changez l'ip par celle identifiée plus haut,
Cela crée une nouvelle entrée et vous pouvez ensuite vous connecter à votre cluster localement
# a tout fin utile vous pourrez récupérer le token avec la commande suivante : ( vous en aurez besoin pour plus tard )
sudo cat /var/lib/rancher/k3s/server/token
Vous êtes opérationnel pour commencer :)
Openshift est l'une des technologies utilisées par le ministère de l'Intérieur.
Vous devrez créer un compte développeur (gratuit)
https://developers.redhat.com/products/openshift-local/overview
Sélection le type d'OS et de processeurs ( ici Arm car MacBook Pro M1) Récupérez le secret (nécessaire pour l'installation )
https://access.redhat.com/documentation/en-us/red_hat_openshift_local/2.12
et ( cf ligne de commande )
https://crc.dev/crc/#introducing_gsg
Lancement de l'installer, puis de l'application 'open shift local' Suivez les demandes (vous devrez spécifier votre secret)
Lancez ensuite l'application et attendez 2-3 minutes que l'ensemble des 'operators' du cluster soit 'up'.
Pour récupérer le mot de passe, lancer 'Open developer terminal' depuis le menu puis exécuter la commande suivante
crc console --credentials
To login as a regular user, run 'oc login -u developer -p developer https://api.crc.testing:6443'.
To login as an admin, run 'oc login -u kubeadmin -p <<VOTRE MOT DE PASSE ICI>> https://api.crc.testing:6443'
Ensuite lancer la console depuis le menu 'openshift' (comme le certificat est autosigné, vous devrez valider plusieures exception de sécurité)
https://console-openshift-console.apps-crc.testing/dashboards
Ensuite vous pouvez également ouvrir votre cluster dans l'application 'Lens'
Vous pouvez visualiser l'état de celui-ci
Vous êtes opérationnel :)
- Pour exposer votre application vers ses usagers ;
- Séparer l'environnement d'exécution du poste de travail du développeur ;
- Travailler en groupe ;
- Attention cela nécessite une souscription.
L'avantage est que vous n'avez pas à gérer votre cluster si à maitriser tous les concepts d'infratructure. Généralement ces services sont disponibles avec des processeurs x86-64 ou AMD-64. Les offre sous processeurs Arm sont généralement assez rare sauf à prendre des Mac 'M1'.
Pour démarrer vous pouvez utiliser des comptes d'évaluation valable quelques mois, l'ensemble des 'hyperscalers' proposent cette option.
TODO : < A FAIRE>
Idem point précédent. C'est l'approche idéale pour se 'faire la main' et comprendre les principes fondamentaux de kubernetes y compris l'approche 'baremetal'.
- Vous considèrerez recycler des anciens serveurs pour vous faire la main, si les disques sont un peu anciens changez les par des versions SSD plus rapide et fiable. Il faut généralement >16 Go de Ram et assurez-vous que les versions récentes des OS linux (debian, ubuntu) contiennent les drivers matériels appropriés pour votre serveur et que le/les processeurs est/sont 64bits. https://www.debian.org/ports/ Il faut idéalement en prévoir 2-3 pour une configuration 'pédagogique'.
- Vous pouvez également monter un cluster à partir de microcomputeurs de type RaspberryPi. Privilégiez des modules à 8 Go de Ram. Ces petits serveurs sont assez performants et surtout ils utilisent des processeurs 'Arm' économe en énergie. ( Ce tutoriel a été réalisé à partir de RaspBerryPi 4 )
# note : si raspeberyPi penser à ajouter cgroup_enable=cpuset cgroup_enable=memory cgroup_memory=1 en fin du fichier /boot/cmdline.txt avec la cmd suivante :
sudo vi /boot/cmdline.txt
#update/upgrade du systeme
sudo apt update && sudo apt -y upgrade
# Pour monter un cluster k3s resistant aux pannes, il est recommandé de
- installer un cluster MariaDB sur 3 noeuds ( nombre impair ) avec réplication.
cf. https://www.atlantic.net/vps-hosting/how-to-install-and-configure-mariadb-galera-cluster-on-ubuntu-18-04/ ( tips : passez les premières étapes afin de gardez la version de mariadb maintenue par la communauté Débian )
- Puis suivre la procédure https://docs.k3s.io/installation (avec la base de donnée mariadb partagée)
mysql -u root -p ( saisissez <<votre-mot-de-passe-root-db>> )
#dans votre base de données >
create database k3s_cluster;
CREATE USER k3s@localhost IDENTIFIED BY <<votre-mot-de-passe-k3s>>;
GRANT ALL PRIVILEGES ON k3s_cluster.* TO k3s@localhost;
FLUSH PRIVILEGES;
<ctrl-c>
# vérifier la réplication des bases de données en vous connectant sur les autres noeuds
mysql -u root -p ( saisissez <<votre-mot-de-passe-root-db>> )
show databases;
show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| k3s_cluster |
| mysql |
| performance_schema |
+--------------------+
4 rows in set (0.001 sec)
SELECT User FROM mysql.user;
+-------------+
| User |
+-------------+
| k3s |
| mariadb.sys |
| mysql |
| root |
+-------------+
4 rows in set (0.004 sec)
#executer la commande suivante sur le premier node :
curl -sfL https://get.k3s.io | sh -s - server \
--datastore-endpoint="mysql://k3s:<<votre-mot-de-passe-k3s>>@tcp(localhost:3306)/k3s_cluster" \
--write-kubeconfig-mode 644
#récuperez le token ( pour que les autres nodes prennent la même clés)
sudo cat /var/lib/rancher/k3s/server/token
curl -sfL https://get.k3s.io | sh -s - server \
--datastore-endpoint="mysql://k3s:oF4Tz6QcY48HHiQx@tcp(localhost:3306)/k3s_cluster" \
--write-kubeconfig-mode 644 \
--token="<<VOTRE-TOKEN_ICI>>"
# installer le client HELM ( packager de kubernetes, lien avec l'installation pour debian)
https://helm.sh/docs/intro/install/#from-apt-debianubuntu
#pensez à taper la ligne de commande suivante
export KUBECONFIG=/etc/rancher/k3s/k3s.yaml
Utilisation de MetalLB pour mettre en place un reverse proxy d'entrée
cf. https://metallb.universe.tf/installation/#installation-with-helm, (load balancing des noeuds via ARP )
helm repo add metallb https://metallb.github.io/metallb
helm repo list
metallb https://metallb.github.io/metallb
# cf voir fichier : metalbl-pool.yaml ( pensez à adapter les IPs à votre configuration )
helm install metallb metallb/metallb -f metalbl-pool.yaml
NAME: metallb
LAST DEPLOYED: Sun Jan 1 21:28:34 2023
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
MetalLB is now running in the cluster.
Now you can configure it via its CRs. Please refer to the metallb official docs
on how to use the CRs.
kubectl apply -f metalbl-pool.yaml
# Pour installer chacun des worker nodes :
# Installer un load balancer sur l'API kubernetes, une option consiste à placer le load-balanceur sur les worker-nodes directement afin d'éviter d'installer un lB externe qu'il faut redonder lui-même etc...
# Sur chaque node installer Nginx (tout autre load balancer https/http fera l'affaire.)
sudo apt-get install nginx
# deployer le fichier nginx.conf ( écoute en local sur le port 6443 )
# tester la connection au master
curl -k https://localhost:6443
{
"kind": "Status",
"apiVersion": "v1",
"metadata": {},
"status": "Failure",
"message": "Unauthorized",
"reason": "Unauthorized",
"code": 401
}
# Deployer le node K3S client ( tips : si RaspberryPi pensez à mettre à jour le fichier /boot/cmdline.txt )
sudo curl -sfL https://get.k3s.io | K3S_URL=http://localhost:6443 \
K3S_TOKEN=<<mynodetoken>>\
sh -
[INFO] Finding release for channel stable
[INFO] Using v1.25.4+k3s1 as release
[INFO] Downloading hash https://github.com/k3s-io/k3s/releases/download/v1.25.4+k3s1/sha256sum-arm64.txt
[INFO] Downloading binary https://github.com/k3s-io/k3s/releases/download/v1.25.4+k3s1/k3s-arm64
[INFO] Verifying binary download
[INFO] Installing k3s to /usr/local/bin/k3s
[INFO] Skipping installation of SELinux RPM
[INFO] Creating /usr/local/bin/kubectl symlink to k3s
[INFO] Creating /usr/local/bin/crictl symlink to k3s
[INFO] Creating /usr/local/bin/ctr symlink to k3s
[INFO] Creating killall script /usr/local/bin/k3s-killall.sh
[INFO] Creating uninstall script /usr/local/bin/k3s-agent-uninstall.sh
[INFO] env: Creating environment file /etc/systemd/system/k3s-agent.service.env
[INFO] systemd: Creating service file /etc/systemd/system/k3s-agent.service
[INFO] systemd: Enabling k3s-agent unit
Created symlink /etc/systemd/system/multi-user.target.wants/k3s-agent.service → /etc/systemd/system/k3s-agent.service.
[INFO] systemd: Starting k3s-agent
# Vérifier votre cluster: ( ici 3 nodes master + 3 agents)
# à faire si erreur : The connection to the server localhost:8080 was refused ...
export KUBECONFIG=/etc/rancher/k3s/k3s.yaml
kubectl get nodes --sort-by=.metadata.name -o wide # classé par nom
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
node0 Ready control-plane,master 34h v1.25.4+k3s1 192.168.150.21 <none> Debian GNU/Linux 11 (bullseye) 5.15.76-v8+ containerd://1.6.8-k3s1
node1 Ready control-plane,master 34h v1.25.4+k3s1 192.168.150.22 <none> Debian GNU/Linux 11 (bullseye) 5.15.76-v8+ containerd://1.6.8-k3s1
node2 Ready control-plane,master 34h v1.25.4+k3s1 192.168.150.23 <none> Debian GNU/Linux 11 (bullseye) 5.15.76-v8+ containerd://1.6.8-k3s1
node3 Ready <none> 40m v1.25.4+k3s1 192.168.150.24 <none> Debian GNU/Linux 11 (bullseye) 5.15.76-v8+ containerd://1.6.8-k3s1
node4 Ready <none> 22m v1.25.4+k3s1 192.168.150.25 <none> Debian GNU/Linux 11 (bullseye) 5.15.76-v8+ containerd://1.6.8-k3s1
node5 Ready <none> 21m v1.25.4+k3s1 192.168.150.26 <none> Debian GNU/Linux 11 (bullseye) 5.15.76-v8+ containerd://1.6.8-k3s1
# Vérifier que les nodes répondent aux requêtes (à faire sur tout les nodes );
curl -k https://<<IP-D'UN-NODE>>
404 page not found # veux dire que le node réponds
Uninstalling
If you installed K3s with the help of the install.sh script, an uninstall script is generated during installation.
The script is created on your node at /usr/local/bin/k3s-uninstall.sh (or as /usr/local/bin/k3s-agent-uninstall.sh).
TODO : ajouter prometheus et configuration du metalLB