Spostamento di un'applicazione basata sulla VM in Kubernetes
Questa esercitazione può comportare degli addebiti. Utilizza lo stimatore costi per generare una stima dei costi basata sul tuo utilizzo previsto.
Questa esercitazione ti guida nel processo di spostamento di una applicazione basata sulla VM in un cluster Kubernetes utilizzando Kubernetes Service. Kubernetes Service fornisce strumenti potenti combinando le tecnologie del contenitore e Kubernetes, un'esperienza utente intuitiva e la sicurezza e l'isolamento integrati per automatizzare la distribuzione, il funzionamento, il ridimensionamento e il monitoraggio delle applicazioni inserite in un contenitore in un cluster di host di calcolo.
Le lezioni presenti in questa esercitazione includono i concetti su come prendere un'applicazione esistente, inserirla in un contenitore e distribuirla in un cluster Kubernetes. Per inserire in un contenitore la tua applicazione basata sulla VM, puoi scegliere tra le seguenti opzioni.
- Identificare i componenti di un'applicazione monolite che possono essere separati in un proprio microservizio. È possibile containerizzare questi microservizi e distribuirli in un cluster Kubernetes.
- Inserisci in un contenitore l'intera applicazione e distribuiscila in un cluster Kubernetes.
A seconda del tipo di applicazione di cui disponi, i passi per eseguire la migrazione della tua applicazione possono variare. Puoi utilizzare questa esercitazione per acquisire informazioni sui passi generali che devi eseguire e sugli elementi che devi tenere in considerazione prima di migrare la tua applicazione.
Obiettivi
- Capire come identificare i microservizi in un'applicazione basata su macchine virtuali e imparare a mappare i componenti tra le macchine virtuali e Kubernetes.
- Apprendere come inserire in un contenitore un'applicazione basata sulla VM.
- Apprendere come distribuire il contenitore in un cluster Kubernetes in Kubernetes Service.
- Mettere in pratica quanto appreso, eseguire l'applicazione JPetStore nel tuo cluster.
Architettura
Architettura dell'applicazione tradizionale con le VM
Il seguente diagramma mostra un esempio di architettura dell'applicazione tradizionale che si basa sulle VM.
- L'utente invia una richiesta all'endpoint pubblico dell'applicazione. L'endpoint pubblico viene rappresentato da un servizio del programma di bilanciamento del carico che bilancia il carico del traffico in entrata tra le istanze del server delle applicazioni disponibili.
- Il programma di bilanciamento del carico seleziona una delle istanze del server delle applicazioni integre che vengono eseguite su una VM e inoltra la richiesta. I file dell'applicazione, come il codice dell'applicazione, i file di configurazione e le dipendenze, sono memorizzati sulla macchina virtuale del server dell'applicazione.
- L'app server memorizza i dati dell'app in un database MySQL che gira su una macchina virtuale del database.
Architettura inserita in un contenitore
Il seguente diagramma mostra un esempio di architettura moderna di un contenitore che viene eseguita in un cluster Kubernetes.
- L'utente invia una richiesta all'endpoint pubblico dell'applicazione. L'endpoint pubblico viene rappresentato da un programma di bilanciamento del carico dell'applicazione (ALB) Ingress che bilancia il carico del traffico di rete in entrata tra i pod dell'applicazione nel cluster. L'ALB è una raccolta di regole che consentono il traffico di rete in entrata a un'applicazione esposta pubblicamente.
- L'ALB inoltra la richiesta a uno dei pod dell'applicazione disponibili nel cluster. I pod dell'applicazione vengono eseguiti sui nodi di lavoro che possono essere una VM o una macchina fisica.
- I pod dell'applicazione archiviano i dati i volumi persistenti. I volumi persistenti possono essere utilizzati per condividere i dati tra le istanze dell'applicazione o i nodi di lavoro.
- I pod dell'applicazione archiviano i dati in un servizio database IBM Cloud. Puoi eseguire il tuo database all'interno del cluster Kubernetes, ma l'utilizzo di un DBaaS (database-as-a-service) è in genere più semplice da configurare e fornisce backup e ridimensionamento integrati. Puoi trovare molti tipi di database nel catalogoIBM Cloud.
VM, contenitori e Kubernetes
Kubernetes Service fornisce la capacità di eseguire le applicazioni inserite in un contenitore nei cluster Kubernetes e offre i seguenti strumenti e le seguenti funzioni:
- Esperienza utente intuitiva e strumenti potenti.
- Sicurezza e isolamento integrati per consentire la consegna rapida di applicazioni sicure.
- Servizi cloud che includono le funzionalità cognitive di IBM® Watson™.
- Capacità di gestire risorse cluster dedicate sia per applicazioni stateless che per carichi di lavoro stateful.
Messa a confronto di VM e contenitori
Le VM, applicazioni tradizionali che vengono eseguite sull'hardware nativo. Di norma, una singola applicazione non utilizza le risorse complete di un singolo host di calcolo. La maggior parte delle organizzazioni prova a eseguire più applicazioni su un singolo host di calcolo per evitare di sprecare risorse. Puoi eseguire più copie della stessa applicazione, ma per fornire l'isolamento, puoi utilizzare le VM per eseguire più istanze dell'applicazione (VM) sullo stesso hardware. Queste macchine virtuali hanno stack di sistema operativo completi che le rendono relativamente inefficienti a causa della duplicazione sia in fase di esecuzione che su disco.
I contenitori rappresentano un modo standard per assemblare le applicazioni e tutte le relative dipendenze in modo che tu possa spostare facilmente le applicazioni tra gli ambienti. A differenza delle macchine virtuali, i contenitori non includono il sistema operativo. Nei contenitori vengono riuniti solo il codice dell'applicazione, il runtime, gli strumenti di sistema, le librerie e le impostazioni. I contenitori sono più leggeri, portatili ed efficienti rispetto alle macchine virtuali.
Inoltre, i contenitori ti consentono di condividere il sistema operativo dell'host. Ciò riduce la duplicazione mentre fornisce ancora l'isolamento. I contenitori ti consentono di eliminare i file non necessari come le librerie di sistema e i file binari per risparmiare spazio e ridurre la tua superficie di attacco. Ulteriori informazioni sulle macchine virtuali e i contenitori in Cosa sono i contenitori?.
Orchestrazione Kubernetes
Kubernetes è un orchestratore di container per gestire il ciclo di vita delle applicazioni containerizzate in un cluster di nodi worker. Le tue applicazioni potrebbero aver bisogno di altre risorse per l'esecuzione, ad esempio, i volumi, le reti e i segreti che ti aiuteranno a connetterti ad altri servizi cloud, e le chiavi protette. Kubernetes ti aiuta ad aggiungere queste risorse alla tua applicazione. Il paradigma chiave di Kubernetes è il suo modello dichiarativo. L'utente fornisce lo stato desiderato e Kubernetes tenta di conformarsi allo stato descritto e poi lo mantiene.
Questo workshop autogestito su Kubernetes può aiutarvi a fare la vostra prima esperienza pratica con Kubernetes. Inoltre, consultate la pagina di documentazione di Kubernetes concetti per saperne di più sui concetti di Kubernetes.
Cosa sta facendo IBM per te
Utilizzando i cluster Kubernetes con IBM Cloud Kubernetes Service, usufruisci dei seguenti vantaggi:
- Più data center in cui puoi distribuire i tuoi cluster.
- Supporto per le opzioni di rete ingress e del programma di bilanciamento del carico.
- Supporto del volume persistente dinamico.
- Master Kubernetes gestiti da IBM altamente disponibili.
Dimensionamento dei cluster
Quando progetti la tua architettura cluster, vuoi bilanciare i costi in rapporto a disponibilità, affidabilità, complessità e ripristino. I cluster Kubernetes in IBM Cloud Kubernetes Service forniscono opzioni di architettura basate sulle esigenze delle tue applicazioni. Con un po' di pianificazione, puoi ottenere il massimo dalle tue risorse cloud senza eccedere nella progettazione dell'architettura o nella spesa. Anche in caso di sovrastima o sottostima, è possibile aumentare o diminuire facilmente il cluster, modificando il numero o il tipo di nodi worker.
Per eseguire un'applicazione di produzione nel cloud utilizzando Kubernetes, tieni in considerazione i seguenti elementi:
- Ti aspetti del traffico da una specifica ubicazione geografica? Se sì, seleziona l'ubicazione più vicina a te per prestazioni migliori.
- Quante repliche del tuo cluster vuoi per una disponibilità più elevata? Un buon punto di partenza potrebbe essere tre cluster, uno per lo sviluppo, uno per il test e uno per la produzione. Consulta la guida della soluzione Procedure ottimali per organizzare le risorse e assegnare l'accesso per creare più ambienti.
- Di quale hardware hai bisogno per i nodi di lavoro? VM o bare metal?
- Di quanti nodi di lavoro hai bisogno? Ciò dipende molto dal ridimensionamento delle applicazioni, più nodi hai più resiliente sarà la tua applicazione.
- Quante repliche devi avere per una disponibilità più elevata? Distribuisci i cluster di replica in più ubicazioni per rendere più disponibile la tua applicazione e per proteggerla dall'inattività causata da un malfunzionamento dell'ubicazione.
- Qual è l'insieme minimo di risorse di cui la vostra applicazione ha bisogno per avviarsi? Potresti voler verificare la tua applicazione per la quantità di memoria e di CPU di cui necessita per l'esecuzione. Il tuo nodo di lavoro deve avere risorse sufficienti per distribuire e avviare l'applicazione. Assicurati poi di impostare le quote di risorse come parte delle specifiche del pod. Questa impostazione è quella che Kubernetes utilizza per selezionare (o pianificare) un nodo di lavoro che ha capacità sufficiente per supportare la richiesta. Stima quanti pod verranno eseguiti sul nodo di lavoro e i requisiti di risorsa per tali pod.
- Quando aumentare il numero di nodi worker? Puoi monitorare l'utilizzo del cluster e aumentare i nodi quando necessario. Vedere Monitoraggio dello stato del cluster.
- Hai bisogno di archiviazione ridondante e affidabile? In caso affermativo, creare una richiesta di volume persistente per l'archiviazione NFS o legare un servizio di database IBM Cloud al pod.
- Hai bisogno di distribuire un cluster sull'infrastruttura Cloud Private Cloud o nell'infrastruttura classica? VPC ti offre la sicurezza di un ambiente cloud privato con la scalabilità dinamica di un cloud pubblico.
Per rendere più specifici i passaggi precedenti, supponiamo di voler eseguire un'applicazione web di produzione nel cloud e di aspettarci un carico di traffico da moderato a elevato. Esploriamo quali risorse ti servirebbero:
- Configura tre cluster, uno per lo sviluppo, uno per il test e uno per la produzione.
- I cluster di sviluppo e di test possono iniziare con un'opzione minima di RAM e CPU (ad esempio 2 CPU, 4GB di RAM e un nodo worker per ogni cluster).
- Per il cluster di produzione, potresti voler avere più risorse per le prestazioni, l'alta disponibilità e la resilienza. Potremmo scegliere un'opzione dedicata o addirittura bare metal e disporre di almeno 4 CPU, 16GB di RAM e due nodi worker.
Decidi quale opzione database utilizzare
Con Kubernetes, hai due opzioni per gestire i database:
- Puoi eseguire il tuo database all'interno del cluster Kubernetes, per farlo, dovresti creare un microservizio per eseguire il database. Ad esempio, se utilizzi un database MySQL, devi completare la seguente procedura:
- Creare un file Docker MySQL, vedere un esempio di file Docker MySQL qui.
- Devi utilizzare i segreti per archiviare la credenziale del database. Vedere l'esempio di questo qui.
- Hai bisogno di un file
deployment.yamlcon la configurazione del tuo database da distribuire a Kubernetes. Vedere l'esempio di questo qui.
- La seconda opzione sarebbe quella di utilizzare il DBaaS (database-as-a-service) gestito. Questa opzione di solito è più semplice da configurare e fornisce backup e ridimensionamento integrati. Puoi trovare molti tipi di database nel catalogoIBM Cloud.
Per utilizzare questa opzione, devi effettuare quanto segue:
- Crea un DBaaS (database-as-a-service) gestito dal catalogo IBM Cloud.
- Archivia le credenziali del database all'interno di un segreto. Per ulteriori informazioni sui segreti, consultare la sezione Memorizzare le credenziali nei segreti di Kubernetes.
- Utilizza il DBaaS (database-as-a-service) nella tua applicazione.
Decidi dove archiviare i file dell'applicazione
Kubernetes Service fornisce diverse opzioni per archiviare e condividere i dati tra i pod. Non tutte le opzioni di archiviazione offrono lo stesso livello di persistenza e disponibilità in situazioni di emergenza.
Archiviazione dati non persistente
I contenitori e i pod sono, come progettati, di breve durata e possono avere un malfunzionamento imprevisto. Puoi archiviare i dati nel file system locale di un contenitore. I dati all'interno di un contenitore non possono essere condivisi con altri contenitori o pod e vengono persi quando il contenitore ha un arresto anomalo o viene rimosso.
Apprendi come creare l'archiviazione dati persistente per la tua applicazione
È possibile persistere i dati dell'applicazione e i dati del contenitore su uno storage di file NFS o su uno storage a blocchi utilizzando i volumi persistenti nativi Kubernetes.
Per eseguire il provisioning di un'archiviazione file NFS o di un'archiviazione blocchi, devi richiedere l'archiviazione per il tuo pod creando un'attestazione del volume persistente (PVC o persistent volume claim). Nel PVC è possibile scegliere tra classi di archiviazione predefinite che definiscono il tipo di archiviazione, la capacità di archiviazione in gigabyte, gli IOPS, i criteri di conservazione dei dati e le autorizzazioni di lettura e scrittura per l'archiviazione. Una PVC esegue, in modo dinamico, il provisioning di un volume persistente che rappresenta il dispositivo di archiviazione effettivo in IBM Cloud. Puoi montare la PVC nel tuo pod per leggere e scrivere nel volume persistente. I dati archiviati nei volumi persistenti sono disponibili anche se il contenitore si arresta in modo anomalo o il pod viene ripianificato. L'archiviazione di file NFS e l'archiviazione a blocchi che supporta il PV sono clusterizzate da IBM per garantire un'elevata disponibilità dei dati.
Per informazioni su come creare una PVC, segui i passi inclusi nella documentazione dell'archiviazione del Kubernetes Service.
Apprendi come spostare i dati esistenti nell'archiviazione persistente
Per copiare i dati dalla tua macchina locale alla tua archiviazione persistente, devi montare la PVC in un pod. Poi, puoi copiare i dati dalla tua macchina locale a un volume persistente nel tuo pod.
-
Per copiare i dati, occorre innanzitutto creare una configurazione simile a questa:
kind: Pod apiVersion: v1 metadata: name: task-pv-pod spec: volumes: - name: task-pv-storage persistentVolumeClaim: claimName: mypvc containers: - name: task-pv-container image: nginx ports: - containerPort: 80 name: "http-server" volumeMounts: - mountPath: "/mnt/data" name: task-pv-storage -
Poi, per copiare i dati dalla tua macchina locale al pod, utilizza un comando simile a questo:
kubectl cp <local_filepath>/<filename> <namespace>/<pod>:<pod_filepath> -
Copia i dati da un pod nel tuo cluster alla tua macchina locale:
kubectl cp <namespace>/<pod>:<pod_filepath>/<filename> <local_filepath>/<filename>
Configura i backup per l'archiviazione persistente
Viene eseguito il provisioning delle condivisioni file e dell'archiviazione blocchi nella stessa ubicazione del tuo cluster. L'archiviazione stessa è ospitata sui server organizzati in cluster da IBM per fornire un'elevata disponibilità. Tuttavia, il backup delle condivisioni file e dell'archiviazione blocchi non viene eseguito automaticamente e potrebbero essere inaccessibili in caso di malfunzionamento dell'intera ubicazione. Per proteggere i tuoi dati da perdite o danneggiamenti, puoi configurare backup periodici che puoi utilizzare per ripristinare i tuoi dati quando necessario.
Per ulteriori informazioni, vedere Pianificazione dello stoccaggio opzioni per l'archiviazione di file e blocchi di NFS.
Prepara il tuo codice
Applica i principi a 12 fattori
L' applicazione a dodici fattori è una metodologia per la creazione di applicazioni native nel cloud. Quando vuoi inserire in un contenitore un'applicazione, sposta questa applicazione nel cloud e orchestrala con Kubernetes, è importante comprendere e applicare alcuni di questi principi. Alcuni di questi principi sono richiesti in IBM Cloud.
Sono necessari i seguenti principi fondamentali:
- Codebase - Tutto il codice sorgente e i file di configurazione vengono tracciati all'interno di un sistema di controllo della versione (ad esempio, un repository GIT), ciò è necessario se stai utilizzando una pipeline DevOps per la distribuzione.
- Build, release, esecuzione - L'applicazione a 12 fattori utilizza una rigida separazione tra le fasi di build (creazione), release (rilascio) ed esecuzione. Ciò può essere automatizzato con una pipeline di fornitura DevOps integrata per creare e verificare l'applicazione prima di distribuirla nel cluster. Controlla l'esercitazione Distribuisci un'applicazione su Kubernetes per informazioni su come configurare un'integrazione continua e una pipeline di fornitura. Copre la configurazione del controllo sorgente, le fasi di compilazione, test e distribuzione e mostra come aggiungere integrazioni come scanner di sicurezza, notifiche e analisi.
- Configurazione - Tutte le informazioni sulla configurazione sono archiviate in variabili di ambiente. Nessuna credenziale del servizio è codificata nel codice dell'applicazione. Per archiviare le credenziali, puoi utilizzare i segreti Kubernetes. Ulteriori informazioni sulle credenziali in seguito.
Archivia le credenziali nei segreti Kubernetes
Non consigliamo mai di archiviare le credenziali all'interno del codice dell'applicazione. Kubernetes fornisce invece i cosiddetti "segreti" che contengono informazioni sensibili, come password, token OAuth o chiavi SSH. I segreti di Kubernetes sono crittografati per impostazione predefinita, il che rende i segreti un'opzione più sicura e flessibile per memorizzare i dati sensibili
rispetto alla memorizzazione letterale di tali dati in una definizione di pod o in un'immagine di container.
Un modo per utilizzare i segreti in Kubernetes è fare qualcosa di simile:
-
Crea un file denominato
cloud-secrets.txte memorizza le credenziali del servizio di qualsiasi servizio cloud al suo interno.{ "url": "<SERVICE_URL>", "api_key": <API_Key> } -
Quindi, creare un segreto Kubernetes eseguendo il comando seguente e verificare che il segreto sia stato creato utilizzando
kubectl get secretsdopo aver eseguito il comando seguente:kubectl create secret generic cloud-service-secret --from-file=cloud-secrets.txt=./cloud-secrets.txt
Inserisci in un contenitore la tua applicazione
Per containerizzare l'applicazione, è necessario creare un'immagine del contenitore.
Un'immagine viene creata da un Dockerfile, che è un file che contiene le istruzioni e i comandi per costruire l'immagine. Nelle sue istruzioni, un Dockerfile potrebbe fare riferimento alle risorse di build che vengono archiviate separatamente, quali ad esempio un'applicazione, la configurazione dell'applicazione e le relative dipendenze.
Per creare il tuo Dockerfile per la tua applicazione esistente, potresti utilizzare i seguenti comandi:
- FROM - Scegli un'immagine principale per definire il runtime del contenitore.
- ADD/COPY - Copia il contenuto di una directory nel contenitore.
- WORKDIR - Imposta la directory di lavoro all'interno del contenitore.
- RUN - Installa i pacchetti software di cui hanno bisogno le applicazioni durante il runtime.
- EXPOSE - Rendi disponibile una porta all'esterno del contenitore.
- ENV NAME - Definisci le variabili di ambiente.
- CMD - Definisci i comandi che vengono eseguiti quando avvii il contenitore.
Le immagini sono tipicamente archiviate in un registro che può essere accessibile al pubblico (registro pubblico) o impostato con accesso limitato a un gruppo di utenti (registro privato). I registri pubblici, come Docker Hub possono essere utilizzati per iniziare a utilizzare Docker e Kubernetes per creare la tua prima applicazione inserita in un contenitore in un cluster. Ma quando si tratta di applicazioni aziendali, utilizza un registro privato, come quello fornito in IBM Cloud Container Registry per impedire che le tue immagini vengano utilizzate o modificate da utenti non autorizzati.
Per inserire in un contenitore un'applicazione e archiviarla in IBM Cloud Container Registry:
- È necessario creare un file Docker; il codice seguente è un esempio di file Docker.
# Build JPetStore war FROM openjdk:8 as builder COPY . /src WORKDIR /src RUN ./build.sh all # Use WebSphere Liberty base image from the Docker Store FROM websphere-liberty:latest # Copy war from build stage and server.xml into image COPY --from=builder /src/dist/jpetstore.war /opt/ibm/wlp/usr/servers/defaultServer/apps/ COPY --from=builder /src/server.xml /opt/ibm/wlp/usr/servers/defaultServer/ RUN mkdir -p /config/lib/global COPY lib/mysql-connector-java-3.0.17-ga-bin.jar /config/lib/global - Una volta creato un Dockerfile, devi creare un'immagine del contenitore ed eseguirne il push in IBM Cloud Container Registry. Puoi creare un contenitore utilizzando un comando come il seguente:
docker build . -t <image_name> docker push <image_name>
Distribuisci la tua applicazione in un cluster Kubernetes
Dopo aver creato ed eseguito il push di un'immagine del contenitore nel cloud, devi eseguire la distribuzione nel tuo cluster Kubernetes. Per eseguire tale azione, devi creare un file deployment.yaml.
Apprendi come creare un file deployment.yaml di Kubernetes
Per creare file deployment.yaml di Kubernetes, devi eseguire una procedura simile alla seguente:
-
Creare un file deployment.yaml, ecco un esempio di file YAML di deployment.
-
Nel file deployment.yaml è possibile definire le quote di risorse per i container, per specificare la quantità di CPU e di memoria di cui ogni container ha bisogno per avviarsi correttamente. Se i contenitori hanno quote di risorse specificate, il programma di pianificazione Kubernetes può prendere decisioni migliori sul nodo di lavoro in cui collocare i tuoi pod.
-
Quindi, è possibile utilizzare i seguenti comandi per creare e visualizzare l'installazione client e i servizi creati:
kubectl create -f <filepath/deployment.yaml> kubectl get deployments kubectl get services kubectl get pods
Riepilogo
In questa esercitazione, hai appreso quanto segue:
- Le differenze tra VM, contenitori e Kubernetes.
- Come definire i cluster per i diversi tipi di ambiente (sviluppo, test e produzione).
- Come gestire l'archiviazione dati e l'importanza dell'archiviazione dati persistente.
- Applicare i principi a 12 fattori alla tua applicazione e utilizzare i segreti per le credenziali in Kubernetes.
- Costruire le immagini del contenitore e inviarle a IBM Cloud Container Registry.
- Creare i file di distribuzione Kubernetes e distribuire l'immagine del contenitore in Kubernetes.
Metti in pratica quanto appreso, esegui l'applicazione JPetStore nel tuo cluster
Per mettere in pratica quanto appreso, seguite la dimostrazione per eseguire l'applicazione JPetStore sul vostro cluster e applicare i concetti appresi. L'applicazione JPetStore dispone di alcune funzionalità estese che consentono di estendere un'applicazione in Kubernetes eseguendo la classificazione delle immagini come microservizio separato.