Usare i contenitori con SQL Server in Linux
I contenitori aiutano le organizzazioni a creare installazioni flessibili e scalabili di SQL Server.
Wide World Importers supporta alcuni carichi di lavoro di database su larga scala che richiedono un'architettura di hosting flessibile e scalabile. Si vuole valutare la possibilità di ospitare SQL Server in ambienti virtuali, ad esempio macchine virtuali e contenitori.
In questa unità si imparerà a scegliere tra contenitori e macchine virtuali per un database.
Confronto tra macchine virtuali e contenitori
La virtualizzazione è una tecnica usata dagli amministratori per ospitare più server virtuali in un unico server fisico. Con la virtualizzazione è possibile distribuire facilmente istanze aggiuntive di SQL Server, ad esempio, senza acquistare e installare hardware aggiuntivo. Esistono due approcci comuni alla virtualizzazione:
- Macchine virtuali: quando si usano le macchine virtuali, ogni istanza è un server virtuale completo, con il proprio sistema operativo e il proprio hardware.
- Contenitori: quando si usano i contenitori, ogni istanza condivide un sistema operativo e le risorse hardware con il computer host.
Sia le macchine virtuali che i contenitori forniscono un ambiente isolato in cui le applicazioni, come SQL Server, vengono eseguite come se si trovassero in un computer fisico separato.
Le macchine virtuali hanno dimensioni maggiori e richiedono più tempo per la creazione, ma avendo un proprio sistema operativo possono usare una configurazione e hardware diversi dal computer host. È anche possibile combinare macchine virtuali con sistemi operativi diversi nello stesso host. Ad esempio, in un host Linux è possibile installare una macchina virtuale che esegue Linux e Apache per ospitare un sito Web. Potrebbe anche essere presente un'altra macchina virtuale che esegue Windows e SQL Server per ospitare un database.
I contenitori hanno dimensioni inferiori, quindi vengono caricati molto più rapidamente rispetto alle macchine virtuali. Tuttavia, se l'host esegue Linux Ubuntu, ad esempio, tutti i contenitori ospitati in quel computer devono eseguire la stessa versione di Ubuntu. In un host Linux si potrebbe installare un contenitore che esegue Linux e Apache, ma anche il contenitore di database deve eseguire Linux. Ciò è possibile a condizione di eseguire SQL Server 2017 o versione successiva.
Nel computer host è necessario installare software come Hyper-V o VirtualBox per ospitare le macchine virtuali. Per i contenitori, è possibile usare il sistema Docker, CRI-O, rkt e altri host di contenitori.
Motivi per usare le macchine virtuali
Esistono ancora situazioni in cui i contenitori non sono la soluzione migliore. Poiché i contenitori vengono eseguiti in un unico sistema operativo e condividono risorse di sistema, la sicurezza può rappresentare un problema. Se un utente malintenzionato riesce ad assumere il ruolo di utente con privilegi avanzati, alcuni vettori di attacco potrebbero ottenere l'accesso alle applicazioni. Nei contenitori, le applicazioni devono essere eseguite nello stesso sistema operativo del computer host. Non è possibile eseguire applicazioni basate su Linux in contenitori basati su Windows. Le macchine virtuali consentono invece di ospitare un computer Linux in Windows o un computer Windows in macOS, garantendo una maggiore flessibilità. Con le macchine virtuali è possibile ospitare più applicazioni, con una stretta integrazione, in una singola macchina virtuale. I contenitori ospitano tradizionalmente solo applicazioni singole.
Le macchine virtuali sono meno efficienti dei contenitori. In un determinato set di hardware è possibile eseguire in contenitori almeno il doppio del numero di applicazioni consentito con le macchine virtuali. Una macchina virtuale usa più risorse perché necessita di una copia completa del sistema operativo e delle versioni virtualizzate di tutti i componenti hardware per supportare il sistema operativo guest.
Motivi per usare i contenitori
I contenitori sono più leggeri e consentono di creare pacchetti di app in un footprint ridotto rispetto alle VM. Poiché un singolo sistema operativo ospita i contenitori, i requisiti di amministrazione sono minori. È sufficiente applicare le patch e installare gli aggiornamenti in un singolo sistema operativo, anziché in ogni sistema operativo guest in ogni macchina virtuale. I contenitori sono più piccoli e più semplici, quindi possono essere avviati in pochi secondi, a differenza delle macchine virtuali il cui avvio richiede qualche minuto.
Orchestrazione
Per orchestrare i contenitori, è possibile usare Docker Swarm, Kubernetes e altre soluzioni. Gli agenti di orchestrazione monitorano e rendono possibile la scalabilità delle app tramite i contenitori e offrono un livello di ripristino di emergenza. Microsoft fornisce strumenti ed esempi per l'uso di Kubernetes, pertanto è una scelta ottimale per l'inserimento di SQL Server in Linux in un contenitore. È disponibile un'immagine di contenitore per SQL Server in Linux da usare con Kubernetes.
SQL Server in Linux inserito in un contenitore
Un problema da affrontare quando si eseguono database in contenitori è l'archiviazione permanente. È necessario specificare una posizione di archiviazione esterna al contenitore in cui il database possa conservare i file di database. Le modifiche saranno così disponibili per tutti i contenitori in un cluster. Se si usa Kubernetes, questa posizione può essere un volume permanente.
Creare prima di tutto un volume permanente e quindi aggiungere una richiesta di volume permanente. Creare un manifesto della distribuzione per SQL Server in Linux che usa l'immagine di contenitore mssql-server-linux
creata da Microsoft. Il manifesto contiene anche le definizioni della richiesta di volume permanente e un bilanciamento del carico per il servizio, per garantire un indirizzo IP coerente. Creare la distribuzione e verificare che SQL Server sia in esecuzione all'interno di un pod. Con questa configurazione, in caso di errore del nodo Kubernetes eseguirà il bootstrap di una nuova istanza. È possibile eseguire un semplice test eliminando il pod e verificando che ne venga avviato automaticamente uno nuovo.