Best practice per il provisioning e la configurazione automatici di sistemi e server perimetrali e bare metal

Last reviewed 2023-02-23 UTC

Questo documento suggerisce le best practice per la progettazione e l'implementazione di processi di provisioning e configurazione affidabili e automatizzati per i dispositivi in esecuzione alle periferiche del tuo ambiente, ad esempio:

Leggi questo documento se progetti processi di provisioning e configurazione per dispositivi periferici e IoT o se vuoi saperne di più sulle best practice per il provisioning di questi tipi di dispositivi.

Questo documento fa parte di una serie di documenti che forniscono informazioni sulle architetture IoT su Google Cloud e sulla migrazione da IoT Core. Gli altri documenti di questa serie includono:

Il provisioning e la configurazione manuale di un ampio parco dispositivi sono soggetti a errori umani e non vengono scalati di pari passo con l'aumento del parco dispositivi. Ad esempio, potresti dimenticare di eseguire un'attività di provisioning o di configurazione critica o di fare affidamento su processi parzialmente o completamente non documentati. Processi di provisioning e configurazione completamente automatizzati e affidabili aiutano a risolvere questi problemi. Inoltre, ti aiutano a gestire il ciclo di vita di ciascun dispositivo, dalla produzione alla disattivazione e allo smaltimento.

Terminologia

I termini seguenti sono importanti per capire come implementare e creare processi di configurazione e provisioning automatici per i dispositivi:

  • Dispositivo Edge: un dispositivo di cui esegui il deployment a livello perimetrale del tuo ambiente, vicino ai dati che vuoi elaborare.
  • Processo di provisioning: l'insieme di attività da completare per preparare un dispositivo alla configurazione.
  • Procedura di configurazione: l'insieme di attività da completare per rendere un dispositivo pronto per il funzionamento in un ambiente specifico.
  • Gestione della configurazione: l'insieme di attività che esegui in modo continuo per gestire la configurazione del tuo ambiente e dei tuoi dispositivi.
  • Immagine di base: un sistema operativo (OS) o un'immagine firmware prodotta dalla tua azienda o da un produttore di dispositivi o sistemi operativi.
  • Immagine aurea: un'immagine del sistema operativo o del firmware immutabile creata per i tuoi dispositivi o preparata da un'immagine di base. Le immagini Golden includono tutti i dati e le informazioni di configurazione di cui i dispositivi hanno bisogno per svolgere le attività assegnate. Puoi preparare varie immagini dorate per portare a termine attività diverse. I sinonimi per i tipi di immagini dorate includono sapori, spin e archetipi.
  • Immagine argento: un'immagine del sistema operativo o del firmware che hai preparato per i tuoi dispositivi applicando modifiche minime a un'immagine dorata o di base. I dispositivi che eseguono un'immagine Silver completano il proprio provisioning e la configurazione al primo avvio, in base alle esigenze dei casi d'uso che questi dispositivi devono supportare.
  • Dispositivo seed: un dispositivo che esegue il bootstrap del tuo ambiente senza dipendenze esterne.
  • Avvio di 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.

Best practice per i processi di provisioning e configurazione

Per impostare gli obiettivi ed evitare gli errori più comuni, applica le seguenti best practice per provisioning e configurazione. Ogni best practice viene discussa nella propria sezione.

Automatizza i processi di provisioning e configurazione

Durante il primo avvio, o ogni volta che è necessario, i dispositivi dovrebbero essere in grado di eseguire il provisioning e la configurazione autonomamente utilizzando solo l'immagine software installata al loro interno.

Per evitare di implementare la logica necessaria durante i processi di provisioning e configurazione, puoi utilizzare strumenti che offrono le primitive necessarie per orchestrare e implementare questi processi. Ad esempio, puoi utilizzare cloud-init e la relativa origine dati NoCloud, insieme allo scripting o a uno strumento di gestione delle configurazioni come Ansible, Puppet o Chef, in esecuzione sull'host locale.

