Minikube est habituellement utilisé sur un ordinateur de type bureautique afin d'essayer Kubernetes ou pour vos besoins de développement.
Rappelons rapidement que Minikube est un outil facilitant l’exécution locale de Kubernetes. Il exécute un cluster Kubernetes à nœud unique dans une machine virtuelle (VM).
Il prend en charge les fonctionnalités Kubernetes suivantes:
- DNS
- NodePorts
- ConfigMaps et Secrets
- Dashboards
- Container Runtime: Docker, CRI-O, et containerd
- Activation de la CNI (Container Network Interface)
- Ingress
Dans le cadre de ce tutoriel, nous allons donc installer Minikube mais également Docker dans leurs versions ARM64.
Ce tutoriel est réalisé avec :
- Un Raspberry 4 avec 8GB de mémoire,
- Ubuntu 20.04 ARM64.
Pour les connaisseurs, nous allons initialiser Minikube
avec le driver none.
K3S reste une très bonne alternative si vous souhaitez essayer Kubernetes sur votre Raspberry.
À date ( début Août 2020 ), le support Minikube sur ARM64 n'en est qu'à ses débuts. J'ai rencontré certaines difficultés/impossibilités d'utiliser certaines méthodes d'installation ( driver Docker ou KVM2 par exemple ou même CRI-O ).
Docker
Il s'agit d'un pré-requis dans le cadre de l'utilisation du driver none
. Aucune difficulté dans cette installation :
$ sudo apt update
$ sudo apt upgrade -y
$ curl -fsSL test.docker.com -o get-docker.sh && sh get-docker.sh
Enfin je vais ajouter mon compte au groupe docker
afin de me passer de sudo
:
$ sudo usermod -aG docker $USER
Validons juste le fonctionnement :
$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
256ab8fe8778: Pull complete
Digest: sha256:49a1c8800c94df04e9658809b006fd8a686cab8028d33cfba2cc049724254202
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(arm64v8)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
Aucune difficulté dans cette installation ! 😃 Nous allons donc pouvoir passer à Minikube !
Minikube
Je vais utiliser le téléchargement direct pour récupérer le binaire :
$ curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-arm64 \
&& chmod +x minikube
Enfin je vais le déplacer dans mon dossier /usr/local/bin
:
$ sudo mv minikube /usr/local/bin/
Si vous essayez de lancer l'exécutable ... :
$ sudo minikube start --driver=none
😄 minikube v1.12.1 on Ubuntu 20.04 (arm64)
✨ Using the none driver based on user configuration
💣 Sorry, Kubernetes 1.18.3 requires conntrack to be installed in root's path
On va donc installer conntrack
:
$ sudo apt install conntrack -y
On recommence :
$ sudo minikube start --driver=none
....
stderr:
W0804 19:34:40.033301 34934 configset.go:202] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
[WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/
[WARNING FileExisting-socat]: socat not found in system path
[WARNING Service-Kubelet]: kubelet service is not enabled, please run 'systemctl enable kubelet.service'
error execution phase preflight: [preflight] Some fatal errors occurred:
[ERROR SystemVerification]: missing cgroups: memory
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
To see the stack trace of this error execute with --v=5 or higher
Cette fois l'erreur arrive bien plus tard : missing cgroups: memory
Le support cgroup
pour le contrôleur de ressource mémoire n'est pas activé, sauf qu'il est nécessaire pour Kubernetes !
Il faut donc l'activer sur Ubuntu. Pour cela je vais modifier le fichier /boot/firmware/cmdline.txt
afin d'y ajouter les éléments suivants :
cgroup_enable=cpuset cgroup_enable=memory cgroup_memory=1
Il faut redémarrer afin de prendre en compte les modifications :
$ sudo reboot
Une fois votre appareil redémarré, on essaye de nouveau :
$ sudo minikube start --driver=none
😄 minikube v1.12.1 on Ubuntu 20.04 (arm64)
✨ Using the none driver based on existing profile
👍 Starting control plane node minikube in cluster minikube
🔄 Restarting existing none bare metal machine for "minikube" ...
ℹ️ OS release is Ubuntu 20.04.1 LTS
🐳 Preparing Kubernetes v1.18.3 on Docker 19.03.13-beta2 ...
▪ kubelet.resolv-conf=/run/systemd/resolve/resolv.conf
🤹 Configuring local host environment ...
❗ The 'none' driver is designed for experts who need to integrate with an existing VM
💡 Most users should use the newer 'docker' driver instead, which does not require root!
📘 For more information, see: https://minikube.sigs.k8s.io/docs/reference/drivers/none/
❗ kubectl and minikube configuration will be stored in /root
❗ To use kubectl or minikube commands as your own user, you may need to relocate them. For example, to overwrite your own settings, run:
▪ sudo mv /root/.kube /root/.minikube $HOME
▪ sudo chown -R $USER $HOME/.kube $HOME/.minikube
💡 This can also be done automatically by setting the env var CHANGE_MINIKUBE_NONE_USER=true
🔎 Verifying Kubernetes components...
🌟 Enabled addons: default-storageclass, storage-provisioner
🏄 Done! kubectl is now configured to use "minikube"
💗 Kubectl not found in your path
👉 You can use kubectl inside minikube. For more information, visit https://minikube.sigs.k8s.io/docs/handbook/kubectl/
💡 For best results, install kubectl: https://kubernetes.io/docs/tasks/tools/install-kubectl/
Voila votre installation de Minikube est terminée et il ne reste plus qu'à l'essayer !
Exemple
Je vais commencer par installer kubectl
:
$ curl -LO "https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/arm64/kubectl"
On rend le binaire exécutable :
$ chmod +x ./kubectl
Et je le déplace dans /usr/local/bin
:
sudo mv kubectl /usr/local/bin/kubectl
Vous pouvez valider le fonctionnement :
$ kubectl version --clientClient Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.6", GitCommit:"dff82dc0de47299ab66c83c626e08b245ab19037", GitTreeState:"clean", BuildDate:"2020-07-15T16:58:53Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/arm64"}
Pour essayer votre cluster, vous pouvez déployer l'image suivante :
$ sudo kubectl create deployment whoami --image=containous/whoami
deployment.apps/whoami created
Enfin on expose le service :
$ sudo kubectl expose deployment whoami --type=LoadBalancer --port=80
service/whoami exposed
Et on récupère l'accès :
$ sudo minikube service whoami
|-----------|--------|-------------|----------------------------|
| NAMESPACE | NAME | TARGET PORT | URL |
|-----------|--------|-------------|----------------------------|
| default | whoami | 80 | http://192.168.1.160:32190 |
|-----------|--------|-------------|----------------------------|
🎉 Opening service default/whoami in default browser...
👉 http://192.168.1.160:32190
Et voila :
$ curl http://192.168.1.160:32190
Hostname: whoami-589c447684-4lzs2
IP: 127.0.0.1
IP: 172.17.0.3
RemoteAddr: 172.17.0.1:2346
GET / HTTP/1.1
Host: 192.168.1.160:32190
User-Agent: curl/7.68.0
Accept: */*
Pourquoi ne pas utiliser l'image hello-node présente dans les documentations Minikube ? Celle-ci n'est pas encore compatible ARM
!
Nous venons donc de voir comment installer Minikube sur votre Raspberry 4 ( cette méthodologie doit également fonctionner sur un modèle 3B installé en ARM64 ) et même Docker
en bonus ! 😂
Nous avons pu également valider le bon fonctionnement de notre installation avec un déploiement très basique !
Prochaine étape, installer Podman
sur le Raspberry et s'en servir comme driver pour Minikube !
N'hésitez pas à permettre au blog de continuer à exister et à fournir un contenu de qualité - enfin je l'espère - au travers de vos dons sur : buymeacoff.ee/lfache
Et n'hésitez pas à m'apporter des remarques ou des commentaires sur Twitter, ou ici 👇