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>