Per progettare processi di provisioning e configurazione affidabili, assicurati che tutti i passaggi e le attività eseguiti durante tali processi siano validi, possibilmente in modo automatizzato. Ad esempio, puoi utilizzare un framework di test di conformità automatizzato, come InSpec, per verificare che i processi di provisioning e configurazione stiano funzionando come previsto.

Questa best practice consente di evitare single point of failure e la necessità di un intervento manuale quando devi completare il provisioning e la configurazione del dispositivo.

Evita dispositivi per scopi speciali

Quando progetti i tuoi dispositivi periferici, riduci al minimo la loro variabilità in termini di scopo e specialità. Questo consiglio non significa che tutti i dispositivi periferici devono essere uguali tra loro o condividere lo stesso scopo, ma devono essere il più omogenei possibile. Ad esempio, puoi definire gli archetipi dei dispositivi in base ai tipi di carico di lavoro che devono supportare. Poi puoi distribuire e gestire i dispositivi in base alle proprietà degli archetipi.

Per assicurarti di seguire questa best practice, verifica di poter scegliere un dispositivo in modo casuale da quelli di un determinato archetipo, quindi procedi nel seguente modo:

  • Utilizza il dispositivo come qualsiasi altro dispositivo dello stesso archetipo. In questo modo dimostri di avere efficienza operativa.
  • Sostituire il dispositivo con dispositivi dello stesso archetipo senza ulteriori personalizzazioni. In questo modo dimostri di aver implementato correttamente questi archetipi.

Questa best practice garantisce di ridurre la varianza nel parco dispositivi, con una conseguente minore frammentazione nell'ambiente e nei processi di provisioning e configurazione.

Usa i dispositivi di origine per eseguire il bootstrap del tuo ambiente

Durante il provisioning e la configurazione dei dispositivi, potresti riscontrare un problema di dipendenza circolare: i dispositivi hanno bisogno di un'infrastruttura di supporto per eseguire il provisioning e la configurazione autonomamente, ma questa infrastruttura non è attiva perché devi ancora eseguirne il provisioning e configurarla.

Puoi risolvere questo problema con i dispositivi di origine. I dispositivi di origine hanno uno scopo speciale e temporaneo. Dopo aver completato le attività per le quali è stato progettato lo scopo speciale, il dispositivo adatta il proprio comportamento e il proprio stato all'archetipo pertinente.

Ad esempio, se utilizzi cloud-init per inizializzare automaticamente i tuoi dispositivi, potresti dover configurare un'origine dati NoCloud cloud-init nei seguenti modi:

  1. Fornisci i dati dell'origine dati NoCloud al dispositivo di origine tramite un file system.
  2. Attendi che il dispositivo di origine completi il proprio provisioning e la propria configurazione con il suo scopo speciale, che include la distribuzione dei dati dell'origine dati NoCloud ad altri dispositivi sulla rete.

    I processi di provisioning e configurazione sul dispositivo di origine attendono quindi che vengano soddisfatte le condizioni per eliminare lo scopo speciale temporaneo del dispositivo di origine. Alcuni esempi di queste condizioni sono:

    • Esistono altri dispositivi nell'ambiente che gestiscono i dati dell'origine dati NoCloud sulla rete?
    • Ci sono abbastanza nodi nel cluster?
    • Il primo backup è stato completato?
    • Il sito di ripristino di emergenza è pronto?
  3. Esegui il provisioning e la configurazione di altri dispositivi che scaricano i dati dell'origine dati NoCloud sulla rete dal dispositivo di origine. Alcuni dispositivi devono essere in grado di gestire i dati dell'origine dati NoCloud sulla rete.

  4. I processi di provisioning e configurazione sul dispositivo di origine riprendono perché le condizioni per abbandonare lo scopo speciale del dispositivo di origine sono soddisfatte: nel parco risorse sono presenti altri dispositivi che gestiscono i dati dell'origine dati NoCloud sulla rete.

  5. I processi di provisioning e configurazione sul dispositivo di origine eliminano lo scopo speciale, rendendo il dispositivo di origine indistinguibile da altri dispositivi dello stesso archetipo.

