Le but de cette série de billets est de montrer comment on peut simplement, facilement et gratuitement (à partir du moment ou vous avez un ordinateur suffisamment performant pour développer) faire du kubernetes et déployer des applications conteneurisées. Et concernant ces dernières, je montrerai en quoi Quarkus est le candidat idéal (A Kubernetes Native Java stack).
J’ai choisi pour cela de vous présenter dans cet article un outil qui est Microk8s, développé par les équipes de Canonical (Ubuntu). Il existe d’autres alternatives comme minikube, minishift, docker desktop mais je vais focus sur Microk8s qui me semble intéressant à découvrir et à utiliser.
MicroK8s is a CNCF (Cloud Native Computing Foundation) certified upstream Kubernetes deployment that runs entirely on your workstation or edge device
Nous avons bien là un « vrai » k8s et nous allons voir comment l’installer, le configurer et l’utiliser sans avoir spécialement de compétences Ops. C’est pour cela que cet outil est présenté comme Low-ops.
Cette article est tiré d’un apéro-code (webinar) que j’ai réalisé pour Sedona, et au cours duquel j’installe Microk8s en live en quelques minutes puis je déploie une application Quarkus « hello world! », également en quelques minutes. Vous pouvez trouver la vidéo sur la chaine youtube de Sedona, et le code source sur mon github. Le code source est plus élaboré que le « hello world » du webinar afin d’aller plus loin qu’un petit live coding et de montrer que Quarkus et Microk8s nous permettent de faire des choses avancées tout en restant simple et facile d’approche.
Single-node cluster
Installation de Microk8s
Commençons par installer Microk8s! Je travaille sur un macOS Big Sur 11.2.3. Mais vous pouvez aussi l’installer sur du Windows ou du Linux. Dans le cas d’une installation sur un macOS, Microk8S conseille d’avoir au minimum 4GB de RAM et 40GB de disque dur de disponible.
Tout d’abord téléchargeons l’installateur Microk8s à l’aide de homebrew, le gestionnaire de paquet pour macOS
1
$brew install ubuntu/microk8s/microk8s
Une fois installé, lançons à présent l’installation d’un Microk8s simplement à l’aide de la commande suivante (vous devez accepter d’installer Multipass, le gestionnaire de VMs ubuntu, nous reviendrons sur ce composant un peu plus tard dans l’article)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$microk8s install
Support for'multipass'needs tobe set up.Would you like todothat it now?[y/N]:y
microk8s-integrator-macos0.1from Joe Borg(joeborg)installed
MicroK8s isup andrunning.See the available commands with`microk8s--help`.
A présent, vérifions que Microk8s est bien installé comme suit
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
$microk8s status
microk8s isrunning
high-availability:no
datastore master nodes:127.0.0.1:19001
datastore standby nodes:none
addons:
enabled:
ha-cluster# Configure high availability on the current node
disabled:
ambassador# Ambassador API Gateway and Ingress
cilium# SDN, fast with full network policy
dashboard# The Kubernetes dashboard
dns# CoreDNS
fluentd# Elasticsearch-Fluentd-Kibana logging and monitoring
gpu# Automatic enablement of Nvidia CUDA
helm# Helm 2 - the package manager for Kubernetes
helm3# Helm 3 - Kubernetes package manager
host-access# Allow Pods connecting to Host services smoothly
ingress# Ingress controller for external access
istio# Core Istio service mesh services
jaeger# Kubernetes Jaeger operator with its simple config
keda# Kubernetes-based Event Driven Autoscaling
knative# The Knative framework on Kubernetes.
kubeflow# Kubeflow for easy ML deployments
linkerd# Linkerd is a service mesh for Kubernetes and other frameworks
metallb# Loadbalancer for your Kubernetes cluster
metrics-server# K8s Metrics Server for API access to service metrics
multus# Multus CNI enables attaching multiple network interfaces to pods
portainer# Portainer UI for your Kubernetes cluster
prometheus# Prometheus operator for monitoring and logging
rbac# Role-Based Access Control for authorisation
registry# Private image registry exposed on localhost:32000
storage# Storage class; allocates storage from host directory
traefik# traefik Ingress controller for external access
Comme vous pouvez le constater Microk8s est bien installé et démarré en mode single-node.
Add-ons
Vous pouvez voir aussi dans les logs de la console que Microk8s amène une notion de add-ons, ci-dessus vous pouvez voir ceux qui sont activés ou non. En somme je peux rajouter des composants (add-ons) qui me seront nécessaires très simplement (loggins, monitoring, rbac, knative…). Pour les besoins de mon projet de démonstration je vais avoir besoin de :
Ingress : Accéder à k8s depuis l’extérieur du cluster
Storage : Profiter de d’un volume persistant
Dashboard : Le dashboard standard de k8s
Dns : Résolution des adresses de services
Istio : Pouvoir profiter d’un service mesh (cela concernera un prochain article dédié à Istio)
Donc pour activer les add-ons nécessaires il suffit simplement de lancer la ligne de commande suivante :
1
$microk8s enable ingress storage dashboard dns istio
Clean up
Pour désactiver les add-ons on lance simplement
1
$microk8s uninstall add-on1 add-on2...
Et si vous voulez désinstaller tout microk8s proprement, vous pouvez juste jouer
1
2
$microk8s uninstall
Thank you forusing MicroK8s!
Dashboard k8s
Revenons à notre précédente installation de Microk8s et vérifions que nous avons bien accès à la console k8s et que tout est proprement déployé et fonctionnel, nous allons démarrer le dashboard k8s pour cela de la façon suivante
1
2
3
4
5
6
$microk8s dashboard-proxy
Checking ifDashboard isrunning.
Dashboard will be available at https://192.168.64.2:10443
Ouvrons un Firefox (avec chrome impossible d’ouvrir le site considéré comme non sécurisé) et allons sur l’url https://192.168.64.2:10443 comme indiqué en sortie de console, nous arrivons donc sur la page de login du Dashboard
Vous avez deux possibilités pour vous connecter à la console k8s, par token ou grâce à un fichier de configuration de kubectl (le cli k8s) dit kubeconfig.
Si on se connecte par token, celui-ci est fournit après avoir lancé le Dashboard dans les logs de la console, copier-coller ce token dans la console et connectez-vous.
Sinon vous pouvez choisir de vous connecter à l’aide de kubeconfig, il faut pour cela que vous ayez précédemment joué la ligne de commande suivante qui a pour effet de configurer et de pouvoir se servir du cli k8s local (kubectl)
Ensuite il ne vous reste plus qu’à sélectionner le bon fichier de config qui se trouve dans le répertoire local $HOME/.kube/config
Après vous être connecté par la méthode que vous préférez, le Dashboard se lance et nous voyons ci-dessous
Notre kube est donc bien démarré et fonctionnel.
Namespace
Nous allons donc commencer par créer un namespace pour accueillir notre future application Quarkus (nous pourrions ne pas le faire et déployer dans le namespace par défaut de k8s mais ce n’est pas la bonne façon de faire, il est préférable de bien cloisonner ses projets même pour des tests)
1
2
$kubectl create ns quarkus-apero-code
namespace/quarkus-apero-code created
OK! Notre kube est prêt pour accueillir notre solution basée sur Quarkus! Chose que nous verrons lors du prochain article.
Multipass
Petite précision sur les VMs utilisées pour déployer Microk8s, on s’appuie sur Multipass (qui s’appuie sur HyperKit sous macOS, il est installé lors de l’installation de Microk8s comme évoqué précédemment), ce sont des VMs Ubuntu (encore des outils Canonical :)).
Vous avez la possibilité d’accéder à vos VMs très simplement, voyons ce qui a été installé comme VM en affichant la liste des VMs instanciées
1
2
3
4
$multipass ls
Name State IPv4 Image
microk8s-vm Running192.168.64.2Ubuntu18.04LTS
10.1.254.6
Nous avons donc une VM Ubuntu/Microk8s qui tourne, nous pouvons y accéder à l’aide de la commande suivante
Vous pouvez donc travailler directement très facilement dans la VM si le besoin s’en fait sentir.
Multi-node cluster
Pour aller plus loin avec Microk8s, l’outil nous offre la possibilité de mettre en place un cluster multi-node et ainsi faire de la haute disponibilité, activée par défaut mais réellement opérationnelle seulement lorsque au moins 3 noeuds sont activés. Pour ajouter un noeud au master c’est très simple
1
$microk8s add-node
Installation des noeuds
Faisons l’exercice, pour cela je vais m’appuyer sur Multipass, évoqué précédemment dans le billet, je vais donc créer 3 VMs et installer Microk8s dessus et enfin je finirai par relier ces 3 noeuds.
1
2
3
4
5
6
$multipass launch--name master-m2G
Launched:master
$multipass launch--name worker1-m2G
Launched:worker1
$multipass launch--name worker2-m2G
Launched:worker2
J’ai donc créé 3 VMs, une master, et deux workers (worker1 et worker2). A présent il faut donc installer Microk8s sur chacune d’entre elle. Commençons par le master
clusterrole.rbac.authorization.k8s.io/coredns created
clusterrolebinding.rbac.authorization.k8s.io/coredns created
Restarting kubelet
DNS isenabled
Enabling defaultstorage class
deployment.apps/hostpath-provisioner created
storageclass.storage.k8s.io/microk8s-hostpath created
serviceaccount/microk8s-hostpath created
clusterrole.rbac.authorization.k8s.io/microk8s-hostpath created
clusterrolebinding.rbac.authorization.k8s.io/microk8s-hostpath created
Storage will be available soon
Notre premier noeud master est fin prêt, à présent ajoutons lui les deux noeuds précédemment créés. Il faut pour cela avoir installer Microk8s sur chacun d’entre eux et configurer les droits de l’utilisateur ubuntu sur chaque VM
Comme indiqué dans les logs en sortie de console, il faut lancer la commande microk8s join 192.168.64.7:25000/8c29567553a20d20b6c10fd3b487b0f6 sur le noeud worker1.
ha-cluster# Configure high availability on the current node
storage# Storage class; allocates storage from host directory
disabled:
...
Vous pouvez noter que nous avons bien trois noeuds et que la HA est activée. Je peux donc aussi lancer une commande kubectl pour voir l’état de mes noeuds
1
2
3
4
5
ubuntu@master:~$kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready<none>26mv1.20.4-34+1ae8c29bbb48f7
worker1 Ready<none>18mv1.20.4-34+1ae8c29bbb48f7
worker2 Ready<none>100sv1.20.4-34+1ae8c29bbb48f7
Vous pouvez installer des add-ons supplémentaires selon votre choix vous pouvez aussi faire du « logging, monitoring and alerting » à l’aide de Elastic, prometheus et alert manager et d’autres encore.
Mount volume
Vous voilà en passe d’utiliser un cluster de k8s de trois noeuds. Cependant il nous manque une chose pour se faciliter la vie, vous pourriez avoir besoin de partager des fichiers entre votre hôte et vos machines virtuelles. Nous allons donc avec Multipass pouvoir monter un répertoire local (celui contenant les fichiers de déploiement k8s) sur notre VM de la manière suivante
Tosee these additional updates run:apt list--upgradable
Last login:Tue Mar1614:02:142021from192.168.64.1
ubuntu@master:~$cd/microk8s/
ubuntu@master:/microk8s$ll
total32
drwxr-xr-x1ubuntu ubuntu192Feb2116:46./
drwxr-xr-x21root root4096Mar1614:54../
-rw-r--r--1ubuntu ubuntu9675Feb2116:46README.md
drwxr-xr-x1ubuntu ubuntu96Oct2714:37db/
drwxr-xr-x1ubuntu ubuntu320Nov1117:00istio/
drwxr-xr-x1ubuntu ubuntu224Oct3114:25k8s/
Le répertoire ~/dev/git/sedona/apero-code/mk8s-quarkus-ac/microk8s/ est donc partagé en votre host et votre VM, vous pouvez voir les fichiers du host sur la VM dans le répertoire /microk8s. A présent vous pouvez lancer des commandes kubectl local avec des fichiers de déploiements locaux ou bien lancer des commandes kubectl sur la VM avec les fichiers dans le répertoire /microk8s.
Unmount volume
Pour supprimer le montage vous pouvez simplement jouer
1
$multipass unmount master
Dashboard k8s
Autre point, vous avez remarqué que pour installer un cluster multi-node je suis passé directement par Multipass et non l’installateur Microk8s. Du coup je n’ai pas accès à la commande locale microk8s depuis mon macOS pour lancer le dashboard.
Voici la solution, premièrement activons le dashboard sur le noeud master
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
ubuntu@master:~$microk8s enable dashboard
Enabling Kubernetes Dashboard
Addon metrics-server isalready enabled.
Applying manifest
serviceaccount/kubernetes-dashboard created
service/kubernetes-dashboard created
secret/kubernetes-dashboard-certs created
secret/kubernetes-dashboard-csrf created
secret/kubernetes-dashboard-key-holder created
configmap/kubernetes-dashboard-settings created
role.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrole.rbac.authorization.k8s.io/kubernetes-dashboard created
rolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
deployment.apps/kubernetes-dashboard created
service/dashboard-metrics-scraper created
deployment.apps/dashboard-metrics-scraper created
IfRBAC isnotenabled access the dashboard using the defaulttoken retrieved with:
token=$(microk8s kubectl-nkube-system get secret|grep default-token|cut-d" "-f1)
Vérifions que le dashboard est bien opérationnel et si oui nous allons vouloir y accéder depuis notre machine de travail, nous allons pour cela ouvrir un accès sur l’api server à l’aide de la commande kubectl proxy comme suit
Nous avons donc démarré un proxy sur notre Kube, à présent nous pouvons donc accéder au k8s api server depuis l’IP de la VM qui est comme nous le voyons ci-dessus 192.168.64.7 sur le port 8001. Vérifions que le dashboard est bien accessible à l’adresse http://192.168.64.7:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/ (voir ici pour plus de détails)
Nous voyons bien l’interface de connexion, nous allons à présent nous donner les moyens de se connecter au dashboard sans token de connexion, pour cela connectons nous sur la VM du master et ouvrons le fichier de déploiement de k8s comme suit
Dans le fichier qui est édité nous allons rajouter un paramètre pour passer l’étape du login, enable-skip-login
1
2
3
4
5
6
7
8
9
10
11
12
13
14
...
template:
metadata:
creationTimestamp:null
labels:
k8s-app:kubernetes-dashboard
spec:
containers:
-args:
---auto-generate-certificates
---namespace=kube-system
---enable-skip-login
image:kubernetesui/dashboard:v2.0.0
...
Rechargeons notre page de login et nous apercevons que « Passer », ou « Skip » en anglais, apparait à côté du bouton de connexion
Cliquons dessus… Nous arrivons bien sur le Dashboard
Nous voyons bien nos trois noeuds k8s précédemment créés
Configuration kubectl
A présent, il ne nous reste plus qu’à configurer notre kubectl local (que vous devez avoir installé au préalable, voir ici) pour pouvoir gérer notre cluster directement depuis notre macOS sans se connecter sur les VMs. Nous allons pour cela récupérer la config k8s de notre master et la copier dans notre fichier de configuration local de notre macOS à l’aide des commandes suivantes
$multipass transfer master:/home/ubuntu/.kube/config.
# et on l'ajoute à notre config local kube
$cat config>$HOME/.kube/config
# A présent on peut supprimer le fichier télécharger
$rm config
Vérifions que notre configuration est fonctionnelle
1
2
3
4
5
$kubectl get nodes
NAME STATUS ROLES AGE VERSION
worker1 Ready<none>71mv1.20.4-34+1ae8c29bbb48f7
worker2 Ready<none>66mv1.20.4-34+1ae8c29bbb48f7
master Ready<none>82mv1.20.4-34+1ae8c29bbb48f7
Créons le namespace qui servira à accueillir notre future application Quarkus
1
2
$kubectl create ns quarkus-apero-code
namespace/quarkus-apero-code created
Clean up
Si vous voulez supprimer proprement les VMs précédemment créer, c’est encore une fois simple, lancer la ligne de commande suivante
1
2
3
4
5
6
7
8
9
$multipass delete master worker1 worker2
$multipass ls
Name State IPv4 Image
master Deleted--NotAvailable
worker1 Deleted--NotAvailable
worker2 Deleted--NotAvailable
$multipass purge
$multipass ls
No instances found.
And voilà!
A présent vous êtes en capacité de travailler sur un k8s léger en mode single-node ou, si vous voulez aller plus loin, monter un cluster multi-node.
Note : ce que nous venons d’installer et configurer n’est pas destiné à de la production, ce qui est montré dans cet article est uniquement à but pédagogique afin de pouvoir travailler avec un « vrai » k8s pour monter en compétence, faire des POCs, de la CI/CD ou tout simplement travailler rapidement sur votre poste de travail.
Dans le prochain article nous verrons pourquoi Quarkus est en titre de cette série d’article, nous verrons donc comment déployer une solution Quarkus dans un k8s grâce aux extensions et de voir comment la simplicité se poursuit dans l’utilisation et le déploiement d’applications conteneurisées dans notre Microk8s. To be continued..