Premier pas dans Kubernetes avec Minikube

Renaud Chardin
5 min readJan 20, 2021

--

Introduction

Tout le monde (ou presque) a maintenant entendu parler de Kubernetes, et passer à la pratique est toujours plus intéressant. Nous allons créer ici quatre objets de base : le pod, le déploiement, le service et l’Ingress Controller. Ceux-ci vont nous permettre d’exécuter et d’exposer un conteneur sur notre machine.

Installation

Pour cet article, nous allons utiliser Minikube, un outil permettant de créer un cluster Kubernetes à un nœud unique dans une machine virtuelle sur notre machine. Et nous allons également avoir besoin d’installer un hyperviseur pour faire fonctionner Minikube.

MacOs

HyperKit

brew install hyperkit

Kubectl

brew install kubectl

Minikube

brew install minikube

Windows

Tout comme Homebrew sous MacOs, il existe des outils pour installer facilement des applications sous Windows, j’utilise personnellement scoop

Scoop

  1. Ouvrez une console PowerShell en tant qu’administrateur
  2. Exécutez la commande suivante :
Invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://get.scoop.sh')

En cas d’erreur exécutez la commande :

Set-ExecutionPolicy RemoteSigned -scope CurrentUser

Hyper-V

  1. Ouvrez une console PowerShell en tant qu’administrateur
  2. Exécutez la commande suivante :
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All

Kubectl

scoop install kubectl

Minikube

scoop install minikube

Utilisation

Normalement maintenant tout est correctement installé et nous sommes prêts à jouer avec Kubernetes. Commençons par démarrer Minikube, cela peut être un peu long, le temps de configurer et de démarrer la machine virtuelle.

minikube start

Afin de pouvoir exposer plus tard nos conteneurs, il faut activer le plugin Ingress de Minikube en exécutant la commande

minikube addons enable ingress

Minikube est fourni avec un dashboard web qui permet de voir visuellement l’état de Kubernetes :

minikube dashboard 
🤔 Verifying dashboard health ...
🚀 Launching proxy ...
🤔 Verifying proxy health ...
🎉 Opening http://127.0.0.1:62252/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/ in your default browser...

Le Pod

Le Pod est l’unité la plus fine de Kubernetes permettant de gérer un ou plusieurs conteneurs. Ci-après un exemple de la configuration d’un pod avec deux conteneurs

Nous avons défini un pod nommé basic-pod, avec le label app: nginx, constitué de deux conteneurs : nginx et fluentd. Nous avons également associé le port 8080 de nginx au port 80 de notre pod. Cela signifie que tous les appels faits sur le port 80 de notre pod seront transmis au port 8080 du conteneur nginx.

kubectl apply -f pod.yml 
pod/basic-pod created

On peut ensuite récupérer le pod que l’on vient de créer avec cette commande :

kubectl get pods
NAME READY STATUS RESTARTS AGE
sfeir-lunch 2/2 Running 0 6s

Deployment

Un déploiement (en français) fournit des mises à jour déclaratives pour des Pods.

Pour simplifier, un déploiement permet de décrire un état désiré et le contrôleur de déploiement change de l’état réel à l’état souhaité à un rythme contrôlé. Par exemple, si je souhaite avoir au minimum trois instances d’un pod, je déclare dans mon déploiement que je souhaite trois réplicas, et le contrôleur de déploiement se charge de déployer et d’exécuter un minimum de trois instances, et en redémarre de nouvelles en cas de crash.

Comme précédemment dans la configuration du pod, on définit notre conteneur nginx (cette fois-ci dans la partie template) et on dit à notre déploiement : tu dois manager tout les pods ayant le label app: basic-deploy.

kubectl apply -f deployment.yml 
deployment.apps/basic-deploy created

Pour récupérer notre déploiement :

kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
basic-deploy 3/3 3 3 62s
kubectl get pod -l app=basic-deploy
NAME READY STATUS RESTARTS AGE
basic-deploy-66fcbb5fc9-5x7pj 1/1 Running 0 16s
basic-deploy-66fcbb5fc9-qrp4p 1/1 Running 0 16s
basic-deploy-66fcbb5fc9-wfzw7 1/1 Running 0 16s

On voit bien que notre déploiement a créé trois pods correspondant aux spécifications fournies. Vous pouvez tester la suppression d’un pod, le contrôleur de déploiement va détecter que la définition de trois réplicas n’est plus valide et va démarrer un nouveau pod depuis le template de du déploiement.

kubectl delete pods basic-deploy-66fcbb5fc9-5x7pj
pod "basic-deploy-66fcbb5fc9-5x7pj" deleted
kubectl get pod -l app=basic-deploy
NAME READY STATUS RESTARTS AGE
basic-deploy-66fcbb5fc9-db6cr 1/1 Running 0 12s
basic-deploy-66fcbb5fc9-qrp4p 1/1 Running 0 6m26s
basic-deploy-66fcbb5fc9-wfzw7 1/1 Running 0 6m26s

Service

Un service est une manière abstraite d’exposer une application s’exécutant sur un ensemble de Pods en tant que service réseau. Un Pod est transient, si vous utilisez un déploiement pour exécuter votre application, il peut créer et détruire dynamiquement des pods. Le service permet ainsi d’exposer notre application depuis un point d’entrée unique avec une ip fixe tant qu’il n’est pas supprimé. Kubernetes se charge également de faire un équilibrage de la charge entre les instances de pod reliées au service.

kubectl apply -f service.yml
service/basic-service created

Puis pour voir votre service

kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
basic-service ClusterIP 10.96.126.231 <none> 80/TCP 19s

Si vous voulez vérifier que votre service fonctionne correctement, vous pouvez vous connecter à votre vm via la commande “minikube ssh”, puis ensuite exécuter un curl sur l’ip que vous obtenez lorsque vous avez récupéré les informations du service dans la commande précédente. Vous devriez voir apparaitre dans la console l’HTML correspondant à la “Welcome Page” de nginx

$ curl 10.96.126.231
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>

Ingress

Un Ingress est un objet Kubernetes qui gère l’accès externe aux services dans un cluster, généralement du trafic HTTP.
Pour reprendre ce que l’on a fait précédemment, on exécute notre application dans des pods via un déploiement, puis nous avons exposé notre application via un service au niveau du cluster. Mais tout cela reste à l’intérieur du cluster et ce n’est pas très “user friendly”. Pour remédier à cela on va utiliser un Ingress Controller

kubectl apply -f ingress.yml 
ingress.networking.k8s.io/basic-ingress created
kubectl get ingresses
NAME HOSTS ADDRESS PORTS AGE
basic-ingress basic-ingress.com 192.168.64.6 80 28s

Et maintenant on veut voir si tout cela a fonctionné, pour ça il y a une petite astuce, vous pouvez modifier votre etc/hosts (fonctionne sous tout les environnements) et ajouter la ligne :

  • 192.168.64.6 basic-ingress.com

Victoire 🎉🎉

Conclusion

A l’aide de Minikube, nous avons pu faire nos premier pas avec Kubernetes en découvrant quatre ressources: le pod, le déploiement, le service et l’Ingress. Cependant il y en a bien d’autres et celles-ci peuvent être bien plus configurées, mais ces exemples basiques nous ont permis d’exécuter et d’exposer très simplement une application et nous mettent l’eau à la bouche pour explorer encore plus loin les possibilités de Kubernetes.

--

--

Renaud Chardin

Software Engineer & Team Leader @ SFEIRLuxembourg | Certified Kubernetes Application Developer