Questa best practice garantisce di poter eseguire il bootstrap del tuo ambiente anche senza supportare l'infrastruttura e senza violare la best practice per evitare i dispositivi per uso speciale.

Riduci al minimo lo statefulness dei dispositivi

Durante la progettazione dei dispositivi periferici, mantieni come minimo la necessità di archiviare le informazioni stateful. I dispositivi periferici potrebbero avere risorse hardware limitate o essere distribuiti in ambienti difficili. Ridurre al minimo le informazioni stateful necessarie per il funzionamento semplifica i processi di provisioning, configurazione, backup e ripristino perché è possibile trattare questi dispositivi in modo omogeneo. Se un dispositivo periferico stateless inizia a funzionare in modo non corretto e non è recuperabile, ad esempio, puoi sostituirlo con un altro dispositivo dello stesso archetipo riducendo al minimo le interruzioni o la perdita di dati.

Questa best practice consente di evitare problemi imprevisti dovuti alla perdita di dati o a causa di processi troppo complessi. La maggior parte delle complessità deriva dalla esigenza di supportare un parco dispositivi eterogenei.

Crea automaticamente immagini del sistema operativo e del firmware

Per evitare dispendiose 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 renderle disponibili. Puoi, ad esempio, installare le dipendenze direttamente nell'immagine anziché installarle al primo avvio di ogni dispositivo.

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 effettuare le seguenti operazioni:

  • Produci immagini dorate. Le immagini Golden contengono tutte le dipendenze nell'immagine, così i dispositivi non devono installarle al primo avvio. Realizzare immagini dorate può essere un'attività complessa, ma consente ai tuoi dispositivi di risparmiare tempo e risorse durante il provisioning e la configurazione.
  • Produci immagini d'argento. A differenza delle immagini finali, i dispositivi che eseguono queste immagini completano tutti i processi di provisioning e di configurazione durante il primo avvio. La creazione di immagini argento può essere meno complessa rispetto alla produzione di immagini di colore argento, ma i dispositivi che eseguono un'immagine argento dedicano 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 continuo (CI/CD) e rendere automaticamente le immagini personalizzate disponibili per i tuoi dispositivi dopo la convalida. I processi CI/CD implementati con uno strumento come Cloud Build, Azioni GitHub, GitLab CI/CD o Jenkins possono eseguire la seguente sequenza di attività:

  1. Esegui una convalida automatica delle immagini personalizzate.
  2. Pubblica le immagini personalizzate in un repository dove i tuoi dispositivi possono ottenerle.

Se il tuo ambiente CI/CD e il sistema operativo o il firmware per il quale devi creare le immagini utilizzano architetture hardware diverse, puoi utilizzare strumenti come QEMU per emulare queste architetture. 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 poterle modificare e verificare le modifiche in un ambiente di test prima di installarle sui dispositivi periferici. Strumenti come chroot consentono di modificare virtualmente ma non fisicamente la directory radice prima di eseguire un comando.

Ad esempio, l'esecuzione del comando chroot /mnt/test-image apt-get install PACKAGENAME fa sì che il sistema si comporti come se /mnt/test-image fosse la directory radice del sistema operativo o l'immagine firmware invece di / e installa PACKAGENAME in questa directory.

Questa best practice consente di personalizzare le immagini del sistema operativo e del firmware prima di renderle disponibili per i dispositivi.

Orchestra 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 orchestrare i carichi di lavoro e gestirne il 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 carichi di lavoro con requisiti di orchestrazione o gestione del ciclo di vita complessi. Questi sistemi sono adatti anche a carichi di lavoro che comprendono più componenti. In entrambi i casi, non devi implementare personalmente la logica di orchestrazione e di gestione del ciclo di vita dei carichi di lavoro. Se i tuoi dispositivi sono vincolati dalle 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 perimetrale.
  • Un sistema di inizializzazione: l'utilizzo di un sistema di inizializzazione, come systemd, è adatto per carichi di lavoro con le seguenti caratteristiche:

    • Semplici requisiti di orchestrazione
    • Mancanza di risorse per supportare un sistema di orchestrazione dei carichi di lavoro
    • Carichi di lavoro che non possono essere inseriti in container

