
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
Section intitulée « 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
Section intitulée « 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/binMaintenant 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.zipUne 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/hostSi 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 rpi1192.168.1.45 rpi2Copie 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@rpi2Installons 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.1Forcer 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 :
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=trueOn 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: armLes lignes importantes :
spec: containers: - image: drakerin/rpi-alpine-nginx:latest
nodeSelector: kubernetes.io/arch: armLes 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: amd64Vous 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>