Applicazione web scalabile su Kubernetes
Questa esercitazione può comportare degli addebiti. Utilizza lo stimatore costi per generare una stima dei costi basata sul tuo utilizzo previsto.
Questa esercitazione spiega come eseguire un'applicazione web localmente in un contenitore e poi distribuirla in un cluster Kubernetes creato con Kubernetes Service. Come passo facoltativo, puoi creare un'immagine del contenitore ed eseguirne il push a un registro privato. Inoltre, si apprenderà come effettuare il binding di un sottodominio personalizzato, monitorare lo stato di salute dell'ambiente e scalare l'applicazione.
I contenitori sono un modo standard per assemblare applicazioni e tutte le sue dipendenze in modo da poter spostare facilmente le applicazioni tra gli ambienti. A differenza delle macchine virtuali, i contenitori non includono il sistema operativo. I contenitori includono 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.
Obiettivi
- Distribuire un'applicazione web nel cluster Kubernetes.
- Eseguire il bind di un dominio secondario personalizzato.
- Monitorare i log e l'integrità del cluster.
- Ridimensionare i pod Kubernetes.
- Uno sviluppatore scarica o clona un'applicazione web di esempio.
- Facoltativamente, crea l'applicazione per produrre un'immagine del contenitore.
- Facoltativamente, l'immagine viene inviata a uno spazio dei nomi in IBM Cloud Container Registry.
- L'applicazione viene distribuita a un cluster Kubernetes.
- Gli utenti accedono all'applicazione.
Prima di iniziare
Questa esercitazione richiede:
- la CLI IBM Cloud,
- il plugin IBM Cloud Kubernetes Service (
kubernetes-service),
- il plugin IBM Cloud Kubernetes Service (
kubectlper interagire con i cluster Kubernetes,Helm 3per distribuire i grafici.
Troverai le istruzioni per scaricare e installare questi strumenti per il tuo ambiente operativo nella guida Introduzione alle esercitazioni.
Per evitare l'installazione di questi strumenti puoi utilizzare Cloud Shell dalla console IBM Cloud.
Inoltre:
- Avrai bisogno di un'istanza Secrets Manager. Con Secrets Manager, è possibile creare, affittare e gestire centralmente i segreti utilizzati nei servizi IBM Cloud o nelle applicazioni personalizzate. I segreti vengono memorizzati in un'istanza Secrets Manager dedicata e puoi utilizzare le funzioni integrate per monitorare la scadenza, pianificare o ruotare manualmente i tuoi segreti. In questa esercitazione, utilizzerai un operatore Kubernetes per recuperare un certificato TLS da Secrets Manager e inserirlo in un segreto Kubernetes. Puoi utilizzare un'istanza esistente se ne hai già una o crearne una nuova seguendo la procedura descritta in Creazione di un'istanza del servizio Secrets Manager.
- Facoltativamente, configura uno spazio dei nomi del registro. È necessario solo se si creerà la propria immagine contenitore personalizzata.
- Comprendi le basi per Kubernetes.
Abilitare la comunicazione service - to - service con Secrets Manager
L'integrazione di Secrets Manager con il tuo cluster IBM Cloud Kubernetes Service richiede l'autorizzazione di comunicazione service - to - service. Seguire questa procedura per impostare l'autorizzazione. Per ulteriori informazioni, vedi Integrations for Secrets Manager.
- Nella console IBM Cloud, fare clic su Gestione > Accesso (IAM).
- Fare clic su Autorizzazioni.
- Fai clic su Crea.
- Nell'elenco dei servizi di origine, selezionare Kubernetes Service.
- Selezionare l'opzione per definire l'ambito dell'accesso a Tutte le risorse.
- Nell'elenco Servizio di destinazione, seleziona Secrets Manager.
- Selezionare l'opzione per definire l'ambito dell'accesso a Tutte le risorse.
- Nella sezione Accesso al servizio, selezionare l'opzione Gestore.
- Fai clic su Autorizza.
Crea un cluster Kubernetes
Il IBM Cloud Kubernetes Service è un'offerta gestita per creare il proprio cluster Kubernetes di host di calcolo per distribuire e gestire applicazioni containerizzate su IBM Cloud. Per questa esercitazione, è sufficiente un cluster minimo con una (1) zona, un (1) nodo di lavoro e la più piccola dimensione disponibile (Flavor).
-
Aprire i cluster Kubernetes e fare clic su Crea cluster.
-
Crea un cluster a tua scelta di Infrastruttura.
-
La seguente procedura è se selezioni VPC per Kubernetes sull'infrastruttura VPC. Devi creare un VPC e una o più sottoreti prima di creare il cluster Kubernetes. Per ulteriori dettagli, fai riferimento alla documentazione Creazione di cluster VPC.
- Fai clic su Crea VPC.
- Nella sezione Ubicazione, selezionare un' Area geografica e una Regione, ad esempio
EuropeeLondon. - Immetti un Nome del tuo VPC, seleziona un Gruppo di risorse e, facoltativamente, aggiungi Tag per organizzare le tue risorse.
- Deselezionare Consenti SSH e Consenti ping dal gruppo di sicurezza predefinito.
- Deselezionare Crea sottorete in ogni zona.
- Fai clic su Create.
- In Zone e sottoreti di lavoro, deseleziona le due zone per cui la sottorete non è stata creata.
- Imposta i Nodi di lavoro per zona su
1e fai clic su Modifica flavor per esplorare e modificare la dimensione del nodo di lavoro di tua scelta. - In Ingress, abilita Ingress secrets management e seleziona la tua istanza Secrets Manager esistente.
- Immetti un Nome cluster e seleziona lo stesso Gruppo di risorse che hai utilizzato per il VPC.
- La registrazione o il monitoraggio non sono richiesti in questa esercitazione, disabilitare tali opzioni e fare clic su Crea.
- Mentre attendi che il cluster diventi attivo, collega un gateway pubblico al VPC. Passa a Virtual private cloud.
- Fai clic sul nome del VPC utilizzato dal cluster e scorri verso il basso fino alla sezione delle sottoreti.
- Fai clic sul nome della sottorete creata in precedenza e nella sezione Public Gateway, fai clic su Scollegato per modificare lo stato in Collegato.
-
La seguente procedura è se selezioni Classic per Kubernetes sull'infrastruttura Classic. Fai riferimento alla documentazione Creazione di un cluster classico standard per ulteriori dettagli.
- Nella sezione Ubicazione, selezionare Area geografica, Disponibilitàmultizona e Metro ad esempio
EuropeeLondon. - In VLAN e zone di lavoro, deseleziona tutte le zone tranne una.
- Imposta i Nodi di lavoro per zona su
1e fai clic su Modifica flavor per esplorare e modificare la dimensione del nodo di lavoro di tua scelta. - Sotto Endpoint servizio master, selezionare Entrambi gli endpoint privati e pubblici.
- In Ingress, abilita Ingress secrets management e seleziona la tua istanza Secrets Manager esistente.
- Immettere un Nome cluster e selezionare il Gruppo di risorse in cui creare queste risorse.
- La registrazione o il monitoraggio non sono richiesti in questa esercitazione, disabilitare tali opzioni e fare clic su Crea.
- Nella sezione Ubicazione, selezionare Area geografica, Disponibilitàmultizona e Metro ad esempio
-
Clona un'applicazione di esempio
In questa sezione, clonerai un repository GitHub con una semplice applicazione di esempio NodeJS basata su Helmcon una pagina di destinazione e due endpoint per iniziare. È sempre possibile estendere l'applicazione di esempio in base ai propri requisiti.
- Su un terminale, esegui il seguente comando per clonare il repositoryGitHub:
git clone https://github.com/IBM-Cloud/kubernetes-node-app - Passare alla directory dell'applicazione:
cd kubernetes-node-app
Questo codice dell'applicazione di esempio contiene tutti i file di configurazione necessari per lo sviluppo locale e la distribuzione a Kubernetes.
Distribuisci l'applicazione al cluster utilizzando il grafico helm
Distribuisci l'applicazione con Helm 3
L'immagine del contenitore per l'applicazione è già stata creata e ne è stato eseguito il push a un registro pubblico in IBM Cloud Container Registry. In questa sezione distribuirai l'applicazione di esempio utilizzando Helm. Helm aiuta a gestire le applicazioni Kubernetes attraverso Helm Charts, che aiuta a definire, installare e aggiornare anche le applicazioni Kubernetes più complesse.
Nota: se vuoi creare e inviare l'applicazione al tuo registro del contenitore, puoi utilizzare la CLI Docker per farlo. Il Dockerfile viene fornito nel repository e le immagini possono essere inviate a IBM Cloud Container Registry o a qualsiasi
altro registro del contenitore.
-
Definire una variabile di ambiente denominata
MYAPPe impostare il nome dell'applicazione sostituendo il segnaposto con le proprie iniziali:export MYAPP=<your-initials>kubenodeapp -
Identifica il tuo cluster:
ibmcloud ks cluster ls -
Inizializzare la variabile con il nome del cluster:
export MYCLUSTER=<CLUSTER_NAME> -
Inizializzare l'ambiente cli
kubectl:ibmcloud ks cluster config --cluster $MYCLUSTERAssicurati che la CLI sia configurata per la regione e il gruppo di risorse in cui hai creato il tuo cluster utilizzando
ibmcloud target -r <region> -g <resource_group>. Per ulteriori informazioni sull'ottenimento dell'accesso al tuo cluster e sulla configurazione della CLI per eseguire i comandi kernel, controlla la sezione Configura la CLI -
Puoi utilizzare lo spazio dei nomi
defaultKubernetes o creare un nuovo spazio dei nomi per questa applicazione.- Se vuoi utilizzare lo spazio dei nomi
defaultKubernetes, esegui questo comando per configurare una variabile di ambiente:export KUBERNETES_NAMESPACE=default - Se vuoi creare un nuovo spazio dei nomi Kubernetes, attieniti alla procedura indicata in Copia di un segreto di pull dell'immagine esistente e Memorizzazione del segreto di pull dell'immagine nell'account del servizio Kubernetes per lo spazio dei nomi selezionato della documentazione del servizio Kubernetes. Una volta completato, eseguire il comando riportato di seguito:
export KUBERNETES_NAMESPACE=<KUBERNETES_NAMESPACE_NAME>
- Se vuoi utilizzare lo spazio dei nomi
-
Passare alla directory del grafico nella directory dell'applicazione di esempio:
cd chart/kubernetesnodeapp -
Installare il grafico Helm:
helm install $MYAPP --namespace $KUBERNETES_NAMESPACE . --set image.repository=icr.io/solution-tutorials/tutorial-scalable-webapp-kubernetes -
Tornare alla directory dell'applicazione di esempio:
cd ../..
Visualizza l'applicazione
- Elenca i servizi Kubernetes nello spazio dei nomi:
kubectl get services -n $KUBERNETES_NAMESPACE - Elenca i pod Kubernetes nello spazio dei nomi:
kubectl get pods -n $KUBERNETES_NAMESPACE
Utilizza il dominio fornito da IBM per il tuo cluster
I cluster vengono forniti con un dominio IBM. Questo ti dà una migliore opzione di esporre le applicazioni con un URL appropriato e su porte HTTP/S standard.
Utilizza Ingress per configurare la connessione in entrata del cluster al servizio.
-
Identifica il tuo dominio secondario Ingress e il tuo segreto Ingress fornito da IBM:
ibmcloud ks cluster get --cluster $MYCLUSTERper trovare
Ingress subdomain: mycluster.us-south.containers.appdomain.cloud Ingress secret: mycluster -
Definire la variabile di ambiente
INGRESS_SUBDOMAINper conservare il valore del dominio secondario Ingress:export INGRESS_SUBDOMAIN=<INGRESS_SUBDOMAIN> -
Definisci la variabile di ambiente
INGRESS_SECRETper conservare il valore del segreto Ingress:export INGRESS_SECRET=<INGRESS_SECRET> -
Nella directory dell'applicazione di esempio, eseguire il seguente comando bash per creare un file Ingress
ingress-ibmsubdomain.yamlche punta al dominio IBM con supporto per HTTP e HTTPS:./ingress.sh ibmsubdomain_httpsIl file viene generato da un file di modello
ingress-ibmsubdomain-template.yamlnella cartella yaml - templates sostituendo tutti i valori racchiusi nei segnaposto ($) con i valori appropriati delle variabili di ambiente. -
Distribuisci l'Ingress:
kubectl apply -f ingress-ibmsubdomain.yaml -
Aprire l'applicazione in un browser all'indirizzo
https://<myapp>.<ingress-subdomain>/o eseguire il comando seguente per visualizzare l'output HTTP:curl -I https://$MYAPP.$INGRESS_SUBDOMAIN
Utilizzare un sottodominio personalizzato
Questa sezione richiede la proprietà di un dominio personalizzato. Dovrai creare un record CNAME che punti al dominio secondario di ingresso fornito da IBMper il cluster. Se il tuo dominio è example.com, il CNAME <myapp>.<example.com> punterà a <myapp>.<ingress-subdomain>.
con HTTP
- Creare una variabile di ambiente che punti al dominio personalizzato:
export CUSTOM_DOMAIN=<example.com> - Crea un file Ingress
ingress-customdomain-http.yamlche punta al tuo dominio dal file templateingress-customdomain-http-template.yaml:./ingress.sh customdomain_http - Distribuisci l'Ingress:
kubectl apply -f ingress-customdomain-http.yaml - Accedete alla vostra domanda su
http://<myapp>.<example.com>/.
con HTTPS
Se si tenta di accedere all'applicazione con HTTPS in questo momento https://<myapp>.example.com/, è probabile che si riceva un avviso di sicurezza dal browser web che segnala che la connessione non è privata.
Ora, importa il certificato nell'istanza Secrets Manager che hai configurato in precedenza nel tuo cluster.
-
Accedi all'istanza del servizio Secrets Manager dall'Elenco risorse in Sicurezza.
-
Fare clic su Segreti nella navigazione a sinistra.
-
Fai clic su Aggiungi.
-
Puoi selezionare Certificato pubblico, Certificato importato o Certificato privato. I passi dettagliati sono disponibili nei rispettivi argomenti della documentazione: Ordine di certificati pubblici SSL/TLS, Importazione di certificati SSL/TLS o Creazione di certificati privati SSL/TLS. Se si è scelto di importare un certificato, assicurarsi di caricare il certificato, la chiave privata e i file di certificato intermedi.
-
Individuare la voce per il certificato importato o ordinato e fare clic su di esso.
- Verificare che il nome dominio corrisponda a $CUSTOM_DOMAIN. Se hai caricato un certificato jolly, nel nome del dominio è incluso un asterisco.
- Fare clic sull'icona di copia accanto al CRN del certificato.
- Creare una variabile di ambiente che punti al valore appena copiato:
export CERTIFICATE_CRN=<certificate CRN> -
Creare un segreto Ingress nel cluster per il certificato SSL/TLS:
ibmcloud ks ingress secret create --name nodeapp-tls-cert --cluster $MYCLUSTER --cert-crn $CERTIFICATE_CRN --namespace $KUBERNETES_NAMESPACE -
Creare una variabile di ambiente che punti al dominio personalizzato:
export CUSTOM_DOMAIN=<example.com> -
Crea un file Ingress
ingress-customdomain-https.yamlche punta al tuo dominio dal templateingress-customdomain-https-template-sm.yaml:./ingress.sh customdomain_https_sm -
Distribuisci l'Ingress:
kubectl apply -f ingress-customdomain-https.yaml -
Accedete alla vostra domanda su
https://$MYAPP.$CUSTOM_DOMAIN/.
curl -I https://$MYAPP.$CUSTOM_DOMAIN
Monitora l'integrità dell'applicazione
- Per controllare l'integrità della tua applicazione, vai a clusters per visualizzare un elenco di cluster e fai clic sul tuo cluster.
- Fai clic su Kubernetes Dashboard per avviare il dashboard in una nuova scheda.
- Fare clic su Pods sulla sinistra, quindi fare clic su un nome - pod corrispondente a $MYAPP
- Esaminare l'utilizzo della memoria e della CPU.
- Prendi nota del nome IP del nodo.
- Fai clic su Visualizza log nel menu delle azioni in alto a destra per visualizzare l'output standard e l'errore dell'applicazione.
- Selezionare Nodi nel riquadro di sinistra, fare clic sul nome di un nodo indicato in precedenza e visualizzare le Risorse di allocazione per vedere lo stato di salute dei nodi.
- Per eseguire nel contenitore selezionare Esegui in nel menu delle azioni
Ridimensiona i pod Kubernetes
Man mano che il carico aumenta sulla tua applicazione, puoi aumentare manualmente il numero di repliche pod nella tua distribuzione. Le replica sono gestite da un ReplicaSet. Per ridimensionare l'applicazione a due repliche, esegui questo comando:
kubectl scale deployment kubernetesnodeapp-deployment --replicas=2
Dopo poco tempo, si vedranno due pod per la propria applicazione nella dashboard di Kubernetes (o con kubectl get pods ). Il controller Ingress del cluster gestirà il bilanciamento del carico tra le due repliche.
Con Kubernetes è possibile abilitare l'autoscaling orizzontale dei pod per aumentare o diminuire automaticamente il numero di istanze delle applicazioni in base alla CPU.
Per creare un autoscaler e definire la tua politica, immetti il seguente comando
kubectl autoscale deployment kubernetesnodeapp-deployment --cpu-percent=5 --min=1 --max=5
Una volta che l'autoscaler è stato creato con successo, si dovrebbe vedere
horizontalpodautoscaler.autoscaling/<deployment-name> autoscaled.
Rimuovi le risorse
-
Elimina il pod orizzontale autoscaler:
kubectl delete horizontalpodautoscaler.autoscaling/kubernetesnodeapp-deployment -
Eliminare le risorse applicate:
kubectl delete -f ingress-customdomain-https.yaml kubectl delete -f ingress-customdomain-http.yaml kubectl delete -f ingress-ibmsubdomain.yaml -
Elimina le risorse utente Kubernetes create per questa applicazione:
helm uninstall $MYAPP --namespace $KUBERNETES_NAMESPACE -
Eliminare il segreto Kubernetes:
kubectl -n $KUBERNETES_NAMESPACE delete secret kubernetesnodeapp-api-key -
Eliminare l'operatore dei segreti esterni:
helm uninstall external-secrets -
Elimina l'ID servizio:
ibmcloud iam service-id-delete $SERVICE_ID -
Elimina il cluster.