Besoin de prototyper pour concevoir son écosystème de production, en appréhender les différentes problématiques et éviter les embuches ? Tournons-nous pour cela vers Minikube 1 ! Écosystème local, facile à maîtriser, paramétrer, la plupart des sujets pourront y être abordés : services, ingress, monitoring, pv,…

Minikube

Pour une distribution basée sur Debian, on peut directement installer le .deb à télécharger :

$ curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube_latest_amd64.deb
$ sudo dpkg -i minikube_latest_amd64.deb

Une fois l’installation terminée, le cluster pourra être démarré. Une multitude d’options sont disponibles, dont une assez pratique qui vous évitera de tourner en bourrique.

$ minikube start --disk-size 5g
😄  minikube v1.29.0 on Ubuntu 20.04
✨  Automatically selected the docker driver. Other choices: qemu2, ssh
📌  Using Docker driver with root privileges
👍  Starting control plane node minikube in cluster minikube
🚜  Pulling base image ...
💾  Downloading Kubernetes v1.26.1 preload ...
    > preloaded-images-k8s-v18-v1...:  397.05 MiB / 397.05 MiB  100.00% 2.95 Mi
🔥  Creating docker container (CPUs=X, Memory=XXXXMB) ...
🐳  Preparing Kubernetes v1.26.1 on Docker 20.10.23 ...
    ▪️ Generating certificates and keys ...
    ▪️ Booting up control plane ...
    ▪️ Configuring RBAC rules ...
🔗  Configuring bridge CNI (Container Networking Interface) ...
    ▪️ Using image gcr.io/k8s-minikube/storage-provisioner:v5
🔎  Verifying Kubernetes components...
🌟  Enabled addons: storage-provisioner, default-storageclass

❗️  /usr/local/bin/kubectl is version 1.24.2, which may have incompatibilities with Kubernetes 1.26.1.
    ▪️ Want kubectl v1.26.1? Try 'minikube kubectl -- get pods -A'
🏄  Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default

disk-size ici spécifie l’espace mémoire disque alloué à la machine virtuelle Minikube, et ne pas l’autoriser à vous en réquisitionner davantage.

Si la rigueur vous empoigne fortement, on peut alors conseiller de supprimer toutes les configurations en cours d’exploitation, de faire place nette et ainsi (re)partir sur une page blanche.

$ minikube delete --all --purge
🔥  Successfully deleted all profiles
💀  Successfully purged minikube directory located at - [/home/antoine/.minikube]
📌  Kicbase images have not been deleted. To delete images run:
    ▪️ docker rmi gcr.io/k8s-minikube/kicbase:v0.0.37 gcr.io/k8s-minikube/kicbase:v0.0.27

Et pour vérifer le tout, regardons le statut !

$ minikube status
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured

Addons

Certaines fonctionnalités sont à activer une fois le démarrage amorcé. C’est le cas de l’ingress controller par exemple, pour déployer un service HTTP. Listons les tous, pour avoir une vue d’ensemble.

$ minikube addons list
|-----------------------------|----------|--------------|--------------------------------|
|         ADDON NAME          | PROFILE  |    STATUS    |           MAINTAINER           |
|-----------------------------|----------|--------------|--------------------------------|

[...]

| helm-tiller                 | minikube | disabled     | 3rd party (Helm)               |
| inaccel                     | minikube | disabled     | 3rd party (InAccel             |
|                             |          |              | [info@inaccel.com])            |
| ingress                     | minikube | disabled     | Kubernetes                     |
| ingress-dns                 | minikube | disabled     | Google                         |

[...]

| registry-creds              | minikube | disabled     | 3rd party (UPMC Enterprises)   |
| storage-provisioner         | minikube | disabled     | Google                         |
| storage-provisioner-gluster | minikube | disabled     | 3rd party (Gluster)            |
| volumesnapshots             | minikube | disabled     | Kubernetes                     |
|-----------------------------|----------|--------------|--------------------------------|

On peut désormais activer l’addon à partir de son nom : ingress.

