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 progettare e implementare processi di provisioning e configurazione affidabili e automatizzati per i dispositivi in esecuzione ai perimetri del tuo ambiente, come ad esempio:

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

Il provisioning e la configurazione manuali di un vasto parco di dispositivi sono soggetti a errori umani e non vengono scalati di pari passo con la crescita del parco risorse. Ad esempio, potresti dimenticare di eseguire un'attività di configurazione o provisioning critico oppure di fare affidamento su processi parzialmente o interamente non documentati. I processi di configurazione e provisioning completamente automatici e affidabili consentono di risolvere questi problemi. Ti aiutano anche a gestire il ciclo di vita di ogni dispositivo, dalla produzione fino al ritiro e allo smaltimento.

Terminologia

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

  • Dispositivo periferico: un dispositivo di cui esegui il deployment ai margini del tuo ambiente in prossimità dei dati che vuoi elaborare.
  • Processo di provisioning: l'insieme di attività che devi completare per preparare un dispositivo per la configurazione.
  • Processo di configurazione: l'insieme di attività che devi completare per rendere un dispositivo pronto per l'uso in un ambiente specifico.
  • Gestione della configurazione: l'insieme di attività che esegui continuamente per gestire la configurazione dell'ambiente e dei dispositivi.
  • Immagine di base: un sistema operativo (OS) minimo o un'immagine firmware prodotta dalla tua azienda o prodotta da un dispositivo o un produttore del sistema operativo.
  • Immagine dorata: un'immagine del sistema operativo o del firmware immutabile che crei per i tuoi dispositivi o che preparati da un'immagine di base. Le immagini dorate includono tutti i dati e le informazioni di configurazione necessari ai dispositivi per eseguire le attività assegnate. Puoi preparare diverse immagini dorate per svolgere attività diverse. I sinonimi di tipi di immagini dorati includono sapori, spin e archetipi.
  • Immagine argento: un'immagine del firmware o del sistema operativo preparata per i tuoi dispositivi applicando modifiche minime a un'immagine dorata o a un'immagine di base. I dispositivi che eseguono un'immagine argento completano il provisioning e la configurazione al primo avvio, in base alle esigenze dei casi d'uso supportati.
  • Dispositivo originale: un dispositivo che esegue il bootstrap del tuo ambiente senza dipendenze esterne.
  • Avvio della rete: l'insieme di tecnologie che consentono 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 il provisioning e la configurazione. Ogni best practice viene discussa in una propria sezione.

Automatizzare i processi di provisioning e configurazione

Durante il primo avvio, o ogni volta che è necessario, devono essere in grado di eseguire il provisioning e la configurazione automatica utilizzando solo l'immagine del software installata.

Per evitare di implementare la logica di cui hai bisogno durante i processi di provisioning e configurazione, puoi usare strumenti che ti offrono le primitive necessarie per orchestrare e implementare questi processi. Ad esempio, puoi utilizzare cloud-init e la relativa origine dati NoCloud, insieme allo script o a uno strumento di gestione della configurazione, 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 automatizzato di conformità, come InSpec, per verificare che i processi di provisioning e configurazione funzionino come previsto.

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

Evita dispositivi speciali

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

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

  • Tratta i dispositivi come se fossero altri dispositivi dello stesso archetipo. In questo modo dimostri che hai efficienza operativa.
  • Sostituisci il dispositivo con dispositivi dello stesso archetipo senza ulteriori personalizzazioni. In questo modo dimostri di aver implementato correttamente questi archetipi.

Questa best practice garantisce la riduzione della varianza nel parco dispositivi, con una conseguente minore frammentazione nel tuo ambiente e nei processi di provisioning e configurazione.

Utilizza dispositivi iniziali per eseguire il bootstrap del tuo ambiente

Quando esegui il provisioning e la configurazione dei dispositivi, potresti riscontrare un problema di dipendenza circolare: i tuoi dispositivi hanno bisogno di supportare l'infrastruttura per il provisioning e la configurazione, ma l'infrastruttura non è presente perché devi comunque eseguirne il provisioning e la configurazione.