Dopo aver impostato il sistema per l'orchestrazione dei carichi di lavoro, puoi utilizzarlo anche per eseguire attività che fanno parte dei tuoi processi di provisioning e configurazione. Se, ad esempio, devi eseguire uno strumento di gestione delle configurazioni come parte dei processi di provisioning e configurazione, puoi utilizzare il sistema di orchestrazione dei carichi di lavoro come faresti con qualsiasi altro carico di lavoro. Per un esempio di questa metodologia, consulta Eseguire automaticamente il bootstrap dei nodi GKE con i DaemonSet. L'articolo descrive come utilizzare Kubernetes per eseguire attività di provisioning e configurazione con e senza privilegi sui nodi del cluster.

Questa best practice aiuta a garantire di poter orchestrare i carichi di lavoro in esecuzione sui tuoi dispositivi.

Verificare, autenticare e connettere i dispositivi

Quando devi verificare se i tuoi dispositivi devono connettersi a sistemi esterni, ad esempio altri dispositivi o a un backend, considera i consigli nelle sottosezioni seguenti.

Pratiche di connessione da applicare

  • Autenticare le altre parti che effettuano richieste di informazioni prima di scambiare qualsiasi informazione.
  • Verifica che le informazioni trasmesse non vadano attraverso canali inaspettati.
  • Affidati ad ambienti di esecuzione affidabili per gestire segreti come 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.
  • Verificare la validità, l'integrità e l'autenticità di qualsiasi configurazione fornita dall'utente.
  • Limita la superficie di attacco evitando di installare software non necessari e rimuovendo quelli già esistenti sui tuoi dispositivi.
  • Limita l'utilizzo di operazioni e account con privilegi.
  • Verifica l'integrità della custodia del dispositivo se quest'ultima deve resistere alla manipolazione fisica e alle manomissioni.

Pratiche di connessione da evitare

  • Non trasmettere informazioni sensibili tramite canali non criptati.
  • Evita di lasciare aperto l'accesso privilegiato, ad esempio:
    • Porte seriali e console seriali virtuali o fisiche con privilegi elevati, anche se le porte sono accessibili solo se qualcuno manomette 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, nella configurazione o nel codice sorgente del sistema operativo o del firmware.
  • Non rivelare informazioni che potrebbero aiutare un avversario a raccogliere informazioni per ottenere privilegi elevati. Ad esempio, dovresti criptare i dati sui tuoi dispositivi e disattivare i sistemi di tracciamento e logging non necessari sui dispositivi di produzione.
  • Non consentire a utenti e carichi di lavoro di eseguire codice arbitrario.

Questa best practice consente di:

  • Progetta canali di comunicazione sicuri per i tuoi dispositivi.
  • Evita potenziali backdoor che aggirano il perimetro di sicurezza dei tuoi dispositivi.
  • Verifica che i tuoi dispositivi non espongono interfacce non autorizzate che un utente malintenzionato potrebbe sfruttare.

Monitora i tuoi dispositivi

La raccolta di informazioni sullo stato dei dispositivi senza intervento manuale è essenziale per l'affidabilità del tuo ambiente. Assicurati che i tuoi dispositivi segnalino automaticamente tutti i dati di cui hai bisogno. I motivi principali per la raccolta e il monitoraggio dei dati sono due. Il primo motivo per raccogliere e monitorare i dati è assicurarti che i tuoi dispositivi funzionino come previsto. Il secondo motivo per raccogliere e monitorare i dati è individuare in modo proattivo i problemi ed eseguire la manutenzione preventiva: ad esempio, puoi raccogliere metriche ed eventi di monitoraggio con Cloud Monitoring.

Per aiutarti a indagare e risolvere i problemi, ti consigliamo di progettare e implementare processi per raccogliere dati diagnostici ad alta risoluzione, come informazioni dettagliate su monitoraggio, tracciamento e debug, oltre ai processi che monitorano i dispositivi durante il loro normale funzionamento. Raccogliere dati diagnostici ad alta risoluzione e trasferirli tramite una rete può essere costoso in termini di risorse del dispositivo, ad esempio computing, 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 normali dati di monitoraggio segnalati dal dispositivo non sono sufficienti per eseguire una diagnosi approfondita del problema, puoi attivare la raccolta di dati ad alta risoluzione per il dispositivo in modo da visualizzare più informazioni utili per esaminare le cause del problema.

