Mixer des nodes ARM et AMD64
Mise à jour :
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.
Pré-requis
Partons de l’installation faite dans la section précédente : Installer un cluster Kubernetes avec sa version ultra-light K3S de Rancher
Flashage des cartes SD avec hypriotOS
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.
curl -LO https://github.com/hypriot/flash/releases/download/2.3.0/flash -o flashchmod +x flashsudo 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 :
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 :
ssh pirate@192.168.1.12 # l’adresse récupré sur la console de la bbox. le mot de passe par défaut est hypriotrebootsudo vi /etc/host
Ajouter les lignes suivantes avec vos adresses IP fixées :
192.168.1.44 rpi1192.168.1.45 rpi2
Copie de votre clé ssh
:
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:
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 :
kubectl get nodesNAME STATUS ROLES AGE VERSIONrpi2 Ready worker 23h v1.15.4-k3s.1kubi1 Ready master 17d v1.15.4-k3s.1rpi1 Ready worker 24h v1.15.4-k3s.1tower Ready worker 6d21h v1.15.4-k3s.1
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 :
kubectl get nodes --show-labelsNAME STATUS ROLES AGE VERSION LABELSrpi2 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=truekubi1 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=truerpi1 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=truetower 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/v1beta1kind: Deploymentmetadata: annotations: labels: app: alpine name: alpine-dep namespace: defaultspec: 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 :
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESgogs-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>