Mixer des nodes ARM et AMD64 sur un cluster kubernetes k3s

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

Introduction

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

Flashage des cartes SD avec hypriotOS

Je fait le choix d’utiliser les images fournies par hypriot car elles sont optimisées et ne nécessite 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 flash
chmod +x flash
sudo install flash /usr/local/bin

Maintenant flashons les cartes SD avec la dernières de la distribution hypriotOS sur des cartes SD (prenez des classes 10) qui vous devrez au préalable formatter 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 leur adresses dans votre fichier /etc/hosts. Ensuite une fois rebooté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 hypriot
reboot
sudo vi /etc/host

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

192.168.1.44     rpi1
192.168.1.45     rpi2

Copie de votre clé ssh :

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

Installons l’agent k3S avec la meme 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 retrouvez les nodes dans votre cluster K3S :

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 :

Il suffit simplement d’utilise 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-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éployment :

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 :

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>

Alimenter un blog comme celui-ci est aussi passionnant que chronophage. En passant votre prochaine commande (n'importe quel autre article) au travers des liens produits ci-contre, je touche une petite commission sans que cela ne vous coûte plus cher. Cela ne me permet pas de gagner ma vie, mais de couvrir les frais inhérents au fonctionnement du site. Merci donc à vous!

comments powered by Disqus