Questa best practice garantisce di non lasciare i dispositivi in uno stato sconosciuto e di disporre di dati sufficienti per determinare se e come le prestazioni dei dispositivi.

Supporta l'avvio automatico e gli upgrade

Quando progetti i processi di provisioning e configurazione, assicurati che i dispositivi possano essere avviati in modo automatico e di disporre dell'infrastruttura necessaria. Implementando un meccanismo di avvio automatico che supporta sia il primo avvio sia la distribuzione di upgrade over-the-air, aumenti la manutenibilità della tua infrastruttura. Grazie all'avvio automatico, non potrai più partecipare manualmente a ciascun dispositivo durante l'avvio o l'upgrade. L'accesso manuale a un ampio parco di dispositivi è soggetto a errori, perché gli operatori potrebbero non eseguire correttamente o eseguire le azioni in modo errato oppure non avere tempo sufficiente per eseguire le azioni richieste su tutti i dispositivi del parco risorse.

Inoltre, non è necessario preparare in anticipo ogni dispositivo per l'avvio dell'immagine del sistema operativo o del firmware corretta. Ad esempio, puoi rilasciare una nuova versione di un'immagine sistema operativo o firmware e renderla disponibile come una delle opzioni che i tuoi dispositivi possono scegliere quando recuperano le istruzioni di avvio dalla rete.

Questa best practice ti aiuta a garantire che i tuoi dispositivi possano eseguire avvii e upgrade automatici e automatici.

Progettare e implementare processi resilienti

Anche con processi di configurazione e provisioning completamente automatizzati, possono verificarsi errori che impediscono il corretto completamento di tali processi, lasciando i dispositivi in uno stato incoerente. Assicurati che i tuoi dispositivi siano in grado di recuperare da questi guasti implementando meccanismi di ripetizione e fallback. Quando, ad esempio, un dispositivo non riesce a completare un'attività che fa parte dei processi di provisioning e configurazione, dovrebbe automaticamente tentare di ripristinare un'attività dopo l'errore. Dopo che il dispositivo è stato ripristinato dall'errore o torna a uno stato di lavoro, può riprendere i processi in esecuzione dal momento in cui questi ultimi non sono andati a buon fine.

Questa best practice consente di progettare e implementare processi di provisioning e configurazione resilienti.

Supporta l'intero ciclo di vita dei tuoi dispositivi

Quando progetti i processi di provisioning e configurazione, assicurati che questi processi possano gestire l'intero ciclo di vita del dispositivo. Una gestione efficace dei cicli di vita dei dispositivi include la pianificazione della terminazione e dello smaltimento, anche se i dispositivi dovrebbero funzionare per un tempo relativamente lungo.

Se non gestisci il ciclo di vita dei tuoi dispositivi, potrebbero verificarsi dei problemi, ad esempio:

  • Costi elevati sostenuti: l'introduzione del supporto per la gestione del ciclo di vita dopo l'implementazione dei processi di provisioning e configurazione può aumentare i costi. Se pianifichi l'assistenza nelle prime fasi della progettazione, potresti ridurre questi costi. Se, ad esempio, i processi di provisioning e configurazione non supportano l'intero ciclo di vita dei dispositivi, potresti dover intervenire manualmente su ciascun dispositivo per gestire correttamente ogni fase del ciclo di vita. L'intervento manuale può essere costoso e spesso non è adeguato.
  • Maggiore rigidità: il mancato supporto della gestione del ciclo di vita potrebbe portare all'impossibilità di aggiornare o gestire i dispositivi. Se, ad esempio, ti manca un meccanismo per spegnere i dispositivi in modo sicuro ed efficiente, potrebbe essere difficile gestire la fine del ciclo di vita e lo smaltimento finale.

Passaggi successivi