$ minikube addons enable ingress
💡  ingress is an addon maintained by Kubernetes. For any concerns contact minikube on GitHub.
You can view the list of minikube maintainers at: https://github.com/kubernetes/minikube/blob/master/OWNERS
    ▪️ Using image registry.k8s.io/ingress-nginx/controller:v1.5.1
    ▪️ Using image registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20220916-gd32f8c343
    ▪️ Using image registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20220916-gd32f8c343
🔎  Verifying ingress addon...
🌟  The 'ingress' addon is enabled

Les messages d’activation de l’ingress controller mentionnent l’image qui va être utilisée : registry.k8s.io/ingress-nginx/controller. On pourra alors utiliser les annotations nginx pour paramétrer le flux HTTP entrant.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-name
  namespace: NAMESPACE
  annotations:
    nginx.ingress.kubernetes.io/enable-cors: "true"
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
    nginx.ingress.kubernetes.io/cors-allow-methods: "PUT, GET, POST, OPTIONS, DELETE"
    nginx.ingress.kubernetes.io/cors-allow-origin: "https://example1.com, https://example2.com"
    nginx.ingress.kubernetes.io/session-cookie-conditional-samesite-none: "true"
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: SERVICE
            port:
              number: PORT

Dashboard

La ligne de commande est très pratique pour automatiser, mais pouvoir compter sur un dashboard et toutes ses informations en une seule place est tout autant important. On peut alors penser au dashboard intégré proposé par Minikube. Pour le charger, on peut lancer la commande suivante.

 $ minikube dashboard

Il en existe d’autres, dont Portainer 2, qui propose un interface graphique de ce type. Pour installer un dashboard tiers, on génère un manifest à donner à Minikube. Concernant Portainer, l’installation se fait en deux temps : la mise en place de l’agent dans le cluster, et de l’interface graphique ensuite. On viendra configurer l’interface graphique pour qu’elle puisse dialoguer avec l’agent et ainsi afficher les données. L’équipe développant Portainer propose les lignes de commandes suivantes pour installer l’agent.

$ curl -L https://downloads.portainer.io/portainer-agent-k8s-nodeport.yaml -o portainer-agent-k8s.yaml
$ kubectl apply -f portainer-agent-k8s.yaml

En inspectant le manifest ainsi téléchargé, on notera la mise en place d’un service nommé portainer-agent-headless en NodePort sur le port 30778.

L’interface graphique peut se mettre en place via un conteneur Docker, partageant la connectivité du host. ⚠️ Note : ce mode opératoire reste valable pour du prototypage.

version: '2.4'
services:
  portainer:
    image: portainer/portainer-ce:2.9.0-alpine
    container_name: portainer
    restart: unless-stopped
    volumes:
      - "./data:/data"
    environment:
      - "GODEBUG=x509ignoreCN=0"
    network_mode: "host"

Après l’étape de configuration, on peut accéder au dahboard de notre cluster. Pour plus d’informations, voici l’architecture logicielle de Portainer3.

Portainer


Résolution DNS des services

Pour configurer les services Kubernetes et leur intercommunication — qui reste interne au cluster, on doit souvent passer en paramètres des URI, qui peuvent contenir les nom de domaines locaux au cluster. Une requête nslookup du host ne suffit pas, car le cluster est isolé. Une solution est de lancer un pod dédié à cette tâche dans le cluster et son namespace dédié.

apiVersion: v1
kind: Pod
metadata:
  name: dnsutils
  namespace: NAMESPACE
spec:
  containers:
  - name: dnsutils
    image: gcr.io/kubernetes-e2e-test-images/dnsutils:1.3
    command:
      - sleep
      - "86400"
    imagePullPolicy: IfNotPresent
  restartPolicy: Always

On pourra placer ce contenu dans un fichier nommé pod_dnsutils.yml. Et ensuite l’instancier avec kubectl.

 $ kubectl apply -f pod_dnsutils.yml

Puis ensuite faire la requête nslookup à partir de ce pod.

 $ kubectl exec -it --namespace $NAMESPACE dnsutils -- nslookup $SERVICE

Conclusion

Ces quelques étapes décrites ici permettent de rapidement mettre en place un cluster, commencer à prototyper et prendre en main les fonctionnalités de Kubernetes. J’espère qu’elles vous seront fortes utiles !