Puoi risolvere il problema con i dispositivi di origine. I dispositivi di origine hanno uno scopo speciale temporaneo. Dopo aver completato le attività per cui lo scopo speciale è stato progettato, il dispositivo ne modifica il comportamento e lo stato in base all'archetipo pertinente.

Ad esempio, se utilizzi cloud-init per inizializzare automaticamente i dispositivi, potrebbe essere necessario configurare un'origine dati NoCloud-init Cloud nei seguenti modi:

  1. Fornisci i dati dell'origine dati NoCloud al dispositivo originale tramite un file system.
  2. Attendi che il dispositivo di origine completi il provisioning e la configurazione personali con il suo scopo speciale, che include la pubblicazione dei dati dell'origine dati NoCloud su altri dispositivi nella rete.

    I processi di provisioning e configurazione sul dispositivo di origine attendino il raggiungimento delle condizioni per il raggiungimento dello scopo speciale temporaneo del dispositivo di origine. Alcuni esempi di queste condizioni sono:

    • Esistono altri dispositivi nell'ambiente che servono i dati dell'origine dati NoCloud sulla rete?
    • Il numero di nodi nel cluster è sufficiente?
    • 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 vengono ripristinati perché le condizioni per rimuovere lo scopo speciale del dispositivo di origine vengono soddisfatte: esistono altri dispositivi nel parco risorse che gestiscono i dati dell'origine dati NoCloud sulla rete.

  5. Il processo di provisioning e configurazione sul dispositivo originale elimina lo scopo speciale, rendendo il dispositivo originale indistinguibile da altri dispositivi dello stesso archetipo.

Questa best practice garantisce che sia possibile eseguire il bootstrap del tuo ambiente anche senza supportare l'infrastruttura e senza violare la best practice Evita dispositivi speciali.

Riduci al minimo i tempi di inattività dei dispositivi

Quando progetti i tuoi dispositivi periferici, mantieni almeno la necessità di archiviare le informazioni stateful. I dispositivi periferici potrebbero avere risorse hardware limitate o essere implementati in ambienti difficili. Ridurre al minimo le informazioni stateful necessarie per il funzionamento semplifica il processo di provisioning, configurazione, backup e ripristino, in quanto puoi trattare questi dispositivi in modo omogeneo. Se un dispositivo stateless edge inizia a funzionare in modo anomalo e non può essere recuperato, ad esempio, puoi scambiarlo con un altro dispositivo dello stesso archetipo con interruzioni minime o perdita di dati.

Questa best practice ti aiuta a evitare problemi imprevisti dovuti a perdita di dati o processi troppo complessi. 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 tuoi dispositivi e per risparmiare risorse dei dispositivi, personalizza le immagini del sistema operativo e del firmware prima di renderli disponibili. Ad esempio, puoi installare le dipendenze direttamente nell'immagine, anziché installarle ogni volta che un dispositivo si avvia.

Quando prepari le immagini del sistema operativo e del firmware per i dispositivi, inizi da un'immagine di base. Quando personalizzi l'immagine di base, puoi procedere come segue:

  • Realizza immagini dorate. Le immagini dorate contengono tutte le dipendenze dell'immagine, in modo che i dispositivi non debbano installarle al primo avvio. La produzione di immagini dorate potrebbe essere un'attività complessa, ma consente ai dispositivi di risparmiare tempo e risorse durante il provisioning e la configurazione.
  • Realizza immagini d'argento. A differenza delle immagini dorate, i dispositivi che eseguono immagini argento completano tutti i processi di provisioning e configurazione durante il primo avvio. La produzione di immagini argento può essere meno complessa della produzione di immagini dorate, ma i dispositivi su cui viene eseguita l'immagine argento passano più tempo e risorse durante il provisioning e la configurazione.

