Dans un contexte multi architecture, kubernetes a un problème d'installation native. Il ne gère que l'architecture du maître.
Mais grâce à cette page, j'ai pu faire fonctionner le tout.
Les documents n'étant pas éternels sur internet, je résume ici la manipulation :
Symptômes
Lors de la création d'un pod avec une commande "kubectl apply", nos nœuds arm ont leurs pods bloqué en Crashloopbackoff.
Un examen avec kubectl describe pod <identifiant> ne nous permet pas de savoir pouvoir.
Mais nous voyons le nœud sur lequel le pod tourne.
Une connexion sur ce nœud, et un petit docker describe <identifiant> du container généré par kubectl apply, permet d'obtenir l'emplacement des logs.
La consultation de ces logs nous indique un problème de format binaire. L'image poussée par kube est une image amd64 et non arm !
Le problème provient du daemonset sur le maitre. Pour toutes la suite, faites attention aux indentations. C'est du yaml.
Modification du daemonset
kubectl edit daemonset kube-proxy --namespace=kube-system
Après la ligne "hostNetwork: true", ajouter :
nodeSelector:
beta.kubernetes.io/arch: amd64
Ajouter aussi le même bloc dans la section spec/template/spec.
Enregistrer le fichier. Le daemonset est modifié.
Création d'un daemonset-arm pour les arm
Pour créer ce deuxième daemonset, nous relançons la commande d'édition, puis nous enregistrons le fichier sous le nom daemonset-arm.yaml.
Les modification à effectuer sont les suivantes :
Dans le bloc Metadata
- Supprimer les directives "CreationTimeStamp" et "Generation"
- Changer le nom kube-proxy en kube-proxy-arm dans la directive "name"
Dans le bloc Spec
- remplacer les occurrences de "amd64" par "arm"
Supprimer tout le bloc status
Enregistrez le fichier, puis créer le nouveau daemonset avec la commande suivante :
kubectl create -f daemonset-arm.yaml
Une fois ce nouveau daemonset créé, nous pouvons joindre nos raspberry pi au cluster kubernetes, et il n'y aura plus de problèmes à la création des pods.
Nous pouvons voir le résultat avec la commande
kubectl get pods --namespace kube-system -o wide