Share
Embed
Transcript
33 slides
-
Giampaolo Mancini – @mancho_z www.trampolineup.com 13 + 15 Dicembre 2016
Dai Server ad Alta Densità fino a Internet delle Cose TORINO HACKNIGHT -
Giampaolo Mancini – @mancho_z www.trampolineup.com GIST • Misc - https://gist.github.com/manchoz/7eaf93326d203e3bf614ec7bb8118a2b
• Dockerfile – https://gist.github.com/manchoz/1ecedbf98bdb1ee939921353b63ea602 -
Giampaolo Mancini – @mancho_z www.trampolineup.com Chi siamo • Trampoline SRL
– est. Jan 2010 • Ex I3P – 2010/2014 • Premi, premini, premietti vari – StartCup, Premio Perotto, ecc. Giampaolo Mancini + Francesco Varano • Ing. Informatici • Ricercatori @ PoliTO • R&D WiNext • Trampoline -
Giampaolo Mancini – @mancho_z www.trampolineup.com Prodotti (as-a-service) Placejam Social WiFi
– Identità + Presenza + Interazione • ~500.000 utenti in Italia su ~300 hotspot (da bar a comuni) • Valentino/VFG, Swatch Group, Lindt Italia, IREN, Ativa, Elmec, etc. Nuovi Prodotti/Servizi – IoT + Cloud • 11Probes – Contapersone + Analisi flussi + Posizionamento • Printercast – Cloud printing open con accounting e billing (senza Domini) "Roba che ti fa guadagnare mentre dormi" -
Giampaolo Mancini – @mancho_z www.trampolineup.com Networking + Cloud and distributed
computing • GNU/Linux e Software Libero (dal 1996) – C#/.NET/Mono, Python, Web • Networking carrier-grade (wired, wireless, LPWAN) • Applicazioni web e back-end ad alte prestazioni/alta affidabilità/alta usabilità • API Cloud – Amazon AWS, Google, etc. • Container – Docker • Search, analytics, streaming data – PGSQL, ELK, InfluxDB, ZeroMQ, MQTT • GNU/Linux Embedded/ARM, Python + MicroPython -
Giampaolo Mancini – @mancho_z www.trampolineup.com Docker su ARM - Perché
TL;DR Domare l'incubo degli upgrade da remoto dei dispositivi IoT -
Giampaolo Mancini – @mancho_z www.trampolineup.com Architettura ARM (Cortex-A) • ARM-A
(CPU/SoC General Purpose) vs ARM-M (embedded propriamente detto) • Smartphone • Single Board Computer: Raspberry Pi & Co. ◦ Supporto per 29 nuove board ARM in Linux 4.9 • Hardware "embedded" di nuova generazione ◦ Videocamere ◦ Microserver ◦ Networking • Server/Hosting bare-metal ◦ Low cost ◦ Alta densità ◦ Consumi ridotti -
Packet.net TYPE 2A 96 Core ARM @2GHz + 128GB RAM
+ 340GB SSD < $3/core/mese -
Giampaolo Mancini – @mancho_z www.trampolineup.com Docker su ARM - Server/Hosting/Cloud
• Sistema operativo di base stabile stateless • Servizi/applicazioni indipendenti dal SO/Distribuzione • Hosting bare-metal + alta densità = Containers-as-a-Service • Architettura di riferimento per cloud-on-premises? • Hosting bare-metal ARM ◦ scaleway.com ◦ packet.net -
Giampaolo Mancini – @mancho_z www.trampolineup.com Docker su ARM - IoT
• Sistema operativo di base stabile (e stateless) • Servizi/applicazioni indipendenti dal SO/Distribuzione • Update OTA granulare dei (micro)-servizi • Architettura a micro-servizi -> nodi stateless ◦ Storage read-only ◦ Corruzioni SD Card ◦ Provisioning a run-time ◦ ... -
Giampaolo Mancini – @mancho_z www.trampolineup.com Docker su ARM - Dove
si può arrivare? ESEMPIO: Microservizi Python in immagini docker • Sandbox (solo applicazione, immagine FROM SCRATCH) • Solo binari (solo eseguibile o solo runtime) • Applicazione cifrata (riduzione di problemi di IP infringement/sicurezza) • 10-20MB vs 180-250MB immagine Python ufficiale -
Giampaolo Mancini – @mancho_z www.trampolineup.com Da dove si parte? -
Server Macchina ARM con GNU/Linux per ARMHF/AARCH64 • Distribuzioni ◦ Tutte le maggiori ◦ Consiglio: supporto UFFICIALE per Docker ◦ Consiglio: kernel aggiornato con driver per storage OverlayFS ◦ Installazione da package manager o "curl | sh" -
Giampaolo Mancini – @mancho_z www.trampolineup.com Da dove si parte? -
IoT Macchina ARM con distribuzione GNU/Linux per IoT • Caratteristiche raccomandate della distribuzione ◦ SUPPORTO e pacchetti ◦ SUPPORTO per le board o dai produttori ◦ Linux 4.x • Distribuzioni ◦ Raspbian ◦ Arch Linux ◦ HypriotOS ◦ C.H.I.P. OS ◦ ResinOS -
Giampaolo Mancini – @mancho_z www.trampolineup.com GNU/Linux IoT – Arch Linux
ARM • Arch Linux For ARM ◦ Distribuzione rolling ◦ Supporto ottimo ◦ Documentazione ottima ◦ Ottimo supporto delle board supportate ufficialmente ◦ Kernel sempre aggiornato ◦ Pacchetti "vanilla" -
Giampaolo Mancini – @mancho_z www.trampolineup.com GNU/Linux IoT – Raspbian •
Raspbian ◦ Una delle distro per Raspberry Pi ◦ Supporto ufficiale di Docker ◦ Collaborazione Raspberry Pi Foundation e Docker ◦ Diversi Docker Captain coinvolti ◦ "curl | sh" -
Giampaolo Mancini – @mancho_z www.trampolineup.com GNU/Linux IoT – HypriotOS •
HypriotOS ◦ Dieter Reuter (@Quintus23M) ◦ Basata su Raspbian: solo per Raspberry Pi ◦ Docker ottimizzato pre-installato ◦ Versioni future basate su Debian per ARMHF/AARCH64: altre schede ◦ La distribuzione più ottimizzata e production-ready per Docker su ARM so far. ◦ Tool di contorno per flash delle SD e provisioning di base. ◦ http://blog.hypriot.com -
Giampaolo Mancini – @mancho_z www.trampolineup.com GNU/Linux IoT – C.H.I.P. OS
• C.H.I.P. OS ◦ Per C.H.I.P. – board ARM più economica disponibile (la mia preferita) ◦ WiFi + BLE integrati ◦ Basata su Debian: solo C.H.I.P. ◦ Tool di contorno per flash delle SD. ◦ "curl | sh" ◦ Supporto ufficiale Docker dal 2016-12-11 -
Giampaolo Mancini – @mancho_z www.trampolineup.com GNU/Linux IoT – ResinOS •
ResinOS ◦ Basata su Yocto ◦ Supporto per molte board "serie" ◦ Approccio "boot to docker": systemd + qualche servizio al contorno + docker ◦ Tool CLI per provisioning ◦ Storage read-only e supporto per OTA del SO (bootloader + partizioni ridondate sulla SD) ◦ Basata sull'esperienza di resin.io: molto promettente -
Giampaolo Mancini – @mancho_z www.trampolineup.com Workflow di sviluppo • FROM
<immagine base per ARMHF/AARCH64 su hub.docker.com> • FROM scratch • NATIVO: Build su board ARM • CROSSBUILD: su GNU/Linux e MacOS (forse anche su Windows) -
Giampaolo Mancini – @mancho_z www.trampolineup.com Nativo – Immagini ARM da
Hub • Solito caos di hub.docker.com • Repository consigliati ◦ https://hub.docker.com/u/container4armhf/ ◦ https://hub.docker.com/u/resin/ ◦ https://hub.docker.com/u/aarch64/ • Raccomandate immagini basate su Alpine Linux ◦ Immagine base ufficiale ◦ Occhio a musl-libc -
Giampaolo Mancini – @mancho_z www.trampolineup.com Nativo – Immagini FROM SCRATCH
• Generare un rootfs per ARMHF/AARCH64 • Dockerfile FROM scratch ADD rootfs / • docker build -t myrepo/myimage . -
Giampaolo Mancini – @mancho_z www.trampolineup.com Nativo – Immagini "FROM scratch"
• Easy way: script in docker/contrib ◦ mkimage.sh <opzioni deboostrap per debian/ubuntu> ◦ mkimage-alpine.sh ◦ mkimage-arch.sh ◦ … • Veri duri ◦ debootstrap ◦ pacstrap ◦ (Alpine Linux') apk ◦ … -
Giampaolo Mancini – @mancho_z www.trampolineup.com Nativo – Alpine FROM SCRATCH
su GNU/Linux $ export ALPINE_ARCH=$(uname -m) $ export BUILD_DIR=$(mktemp -d -p . -u apk-XXXXXXXX) $ export CHROOT_DIR=${BUILD_DIR}/rootfs-${ALPINE_ARCH} $ export ALPINE_MIRROR="http://dl-cdn.alpinelinux.org/alpine" $ export ALPINE_REPO=${ALPINE_MIRROR}/edge/main $ export APK_URL=${ALPINE_REPO}/${ALPINE_ARCH}/apk-tools-static-2.6.8-r1.apk $ curl -fsSL ${APK_URL} | tar xz --strip-components 1 sbin/apk.static $ sudo ./apk.static -X ${ALPINE_REPO} \ --arch ${ALPINE_ARCH} -U --allow-untrusted \ --root ${CHROOT_DIR} --initdb add alpine-base -
Giampaolo Mancini – @mancho_z www.trampolineup.com Crossbuild • Generazione delle immagini
per ARM su PC/Mac AMD64/X86_64 • Esecuzione dei container ARM su PC/MAC • Possibile incremento di prestazioni • (Emulazione ARM su PC/Mac con Qemu) • In generale, consiglio board ARM da build/sviluppo (tanta CPU/RAM). • GNU/Linux ◦ Qualsiasi distro con pacchetti per qemu-user-static e binfmt-misc ◦ Debian/Ubuntu, Arch, … • Docker for Mac -
Giampaolo Mancini – @mancho_z www.trampolineup.com Crossbuild – Prerequisiti Un po'
di chroot voodoo magic vecchia scuola: qemu-user-static + binfmt-misc (host == macchina di sviluppo, target == macchina di deployment) Usiamo binfmt-misc per far credere al docker del host (su Mac, al docker che gira sul GNU/Linux che gira in xhyve) di poter eseguire nativamente i binari per ARM. In realtà i binari vengono eseguiti da qemu-arm-static e qemu-aarch64-static. -
Giampaolo Mancini – @mancho_z www.trampolineup.com Crossbuild – Primi passi su
GNU/Linux mancho@phaeton:~$ uname -a Linux phaeton 4.5.7-std-3 #1 SMP Tue Jul 12 09:56:30 UTC 2016 x86_64 GNU/Linux mancho@phaeton:~$ docker run --rm -ti container4armhf/armhf-alpine /bin/sh mancho@phaeton:~$ sudo apt update && sudo apt install qemu-user-static binfmt-misc mancho@phaeton:~$ docker run --rm -ti \ -v /usr/bin/qemu-arm-static:/usr/bin/qemu-arm-static \ container4armhf/armhf-alpine /bin/sh -
Giampaolo Mancini – @mancho_z www.trampolineup.com Crossbuild - Strategie per GNU/Linux
• A runtime -v /usr/bin/qemu-arm-static:/usr/bin/qemu-arm-static • Build di nuova immagini con: FROM container4armhf/armhf-alpine COPY qemu-arm-static /usr/bin # Oppure RUN di script che fa check dell'architettura # e scarica qemu-user-static RUN rm /usr/bin/qemu-arm-static # ... -
Giampaolo Mancini – @mancho_z www.trampolineup.com Crossbuild - RootFS Cross su
GNU/Linux $ export HOST_ARCH=$(uname -m) $ export TARGET_ARCH="armhf" $ export BUILD_DIR=$(mktemp -d -p . -u apk-XXXXXXXX) $ export CHROOT_DIR=${BUILD_DIR}/rootfs-${TARGET_ARCH} $ export ALPINE_MIRROR="http://dl-cdn.alpinelinux.org/alpine" $ export ALPINE_REPO=${ALPINE_MIRROR}/edge/main $ export APK_URL=${ALPINE_REPO}/${HOST_ARCH}/apk-tools-static-2.6.8-r1.apk $ curl -fsSL ${APK_URL} | tar xz --strip-components 1 sbin/apk.static $ mkdir -p ${CHROOT_DIR}/usr/bin $ cp /usr/bin/qemu-arm-static ${CHROOT_DIR}/usr/bin $ sudo ./apk.static -X ${ALPINE_REPO} \ --arch ${TARGET_ARCH} -U --allow-untrusted \ --root ${CHROOT_DIR} --initdb add alpine-base -
Giampaolo Mancini – @mancho_z www.trampolineup.com Crossbuild - Tips & Tricks
• RootFS Cross su Mac: container ARM/X86_64 per generare rootfs cross $ docker run --rm -ti -v tools:/tools alpine:edge \ /tools/bootstrap-cross-rootfs.sh • Cross-compilare prima tutto quello che si può: ◦ Python – generare wheel per ARM di tutti i pacchetti (pip wheel) ◦ … • GPIO, PiCamera, ecc. ◦ --privileged per test ◦ --device in produzione