# Raspberry Pi virtualisation légère avec Cockpit {{INLINETOC}} **Cockpit** est un projet libre, mis à jour régulièrement et disponible pour de nombreuses distributions. Concrètement, grâce à Cockpit, toutes les tâches d’administration habituelles sur les serveurs sont réalisables. Par le biais de Cockpit, on peut gérer le stockage, la mise en réseau, les comptes utilisateurs, voir les services et daemons actifs, modifier quelques paramètres systèmes (domaine, nom, configuration des mises à jour) et encore accéder aux logs. Ainsi que la partie virtualisation … Cet article va expliquer le déploiement d'un hyperviseur et le déploiement d'un cluster MicroK8S sur une carte Raspberry Pi. ## Installation de l'hyperviseur ### Installation du système hôte Canonical propose une version ARM 64 Bits de sa distribution Ubuntu 20.04 LTS, télécharger et Utiliser l'une des méthodes décrites [[prive:rpi-patch|ici]] pour graver l'image sur la carte SD. ``` $ wget http://cdimage.ubuntu.com/releases/20.04/release/ubuntu-20.04-preinstalled-server-arm64+raspi.img.xz $ xz -d ubuntu-20.04-preinstalled-server-arm64+raspi.img.xz ``` Une fois l’opération terminée, penser à créer un fichier vide nommé SSH dans la partition système, pour pouvoir se connecter à l’OS Ubuntu via le réseau local en mode headless. Connecter alors la carte Raspberry Pi 4 au réseau local via son port Ethernet. Lancer la découverte de l’adresse IP utilisée par l’OS via Nmap : ``` sudo nmap -p22 -v 1 grep open ``` On peut s’y connecter via SSH (login : ubuntu / pwd : ubuntu à changer après connexion) Vérifier que la carte dispose d’un processeur qui supporte la virtualisation : ``` sudo apt install cpu-checker kvm-ok INFO: /dev/kvm exists KVM acceleration can be used ``` Il est alors possible d’y installer Cockpit. ### Installation de Cockpit Installer les paquets suivants: ``` sudo apt install cockpit cockpit-bridge cockpit-dashboard cockpit-machines cockpit-networkmanager cockpit-packagekit cockpit-storaged cockpit-system cockpit-ws bridge-utils -y ``` Ce qui entraîne l’installation de l’hyperviseur KVM et des outils associés pour cette architecture ARM 64 Bits. ### Activation de Cockpit. ``` sudo systemctl enable cockpit.socket sudo systemctl start cockpit.socket sudo systemctl status cockpit.socket cockpit.socket - Cockpit Web Service Socket Loaded: loaded (/lib/systemd/system/cockpit.socket; enabled; vendor preset: enabled) Active: active (listening) since Sun 2020-07-05 14:33:17 UTC; 3min 24s ago Triggers: cockpit.service Docs: man:cockpit-ws(8) Listen: [::]:9090 (Stream) Tasks: 0 (limit: 9255) CGroup: /system.slice/cockpit.socket ``` Activer un nouveau mot de passe pour le compte root. ## Construction du cluster Sur le port TCP 9090, on peut accéder au dashboard de Cockpit pour commencer la création de machines virtuelles ### Création du noeud maître Créer une machine virtuelle par l’utilisation d’images ISO de la distribution légère Alpine Linux … ``` wget -c http://di-cdn.alpinelinux.org/alpine/v3.12/releases/aarch64/alpine-virt-3.12.0- aarch64.iso alpine-virt-3.12.0-aarch64.iso 100%[ in 23s >] 36.02M .50MB/s 2020-07-05 18:14:30 (1.55 MB/s) - 'alpine-virt-3.12.0-aarch64.1so' saved [37765120/37765120] ``` Connexion à la console de la machine virtuelle également par ce biais … Y installer le moteur Docker après avoir activer les dépôts nécéssaires … ``` cat /etc/apk/repositories #/media/cdrom/apks http://dl-cdn.alpinelinux.org/alpine/v3.12/main http://dl-cdn.alpinelinux.org/alpine/v3.12/community http://dl-cdn.alpinelinux.org/alpine/edge/main http://dl-cdn.alpinelinux.org/alpine/edge/community http://dl-cdn.alpinelinux.org/alpine/edge/testing apk add docker OK: 372 MiB in 82 packages rc-update add docker boot * service docker added to runlevel boot service docker start * Mounting cgroup filesystem [ ok ] * /var/log/docker.log: creating file * /var/log/docker.log: correcting owner * Starting Docker Daemon ... [ ok ] service docker status * status: started docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES docker version Client: Version: 19.03.12 API version: 1.40 Go version: go1.14.4 Git commit: 48a66213fe1747e8873f849862ff3fb981899fc6 Built: Tue Jun 30 21:40:22 2020 OS/Arch: linux/arm64 Experimental: false Server: Engine: Version: 19.03.12 API version: 1.40 (minimum version 1.12) Go version: go1.14.4 Git commit: 48a66213fe1747e8873f849862ff3fb981899fc6 Built: Tue Jun 30 20:58:26 2020 OS/Arch: linux/arm64 Experimental: false containerd: Version: v1.3.5 GitCommit: 9b6f3ec0307a825c38617b93ad55162b5bb94234 runc: Version: 1.0.0-rc91 GitCommit: 24a3cf88a7ae5f4995f6750654c0e2ca61ef4bb2 docker-init: Version: 0.19.0 GitCommit: ``` Récupération de Rancher K3s, ``` wget -c https://github.com/rancher/k3s/releases/download/v1.18.4%28k3s1/k3s-arm64 k3s-arm64 100%[ >] 47.06M 1.38MB/s in 30s 2020-07-05 18:33:58 (1.55 MB/s) - 'k3s-arm64' saved [49348608/49348608] chmod +rwx k3s-arm64 mv k3s-arm64 /usr/bin/k3s nohup k3s server --docker & ``` qui permet d’initier au travers de cette première machine virtuelle, un noeud maître d’un futur cluster Kubernetes … ### Création des autres noeuds du cluster Créer deux autres machines virtuelles Alpine Linux sur le même principe. Chargemer K3s sur ces dernières et configurer en tant que noeuds de ce cluster Kubernetes … ``` nohup k3s agent --server https://192.168.122.10:6443 --token Kl0d556d982bc6191f92023bf84f82a648a70959e4815fdf75b136ea7d90939b3f5::server:67060d0 9e2e5edc448ebf6298ff2437a --docker & ``` ``` nohup k3s agent --server https://192.168.122.10:6443 --token Kl0d556d982bc6191f92023bf84f82a648a70959e4815fdf75b136ea7d90939b3f5::server:67060d0 9e2e5edc448ebf6298ff2437a --docker & ``` ### Configuration du contrôleur Il reste à charger le client Kubectl sur l’OS Ubuntu avec le fichier kubeconfig correspondant pour accéder et contrôler ce cluster Kubernetes (sur la base de ces petites machines virtuelles Alpine Linux) : ``` curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.18.4/bin/linux/arm64 /kubectl % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 39.8M 100 39.8M 0 0 1334k 0 0:00:30 0:00:30 --:--:-- 1267k chmod +rwx kubectl; sudo my kubectl /usr/bini; mkdir .kube; touch .kube/config cat .kube/config apiVersion: v1 clusters: - cluster: certificate-authority-data: LSOtLS1CRUdJTiBDRVJUSUZJINFURSOtLSOtCk1JSUJklekNCL3FBREFnRUNBZOVBTUFvRONDcUdTTTO5OkFNOOlDTXUVEFmOmd0VkJ BTU1HR3N6Y3kxelpYSjIKKhJdFkyRkFNVFUlTXprMOSERTFNVEFlRncweUlEOTNNRFV4TORNMUSURmFGdzB6TURBM01ETXhPREOxTl RGYWNIQ014SVRBZkJnTlZCQU1NROdzemN5MXpaWEoyWlhJdFkyRkFNVFUlTXprMOSERTFNVEJaTUJNROJ5cUdTTTUCkFnRUdDQ3FHU 0000UF3RUhBMElBC*91aXdOmtsZi8zK2cOWXVTYnp0V2tJcEpPUmhYT3BjT3EzZjhLVORnTGYKVzZaMGFxRGxLY1VSL1J1MWOyajBJ VEtmZEcxS2xIeHdNRW1lUTBBalcwR2pJekFoTUEOROExVWREdOVCL3dRROpBdOlDcERBUEJnTlZIUk1COWY4RUJUQURBUUgvTUFvRON DcUTITTO5C*FNUEwZOFNRVVDSURIT3VuSHk2N3RWCkR6ZVZTOnpvais3Rlc5czNBN2w0dOVXcWxNbmRldOgrOWlFQWsOREgOSHVGQT dFYTNodzZJaFIrSEhScTlhMAITzdoWUZxZEJBaEdDa0FRPOotLSOtLUVORCBDRVJUSUZJOOFURSOtLSOtCg== server: https://192.168.122.10:6443 name: default contexts: - context: cluster: default user: default name: default current-context: default kind: Config preferences: {} users: - name: default user: password: a8a5bb53c189e4cf32d329698096eaa5 username: admin ``` Le cluster Kubernetes est opérationnel … ``` kubectl get po,svc ,ing - - all - namespaces ``` Charger ce manifeste YAML qui va permettre de lancer le sempiternel démonstrateur FC par l’intermédiaire d’une image Docker en version ARM 64bits. ``` kubectl apply -f deployment.yml deployment.apps/fcdemo3 created service/fcdemo-service created ingress.networking.k8s.io/fcdemo-ingress created ``` ``` --- apiVersion: apps/v1 kind: Deployment metadata: name: fcdemo3 labels: app: fcdemo3 spec: replicas: 2 selector: matchLabels: app: fcdemo3 template: metadata: labels: app: fcdemo3 spec: containers: - name: fcdemo3 image: mcas/franceconnect-agent-demo-arm64:latest ports: - containerPort: 8000 --- apiVersion: v1 kind: Service metadata: name: fcdemo-service spec: type: ClusterlP selector: app: fcdemo3 ports: - protocol: TCP port: 80 targetPort: 8000 --- apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: fcdemo-ingress annotations: ingress.kubernetes.io/ssl-redirect: "false" spec: rules: - http: paths: - path: / backend: serviceName: fcdemo-service servicePort: 80 ``` Le démonstrateur FC est accessible via Traefik en tant qu’Ingress Controller dans ce cluster Kubernetes … Le dashboard de Cockpit permet de suivre quelques métriques de base avec le fonctionnement de ces machines virtuelles … Un test simple qui n’aura pas réussi à consommer la mémoire de cette version à 8Go …