Questo documento suggerisce best practice per progettare e implementare procedure di provisioning e configurazione affidabili e automatiche per i dispositivi che operano ai confini del tuo ambiente, ad esempio:
- Dispositivi edge, come dispositivi IoT (Internet of Things), microcomputer e microcontrollori
- Sistemi e server bare metal
Leggi questo documento se progetti procedure di provisioning e configurazione per dispositivi edge, sistemi e server bare metal o se vuoi saperne di più sulle best practice per il provisioning e la configurazione di questi tipi di dispositivi.
Questo documento non elenca tutte le possibili best practice per il provisioning e la configurazione di sistemi e server edge e bare metal e non offre garanzie di successo. ma ti aiuta a stimolare discussioni su potenziali modifiche e miglioramenti alle procedure di provisioning e configurazione.
Questo documento fa parte di una serie di documenti che forniscono informazioni sulle architetture IoT su Google Cloud. Gli altri documenti di questa serie includono:
- Panoramica delle architetture dei dispositivi connessi su Google Cloud
- Architettura del broker MQTT autonomo su Google Cloud
- Architettura del prodotto della piattaforma IoT su Google Cloud
- Architettura del dispositivo su Pub/Sub per Google Cloud
- Best practice per l'esecuzione di un backend IoT su Google Cloud
- Best practice per il provisioning e la configurazione automatici di sistemi e server edge e bare metal (questo documento)
Il provisioning e la configurazione manuale di un parco risorse di grandi dimensioni sono soggetti a errori umani e non si adattano all'aumento del parco risorse. Ad esempio, potresti dimenticare di eseguire un'attività di provisioning o configurazione fondamentale oppure potresti fare affidamento su processi parzialmente o completamente non documentati. Procedure di provisioning e configurazione completamente automatiche e affidabili aiutano a risolvere questi problemi. Inoltre, ti aiutano a gestire il ciclo di vita di ogni dispositivo, dalla produzione alla dismissione fino allo smaltimento.
Terminologia
I seguenti termini sono importanti per comprendere come implementare e creare procedimenti di provisioning e configurazione automatici per i tuoi dispositivi:
- Dispositivo edge: un dispositivo di cui esegui il deployment ai margini del tuo ambiente e che si trova vicino ai dati che vuoi elaborare.
- Procedura di provisioning:l'insieme di attività da completare per preparare un dispositivo alla configurazione.
- Procedura di configurazione:l'insieme di attività da completare per preparare un dispositivo a funzionare in un ambiente specifico.
- Gestione della configurazione:l'insieme di attività che esegui continuamente per gestire la configurazione del tuo ambiente e dei tuoi dispositivi.
- Immagine di base: un'immagine di sistema operativo (OS) o firmware minima funzionante prodotta dalla tua azienda o da un produttore di dispositivi o sistemi operativi.
- Immagine gold: un'immagine del sistema operativo o del firmware immutabile che crei per i tuoi dispositivi o che prepari a partire da un'immagine di base. Le immagini gold includono tutti i dati e le informazioni di configurazione di cui i dispositivi hanno bisogno per svolgere le attività assegnate. Puoi preparare varie immagini di riferimento per svolgere attività diverse. I sinonimi per i tipi di immagini gold includono flavor, spin e archetipi.
- Immagine silver: un'immagine del sistema operativo o del firmware che prepari per i tuoi dispositivi applicando modifiche minime a un'immagine gold o di base. I dispositivi con un'immagine silver completano il provisioning e la configurazione al primo avvio, in base alle esigenze dei casi d'uso che devono supportare.
- Dispositivo di origine:un dispositivo che avvia l'ambiente senza dipendenze esterne.
- Avvio da rete:l'insieme di tecnologie che consente a un dispositivo di ottenere il software e le relative informazioni di configurazione dalla rete anziché da un sistema di archiviazione collegato al dispositivo.
Per aiutarti a impostare gli obiettivi ed evitare i problemi più comuni, applica le best practice per il provisioning e la configurazione descritte nelle sezioni seguenti.
Automatizza i processi di provisioning e configurazione
Durante il primo avvio o ogni volta che è necessario, i dispositivi devono essere in grado di eseguire il provisioning e la configurazione utilizzando solo l'immagine software installata al loro interno.
Per evitare di implementare la logica necessaria durante le procedure di provisioning e configurazione, puoi utilizzare strumenti che forniscono le primitive necessarie per orchestrare e implementare queste procedure. Ad esempio, puoi utilizzare cloud-init e la sua origine dati NoCloud, insieme a script o a uno strumento di gestione della configurazione, come Ansible, Puppet, o Chef, eseguito sull'host locale.
Per progettare processi di provisioning e configurazione affidabili, assicurati che tutti i passaggi e le attività eseguiti durante questi processi siano validi, possibilmente in modo automatico. Ad esempio, puoi utilizzare un framework di test di conformità automatico, come InSpec, per verificare che le procedure di provisioning e configurazione funzionino come previsto.
Questa best practice ti aiuta a evitare single point of failure e la necessità di interventi manuali quando devi completare il provisioning e la configurazione dei dispositivi.
Evita i dispositivi per scopi speciali
Quando progetti i tuoi dispositivi edge, riduci al minimo la loro varianza in termini di scopo e specializzazione. Questo consiglio non significa che tutti i tuoi dispositivi edge debbano essere uguali tra loro o condividere lo stesso scopo, ma devono essere il più possibile omogenei. Ad esempio, potresti definire gli archetipi dei dispositivi in base ai tipi di carichi di lavoro che devono supportare. In seguito, potrai implementare e gestire i dispositivi in base alle proprietà di questi archetipi.
Per assicurarti di seguire questa best practice, verifica di poter scegliere un dispositivo a caso tra quelli di un determinato archetipo e poi procedi nel seguente modo:
- Tratta il dispositivo come faresti con altri dispositivi dello stesso tipo. In questo modo dimostri di avere un'efficienza operativa.
- Sostituire il dispositivo con dispositivi dello stesso archetipo senza personalizzazioni aggiuntive. In questo modo dimostri di aver implementato correttamente questi archetipi.
Questa best practice ti consente di ridurre la varianza nel tuo parco di dispositivi, con una conseguente riduzione della frammentazione nell'ambiente e nelle procedure di provisioning e configurazione.
Utilizzare i dispositivi di seed per avviare l'ambiente
Durante il provisioning e la configurazione dei dispositivi, potresti riscontrare un problema di dipendenza circolare: i dispositivi richiedono un'infrastruttura di supporto per eseguire il provisioning e la configurazione, ma questa infrastruttura non è presente perché devi ancora eseguirne il provisioning e la configurazione.
Puoi risolvere questo problema con i dispositivi seed. I dispositivi di seed hanno un scopo speciale temporaneo. Dopo aver completato le attività per le quali è stato progettato, il dispositivo adegua il proprio comportamento e il proprio stato all'archetipo pertinente.
Ad esempio, se utilizzi cloud-init per inizializzare automaticamente i dispositivi, potresti dover configurare un'origine dati NoCloud di cloud-init nei seguenti modi:
- Fornisci i dati dell'origine dati NoCloud al dispositivo di seed tramite un sistema di file.
Attendi che il dispositivo di origine completi il provisioning e la configurazione per il suo scopo speciale, che include la pubblicazione dei dati dell'origine dati NoCloud su altri dispositivi tramite la rete.
Le procedure di provisioning e configurazione sul dispositivo di origine rimangono in attesa fino a quando non vengono soddisfatte le condizioni per rimuovere lo scopo speciale temporaneo del dispositivo di origine. Ecco alcuni esempi di queste condizioni:
- Nell'ambiente sono presenti altri dispositivi che pubblicano i dati dell'origine dati NoCloud sulla rete?
- Il cluster contiene un numero sufficiente di nodi?
- Il primo backup è stato completato?
- Il sito di ripristino di emergenza è pronto?
Esegui il provisioning e configura altri dispositivi che scaricano i dati dell'origine dati NoCloud tramite la rete dal dispositivo di origine. Alcuni dispositivi devono essere in grado di pubblicare i dati dell'origine dati NoCloud sulla rete.
Le procedure di provisioning e configurazione sul dispositivo seed riprendono perché sono soddisfatte le condizioni per eliminare lo scopo speciale del dispositivo seed: ci sono altri dispositivi nel parco risorse che pubblicano i dati dell'origine dati NoCloud sulla rete.
Le procedure di provisioning e configurazione sul dispositivo di origine eliminano lo scopo speciale, rendendo il dispositivo di origine indistinguibile dagli altri dispositivi dello stesso archetipo.
Questa best practice ti consente di avviare il tuo ambiente anche senza un'infrastruttura di supporto e senza violare la best practice Evita dispositivi speciali.
Riduci al minimo lo stato dei tuoi dispositivi
Quando progetti i tuoi dispositivi edge, riduci al minimo la necessità di memorizzare informazioni con stato. I dispositivi edge potrebbero avere risorse hardware limitate o essere implementati in ambienti difficili. La riduzione al minimo delle informazioni con stato di cui hanno bisogno per funzionare semplifica i processi di provisioning, configurazione, backup e recupero perché puoi trattare questi dispositivi in modo omogeneo. Ad esempio, se un dispositivo edge senza stato inizia a non funzionare correttamente e non è recuperabile, puoi sostituirlo con un altro dispositivo dello stesso archetipo con interruzioni o perdite di dati minime.
Questa best practice ti consente di evitare problemi imprevisti dovuti alla perdita di dati o alla complessità delle tue procedure. La maggior parte della complessità deriva dalla necessità di supportare un parco di dispositivi eterogenei.
Crea automaticamente immagini del sistema operativo e del firmware
Per evitare costose attività di provisioning e configurazione al primo avvio dei dispositivi e per risparmiare risorse del dispositivo, personalizza le immagini del sistema operativo e del firmware prima di metterle a disposizione. Ad esempio, puoi installare le dipendenze direttamente nell'immagine anziché quando ogni dispositivo si avvia per la prima volta.
Quando prepari le immagini del sistema operativo e del firmware per i tuoi dispositivi, parti da un'immagine di base. Quando personalizzi l'immagine di base, puoi:
- Produci immagini di riferimento. Le immagini gold contengono tutte le dipendenze nell'immagine in modo che i dispositivi non debbano installarle al primo avvio. La produzione di immagini gold potrebbe essere un'attività complessa, ma consente ai dispositivi di risparmiare tempo e risorse durante il provisioning e la configurazione.
- Produci immagini in argento. A differenza delle immagini gold, i dispositivi che eseguono immagini silver completano tutte le procedure di provisioning e configurazione durante il primo avvio. La produzione di immagini silver può essere meno complessa rispetto alla produzione di immagini golden, ma i dispositivi che eseguono un'immagine silver richiedono più tempo e risorse durante il provisioning e la configurazione.
Puoi personalizzare le immagini del sistema operativo e del firmware nell'ambito dei processi di integrazione e deployment continui (CI/CD) e rendere automaticamente disponibili le immagini personalizzate per i tuoi dispositivi dopo la convalida. I processi CI/CD implementati con uno strumento come Cloud Build, GitHub Actions, GitLab CI/CD o Jenkins, possono eseguire la seguente sequenza di attività:
- Esegui una convalida automatica in base alle immagini personalizzate.
- Pubblica le immagini personalizzate in un repository da cui i tuoi dispositivi possano recuperarle.
Se l'ambiente CI/CD e il sistema operativo o il firmware per cui devi creare le immagini utilizzano architetture hardware diverse, puoi utilizzare strumenti come QEMU per emularle. Ad esempio, puoi emulare l'architettura hardware della famiglia ARM su un'architettura x86_64.
Per personalizzare le immagini del sistema operativo o del firmware, devi essere in grado di modificarle e verificarle in un ambiente di test prima di installarle nei tuoi dispositivi edge. Strumenti come chroot ti consentono di modificare virtualmente, ma non fisicamente, la directory principale prima di eseguire un comando.
Questa best practice ti aiuta a personalizzare le immagini del sistema operativo e del firmware prima di metterle a disposizione dei tuoi dispositivi.
Orchestrare in modo affidabile i carichi di lavoro in esecuzione sui tuoi dispositivi
Se i tuoi dispositivi supportano carichi di lavoro eterogenei, puoi utilizzare i seguenti strumenti per orchestrarli e gestire il loro ciclo di vita:
- Un sistema di orchestrazione dei carichi di lavoro: l'utilizzo di un sistema di orchestrazione dei carichi di lavoro, come Kubernetes, è adatto per i carichi di lavoro con requisiti di gestione del ciclo di vita o di orchestrazione complessi. Questi sistemi sono adatti anche per i carichi di lavoro che coprono più componenti. In entrambi i casi, non devi implementare autonomamente la logica di gestione del ciclo di vita dell'orchestrazione e del carico di lavoro. Se i tuoi dispositivi sono limitati in termini di risorse, puoi installare una distribuzione Kubernetes leggera che richiede meno risorse rispetto a quella canonica, ad esempio MicroK8s, K3s o Google Distributed Cloud installato con il profilo edge.
Un sistema init: l'utilizzo di un sistema init, come systemd, è adatto per i carichi di lavoro con le seguenti caratteristiche:
- Requisiti di orchestrazione semplice
- Mancanza di risorse per supportare un sistema di orchestrazione dei carichi di lavoro
- Carichi di lavoro che non possono essere inseriti in container
Una volta implementato il sistema per orchestrare i carichi di lavoro, puoi utilizzarlo anche per eseguire le attività che fanno parte dei processi di provisioning e configurazione. Ad esempio, se devi eseguire uno strumento di gestione della configurazione nell'ambito delle procedure di provisioning e configurazione, puoi utilizzare il sistema di orchestrazione dei carichi di lavoro come faresti con qualsiasi altro carico di lavoro.
Questa best practice ti aiuta a garantire che tu possa orchestrare i carichi di lavoro in esecuzione sui tuoi dispositivi.
Verifica, autentica e connetti i dispositivi
Quando devi verificare se i tuoi dispositivi devono connettersi a sistemi esterni, come altri dispositivi o a un backend, prendi in considerazione i consigli riportati nelle sezioni seguenti.
Questa best practice ti aiuta a:
- Progetta canali di comunicazione sicuri per i tuoi dispositivi.
- Evita potenziali backdoor che aggirino il perimetro di sicurezza dei tuoi dispositivi.
- Verifica che i tuoi dispositivi non espongano interfacce non autorizzate che un malintenzionato potrebbe sfruttare.
Pratiche di connessione da applicare
- Verifica l'identità delle altre parti che effettuano richieste di informazioni prima di scambiare qualsiasi informazione.
- Verifica che le informazioni trasmesse non transitino su canali inaspettati.
- Affidati a trusted execution environment per gestire i secret, ad esempio chiavi di crittografia, chiavi di autenticazione e password.
- Verifica l'integrità e l'autenticità di qualsiasi immagine del sistema operativo o del firmware prima dell'uso.
- Verifica la validità, l'integrità e l'autenticità di qualsiasi configurazione fornita dall'utente.
- Limita la superficie di attacco non installando software non necessario erimuovendo quello già esistente sui tuoi dispositivi.
- Limita l'uso di operazioni e account con privilegi.
- Verifica l'integrità della cover del dispositivo se deve resistere a manipolazione e manomissione fisica.
Pratiche di connessione da evitare
- Non trasmettere informazioni sensibili tramite canali non criptati.
- Evita di lasciare aperti accessi privilegiati, ad esempio:
- Porte seriali e console seriali virtuali o fisiche con privilegi elevati, anche se le porte sono accessibili solo se qualcuno manomette fisicamente il dispositivo.
- Endpoint che rispondono alle richieste provenienti dalla rete e che possono eseguire operazioni con privilegi.
- Non fare affidamento su credenziali hardcoded nelle immagini del sistema operativo o del firmware, nella configurazione o nel codice sorgente.
- Non rivelare informazioni che potrebbero aiutare un avversario a raccogliere informazioni per ottenere privilegi elevati. Ad esempio, devi criptare i dati sui tuoi dispositivi e disattivare i sistemi di monitoraggio e registrazione non necessari sui dispositivi di produzione.
- Non consentire a utenti e carichi di lavoro di eseguire codice arbitrario.
Monitorare i dispositivi
La raccolta di informazioni sullo stato dei dispositivi senza intervento manuale è essenziale per l'affidabilità del tuo ambiente. Assicurati che i tuoi dispositivi registrino automaticamente tutti i dati di cui hai bisogno. Esistono due motivi principali per raccogliere e monitorare i dati:
- Per aiutarti ad assicurarti che i tuoi dispositivi funzionino come previsto.
- Per rilevare proattivamente i problemi ed eseguire la manutenzione preventiva.
Ad esempio, puoi raccogliere metriche ed eventi di monitoraggio con Cloud Monitoring.
Per aiutarti a esaminare e risolvere i problemi, ti consigliamo di progettare e implementare procedure per raccogliere dati diagnostici ad alta risoluzione, come informazioni dettagliate su monitoraggio, tracciamento e debug, oltre alle procedure che monitorano i dispositivi durante il loro normale funzionamento. Raccogliere dati diagnostici ad alta risoluzione e trasferirli utilizzando una rete può essere costoso in termini di risorse del dispositivo, come potenza di calcolo, archiviazione dei dati ed energia elettrica. Per questo motivo, ti consigliamo di attivare le procedure per raccogliere dati diagnostici ad alta risoluzione solo quando necessario e solo per i dispositivi che richiedono ulteriori accertamenti. Ad esempio, se uno dei tuoi dispositivi non funziona come previsto e i dati di monitoraggio regolari che il dispositivo registra non sono sufficienti per diagnosticare accuratamente il problema, puoi attivare la raccolta dei dati ad alta risoluzione per quel dispositivo in modo che registri più informazioni che possono aiutarti a esaminare le cause del problema.
Questa best practice ti consente di non lasciare i dispositivi in uno stato sconosciuto e di disporre di dati sufficienti per determinare se e come funzionano.
Supportare l'avvio e gli upgrade non supervisionati
Quando progetti le procedure di provisioning e configurazione, assicurati che i dispositivi siano in grado di eseguire l'avvio automatico e che sia presente l'infrastruttura necessaria. Se implementi un meccanismo di avvio automatico che supporta sia il primo avvio sia l'implementazione di upgrade over-the-air, aumenti la manutenibilità della tua infrastruttura. L'utilizzo dell'avvio unattended ti consente di non dover intervenire manualmente su ogni dispositivo durante l'avvio o l'upgrade. La gestione manuale di un parco di dispositivi di grandi dimensioni è soggetta a errori perché gli operatori potrebbero perdere o eseguire erroneamente le azioni oppure non avere tempo sufficiente per eseguire le azioni richieste per ogni dispositivo del parco.
Inoltre, non devi preparare ogni dispositivo in anticipo per avviare l'immagine del firmware o del sistema operativo corretto. Ad esempio, puoi rilasciare una nuova versione di un'immagine del sistema operativo o del firmware e renderla disponibile come una delle opzioni che i tuoi dispositivi possono scegliere quando ricevono le istruzioni di avvio dalla rete.
Questa best practice ti aiuta ad assicurarti che i tuoi dispositivi possano eseguire avviamenti e aggiornamenti automatici e non presidiati.
Progettare e implementare processi resilienti
Anche con procedure di provisioning e configurazione completamente automatiche, possono verificarsi errori che ne impediscono il completamento corretto, lasciando i dispositivi in uno stato incoerente. Assicurati che i tuoi dispositivi siano in grado di recuperare da questi errori implementando meccanismi di ripetizione e riserva. Ad esempio, quando un dispositivo non riesce a completare un'attività che fa parte dei processi di provisioning e configurazione, dovrebbe tentare automaticamente di recuperare da questo errore. Dopo che il dispositivo si è ripreso dall'errore o è tornato a uno stato di funzionamento, può riprendere le procedure in esecuzione dal punto in cui si sono verificati gli errori.
Questa best practice ti aiuta a progettare e implementare processi di provisioning e configurazione resilienti.
Supportare l'intero ciclo di vita dei dispositivi
Quando progetti i processi di provisioning e configurazione, assicurati che possano gestire l'intero ciclo di vita del dispositivo. La gestione efficace del ciclo di vita dei dispositivi include la pianificazione della dismissione e dello smaltimento, anche se i dispositivi dovrebbero funzionare per un periodo di tempo relativamente lungo.
Se non gestisci il ciclo di vita dei tuoi dispositivi, potresti riscontrare problemi, come i seguenti:
- Costi elevati e duraturi: l'introduzione del supporto per la gestione del ciclo di vita dopo aver implementato le procedure di provisioning e configurazione può aumentare i costi. Se pianifichi questo supporto nelle prime fasi del design, potresti ridurre questi costi. Ad esempio, se le procedure di provisioning e configurazione non supportano l'intero ciclo di vita dei dispositivi, potresti dover intervenire manualmente su ogni dispositivo per gestire correttamente ogni fase del ciclo di vita. L'intervento manuale può essere costoso e spesso non è scalabile.
- Maggiore rigidità: il mancato supporto della gestione del ciclo di vita potrebbe portare alla mancata possibilità di aggiornare o gestire i dispositivi. Ad esempio, se non disponi di un meccanismo per spegnere i dispositivi in modo sicuro ed efficiente, potrebbe essere difficile gestire il loro fine del ciclo di vita e lo smaltimento finale.
Passaggi successivi
- Leggi Architetture di dispositivi connessi su Google Cloud.
- Per altre architetture di riferimento, diagrammi e best practice, visita il Cloud Architecture Center. .
Collaboratori
Autore: Marco Ferrari | Cloud Solutions Architect