Puoi personalizzare le immagini del sistema operativo e del firmware come parte dei tuoi processi di integrazione continua e deployment continuo (CI/CD) e rendere automaticamente disponibili le immagini personalizzate sui 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 rispetto alle immagini personalizzate.
  2. Pubblica le immagini personalizzate in un repository in cui i tuoi dispositivi possono ottenerle.

Se il tuo ambiente CI/CD e il sistema operativo o il firmware per cui devi creare immagini utilizzano architetture hardware diverse, puoi utilizzare strumenti come QEMU per emulare tali architetture. Ad esempio, puoi emulare l'architettura hardware della famiglia ARM in un'architettura x86_64.

Per personalizzare le immagini del sistema operativo o del firmware, devi poterle modificare e verificare queste modifiche in un ambiente di test prima di installarle sui dispositivi periferici. Strumenti come chroot consentono di modificare virtualmente ma non modificare fisicamente la directory principale 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 anziché / e installa PACKAGENAME in quella directory.

Questa best practice ti aiuta a personalizzare le immagini del sistema operativo e del firmware prima di renderle disponibili per i tuoi dispositivi.

Orchestra in modo affidabile i carichi di lavoro in esecuzione sui 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, ad esempio Kubernetes, è adatto a carichi di lavoro con requisiti di orchestrazione o gestione del ciclo di vita complessi. Questi sistemi sono adatti anche per carichi di lavoro che comprendono più componenti. In entrambi i casi, significa che non devi necessariamente implementare la logica di gestione del ciclo di vita dell'orchestrazione e del carico di lavoro. Se i dispositivi sono con risorse limitate, puoi installare una distribuzione Kubernetes leggera che necessita di meno risorse rispetto a quella canonica, come MicroK8s, K3s o Cluster Anthos su Bare Metal installati con il profilo perimetrale.
  • Un sistema init: l'utilizzo di un sistema init, come systemd, è adatto ai carichi di lavoro con le seguenti caratteristiche:

    • Requisiti di orchestrazione semplici
    • Mancanza di risorse per supportare un sistema di orchestrazione dei carichi di lavoro
    • Carichi di lavoro che non possono essere inseriti nei container

Dopo aver configurato il sistema per orchestrare i carichi di lavoro, puoi utilizzarlo anche per eseguire attività che fanno parte del tuo processo di provisioning e configurazione. Se devi eseguire uno strumento di gestione della configurazione come parte dei processi di provisioning e configurazione, ad esempio, 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 Avvio automatico dei nodi GKE con DaemonSet. L'articolo descrive come utilizzare Kubernetes per eseguire attività di provisioning e configurazione con privilegi e senza privilegi sui nodi del cluster.

Questa best practice garantisce 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, valuta i consigli nelle seguenti sottosezioni.

Pratiche di connessione per l'applicazione

  • Autentica le altre parti che inviano richieste di informazioni prima di scambiare informazioni.
  • Verifica che le informazioni trasmesse non trasmettano canali inaspettati.
  • Affidati a ambienti di esecuzione attendibili per gestire i secret, come chiavi di crittografia, chiavi di autenticazione e password.
  • Verifica l'integrità e l'autenticità di qualsiasi sistema operativo o immagine 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 inutili e rimuovendo quelli già esistenti sui tuoi dispositivi.
  • Limitare l'utilizzo di account e operazioni con privilegi.
  • Verifica l'integrità della custodia del dispositivo se deve resistere alla manipolazione e alla manomissione fisica.

Pratiche di connessione da evitare

  • Non trasmettere informazioni sensibili su canali non criptati.
  • Evita di lasciare aperto l'accesso con privilegi, ad esempio:
    • Porte seriali e console seriali fisiche o virtuali con privilegi elevati, anche se sono accessibili solo se qualcuno manomette manualmente 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 utente malintenzionato 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 ti consente di:

  • Progettare canali di comunicazione sicuri per i tuoi dispositivi.
  • Evita potenziali backdoor che eludono il perimetro della sicurezza dei tuoi dispositivi.
  • Verifica che i dispositivi non mostrino interfacce non autorizzate che un attacco potrebbe sfruttare.

