Aller au contenu
Conteneurs & Orchestration medium

Mixer des nodes ARM et AMD64

6 min de lecture

logo kubernetes

Mixer des nodes sur un cluster k3s est tout à fait possible et c’est assez simple à mettre en œuvre puisque l’agent contient directement les pods techniques (load balancer et ingress) avec la bonne architecture détectée lors de l’installation.

Partons de l’installation faite dans la section précédente : Installer un cluster Kubernetes avec sa version ultra-light K3S de Rancher

Je fais le choix d’utiliser les images fournies par hypriot car elles sont optimisées et ne nécessitent pas d’écran pour la post-installation.

On récupère dans un premier temps l’outil pour flasher les cartes SD.

Fenêtre de terminal
curl -LO https://github.com/hypriot/flash/releases/download/2.3.0/flash -o flash
chmod +x flash
sudo install flash /usr/local/bin

Maintenant flashons les cartes SD avec la dernière de la distribution hypriotOS sur des cartes SD (prenez des classes 10) qui vous devrez au préalable formater en FAT32 :

Fenêtre de terminal
sudo flash --hostname rpi1 https://github.com/hypriot/image-builder-rpi/releases/download/v1.11.2/hypriotos-rpi-v1.11.2.img.zip

Une fois flashée, installez les dans vos rpi et allumez-les. Une fois détecté par votre serveur DHCP (perso celui de ma bbox) fixer leurs adresses. Si besoin, ajoutez leurs adresses dans votre fichier /etc/hosts. Ensuite une fois redémarrés, copiez votre clé ssh sur les rpi avec le compte pirate :

Fenêtre de terminal
ssh pirate@192.168.1.12 # l’adresse récupré sur la console de la bbox. le mot de passe par défaut est hypriot
reboot
sudo vi /etc/host

Si vous ne maitrisez l’éditeur vi, je vous recommande de lire mon guide sur vi.

Ajouter les lignes suivantes avec vos adresses IP fixées :

192.168.1.44 rpi1
192.168.1.45 rpi2

Copie de votre clé ssh :

Fenêtre de terminal
ssh-copy-id -i ~/.ssh/id-ed25519.pub pirate@rpi1 # Le mot de passe est hypriot (changez le !!!)
ssh-copy-id -i ~/.ssh/id-ed25519.pub pirate@rpi2

Installons l’agent k3S avec la même commande que pour les nodes AMD64:

Fenêtre de terminal
curl -sfL https://get.k3s.io |K3S_TOKEN="K10c8bcd7d403afacb83ccc3252d6470fab097c994753a4c291e10cb929e35e7f4a::node:11091a47017e2e94f99ed9d1ebc3123b" K3S_URL="https://192.168.1.43:6443" sh -

Au bout de quelques instants, vous devriez retrouver les nodes dans votre cluster K3S :

Fenêtre de terminal
kubectl get nodes
NAME STATUS ROLES AGE VERSION
rpi2 Ready worker 23h v1.15.4-k3s.1
kubi1 Ready master 17d v1.15.4-k3s.1
rpi1 Ready worker 24h v1.15.4-k3s.1
tower Ready worker 6d21h v1.15.4-k3s.1

Forcer les image dockers AMD64 et ARM à tourner sur les bons nodes

Section intitulée « Forcer les image dockers AMD64 et ARM à tourner sur les bons nodes »

Il suffit d’utiliser les labels définit par défaut et d’ajouter à vos déploiements/statefulsets un nodeSelector :

Affichons les labels des nodes :

Fenêtre de terminal
kubectl get nodes --show-labels
NAME STATUS ROLES AGE VERSION LABELS
rpi2 Ready worker 23h v1.15.4-k3s.1 beta.kubernetes.io/arch=arm,beta.kubernetes.io/os=linux,kubernetes.io/arch=arm,kubernetes.io/hostname=rpi2,kubernetes.io/os=linux,node-role.kubernetes.io/worker=true
kubi1 Ready master 17d v1.15.4-k3s.1 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=kubi1,kubernetes.io/os=linux,node-role.kubernetes.io/master=true
rpi1 Ready worker 24h v1.15.4-k3s.1 arch=arm,beta.kubernetes.io/arch=arm,beta.kubernetes.io/os=linux,kubernetes.io/arch=arm,kubernetes.io/hostname=rpi1,kubernetes.io/os=linux,node-role.kubernetes.io/worker=true
tower Ready worker 6d21h v1.15.4-k3s.1 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=tower,kubernetes.io/os=linux,node-role.kubernetes.io/worker=true

On va utiliser le label kubernetes.io/arch dans le déploiement :

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
annotations:
labels:
app: alpine
name: alpine-dep
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: alpine
template:
metadata:
labels:
app: alpine
spec:
containers:
- image: drakerin/rpi-alpine-nginx:latest
imagePullPolicy: IfNotPresent
name: alpine
ports:
- containerPort: 80
protocol: TCP
nodeSelector:
kubernetes.io/arch: arm

Les lignes importantes :

spec:
containers:
- image: drakerin/rpi-alpine-nginx:latest
nodeSelector:
kubernetes.io/arch: arm

Les images docker au format ARM vont bien aller sur les nodes rpi (ARM). Faites de même pour les déploiements avec des images AMD64 en changeant le node selector :

nodeSelector:
kubernetes.io/arch: amd64

Vous devriez vous retrouver avec ceci :

Fenêtre de terminal
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
gogs-88d668695-696s7 1/1 Running 0 23h 10.42.2.87 tower <none> <none>
drone-drone-server-6569df48f8-s4vf5 1/1 Running 0 23h 10.42.2.88 tower <none> <none>
local-docker-registry-7fdbcc5648-6j6sv 1/1 Running 0 23h 10.42.0.99 kubi1 <none> <none>
nfs-client-provisioner-865d85667d-zpw2z 1/1 Running 0 23h 10.42.2.91 tower <none> <none>
alpine-dep-5c66bcfbfd-42nkz 1/1 Running 0 22h 10.42.3.4 rpi2 <none> <none>
alpine-dep-5c66bcfbfd-x7fkz 1/1 Running 0 22h 10.42.1.7 rpi1 <none> <none>
alpine-dep-5c66bcfbfd-jtv79 1/1 Running 0 22h 10.42.3.5 rpi2 <none> <none>
blog-deployment-84cc486bc6-tmcgn 1/1 Running 0 175m 10.42.0.153 kubi1 <none> <none>
blog-deployment-84cc486bc6-dc7mp 1/1 Running 0 175m 10.42.2.98 tower <none> <none>
blog-deployment-84cc486bc6-pgrfh 1/1 Running 0 174m 10.42.0.154 kubi1 <none> <none>

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.