Monitora i tuoi dispositivi

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

Per agevolare l'indagine e la risoluzione dei problemi, ti consigliamo di progettare e implementare processi per raccogliere dati diagnostici ad alta risoluzione, come il monitoraggio dettagliato, il tracciamento e il debug delle informazioni, oltre ai processi che monitorano i tuoi 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 di calcolo, archiviazione di dati ed elettricità. Per questo motivo, ti consigliamo di attivare i processi 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 diagnosticare accuratamente il problema, puoi attivare la raccolta di dati ad alta risoluzione per il dispositivo in modo che segnali ulteriori informazioni che possano aiutarti a 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 stabilire se e come le prestazioni stanno funzionando.

Supporta l'avvio e gli upgrade automatici

Quando progetti i tuoi processi di provisioning e configurazione, assicurati che i dispositivi siano in grado di avviarsi automaticamente e di disporre dell'infrastruttura necessaria. L'implementazione di un meccanismo di avvio automatico che supporti sia il primo avvio sia la distribuzione di upgrade over-the-air, migliora la manutenibilità della tua infrastruttura. L'utilizzo dell'avvio automatico ti impedisce di partecipare manualmente a ogni dispositivo durante l'avvio o l'upgrade. La partecipazione manuale a un numero elevato di dispositivi è soggetta a errori, perché gli operatori potrebbero non riuscire o eseguire azioni in modo errato oppure potrebbero non avere abbastanza tempo per eseguire le azioni richieste per ogni dispositivo del parco risorse.

Inoltre, non devi preparare ogni dispositivo in anticipo per avviare l'immagine corretta del sistema operativo o del firmware. Ad esempio, puoi rilasciare una nuova versione di un'immagine del sistema operativo o del firmware e rendere disponibile tale versione tra le opzioni che i tuoi dispositivi possono scegliere quando ricevono le istruzioni di avvio dalla rete.

Questa best practice ti aiuta a garantire che i dispositivi possano eseguire avvio e upgrade in automatico.

Progetta e implementa processi resilienti

Anche se i processi di configurazione e provisioning sono completamente automatizzati, possono verificarsi errori che impediscono il completamento corretto di questi processi, lasciando i dispositivi in uno stato incoerente. Assicurati che i dispositivi siano in grado di recuperare da tali errori implementando meccanismi di ripetizione e di riserva. Quando un dispositivo non riesce a completare un'attività che fa parte dei processi di provisioning e configurazione, ad esempio, dovrebbe tentare di eseguire automaticamente il ripristino da questo errore. Dopo il ripristino del dispositivo dall'errore o il ripristino dello stato di funzionamento, può riprendere l'esecuzione dei processi dal momento in cui i processi non sono andati a buon fine.

Questa best practice ti aiuta a progettare e implementare i processi di configurazione e provisioning resilienti.

Supporta l'intero ciclo di vita dei tuoi dispositivi

Quando progetti i processi di provisioning e configurazione, assicurati che possano gestire l'intero ciclo di vita dei dispositivi. Una gestione efficace dei cicli di vita dei dispositivi prevede la pianificazione per la terminazione e lo smaltimento, anche se i dispositivi dovrebbero essere utilizzati per un periodo di tempo relativamente lungo.

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

  • Costi sostenuti 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. Pianificando questa assistenza nelle prime fasi del processo, puoi ridurre i costi. Se i processi di provisioning e configurazione non supportano l'intero ciclo di vita dei dispositivi, ad esempio, 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 scala.
  • Aumento della rigidità: il mancato supporto della gestione del ciclo di vita potrebbe alla fine causare l'impossibilità di aggiornare o gestire i dispositivi. Se non hai un meccanismo per spegnere i tuoi dispositivi in modo sicuro ed efficiente, ad esempio, potrebbe essere difficile gestire la loro fine del ciclo di vita e assicurare lo smaltimento finale.

Passaggi successivi