Questo tutorial mostra come creare un servizio di pubblicazione Knative personalizzato che trasforma un parametro di input per la descrizione di un grafico in un diagramma nel formato immagine PNG
. Utilizza Graphviz, installato come pacchetto di sistema nell'ambiente dei container del servizio.
Graphviz viene utilizzato tramite utilità a riga di comando per gestire le richieste.
Obiettivi
- Scrivi e crea un container personalizzato con un Dockerfile
- Scrivi, crea ed esegui il deployment di un servizio di gestione Knative
- Utilizza l'utilità Graphviz dot per generare diagrammi
- Testa il servizio pubblicando un diagramma di sintassi DOT dalla raccolta o dalla tua creazione
Costi
In questo documento vengono utilizzati i seguenti componenti fatturabili di Google Cloud:
Per generare una stima dei costi in base all'utilizzo previsto,
utilizza il Calcolatore prezzi.
Prima di iniziare
- Questo tutorial presuppone che la pubblicazione di Knative sia installata e configurata sul cluster.
- Assicurati che l'ambiente a riga di comando sia configurato e che gli strumenti siano aggiornati:
Recupero dell'esempio di codice
Per recuperare l'esempio di codice da utilizzare:
Clona il repository dell'app di esempio sulla tua macchina locale:
Node.js
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
In alternativa, puoi scaricare l'esempio come file ZIP ed estrarlo.
Python
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
In alternativa, puoi scaricare l'esempio come file ZIP ed estrarlo.
Go
git clone https://github.com/GoogleCloudPlatform/golang-samples.git
In alternativa, puoi scaricare l'esempio come file ZIP ed estrarlo.
Java
git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git
In alternativa, puoi scaricare l'esempio come file ZIP ed estrarlo.
Passa alla directory che contiene il codice di esempio per la pubblicazione di Knative:
Node.js
cd nodejs-docs-samples/run/system-package/
Python
cd python-docs-samples/run/system-package/
Go
cd golang-samples/run/system_package/
Java
cd java-docs-samples/run/system-package/
Visualizzare l'architettura
L'architettura di base è la seguente:
L'utente invia una richiesta HTTP al servizio di gestione Knative che esegue un'utilità Graphviz per trasformare la richiesta in un'immagine. L'immagine viene inviata all'utente come risposta HTTP.
Nozioni di base sul codice
Definizione della configurazione dell'ambiente con Dockerfile
Dockerfile
è specifico per il linguaggio e l'ambiente operativo di base, ad esempio Ubuntu, che verrà utilizzato dal tuo servizio.
Questo servizio richiede uno o più pacchetti di sistema aggiuntivi non disponibili per impostazione predefinita.
Apri
Dockerfile
in un editor.Cerca un'istruzione
Dockerfile
RUN
. Questa istruzione consente di eseguire comandi shell arbitrari per modificare l'ambiente. SeDockerfile
ha più fasi, identificate grazie al rilevamento di più istruzioniFROM
, si troverà nell'ultima fase.I pacchetti specifici richiesti e il meccanismo per installarli variano a seconda del sistema operativo dichiarato all'interno del container.
Per visualizzare le istruzioni per il tuo sistema operativo o l'immagine di base, fai clic sulla scheda appropriata.
Debian/Ubuntu Alpino Alpine richiede un secondo pacchetto per il supporto dei caratteri.Per determinare il sistema operativo dell'immagine container, controlla il nome nell'istruzione
FROM
o un file README associato all'immagine di base. Ad esempio, se estendi danode
, puoi trovare la documentazione e l'elementoDockerfile
padre in Docker Hub.Testa la personalizzazione creando l'immagine utilizzando
docker build
in locale o Cloud Build.
Gestione delle richieste in entrata
Il servizio di esempio utilizza i parametri della richiesta HTTP in entrata per richiamare una chiamata di sistema che esegue il comando dell'utilità dot
appropriato.
Nel gestore HTTP riportato di seguito, un parametro di input della descrizione del grafico viene estratto dalla variabile dot
della stringa di query.
Le descrizioni dei grafici possono includere caratteri che devono essere codificati nell'URL per essere utilizzati in una stringa di query.
Node.js
Python
Go
Java
Devi distinguere tra errori interni del server e input utente non validi. Questo servizio di esempio restituisce un errore interno del server per tutti gli errori della riga di comando dei punti, a meno che il messaggio di errore non contenga la stringa syntax
, che indica un problema di input utente.
Generazione di un diagramma
La logica di base della generazione dei diagrammi utilizza lo strumento a riga di comando dei punti per elaborare il parametro di input della descrizione del grafico in un diagramma nel formato immagine PNG.
Node.js
Python
Go
Java
Progettare un servizio sicuro
Eventuali vulnerabilità nello strumento dot
sono potenziali vulnerabilità del servizio web. Puoi mitigare questo problema utilizzando versioni aggiornate del pacchetto graphviz
ricreando regolarmente l'immagine container.
Se estendi l'esempio attuale per accettare l'input utente come parametri della riga di comando, dovresti proteggerti dagli attacchi con comando iniezione. Ecco alcuni modi per prevenire gli attacchi di iniezione:
- Mappatura degli input a un dizionario di parametri supportati
- Gli input di convalida corrispondono a un intervallo di valori sicuri noti, ad esempio utilizzando espressioni regolari
- Utilizzare caratteri di escape per gli input per garantire che la sintassi della shell non venga valutata
Spedisci il codice
Per fornire il codice, crea con Cloud Build, caricalo in Container Registry ed esegui il deployment nella gestione di Knative:
Esegui questo comando per creare il container e pubblicarlo su Container Registry.
Node.js
gcloud builds submit --tag gcr.io/PROJECT_ID/graphviz
Dove PROJECT_ID è l'ID progetto Google Cloud e
graphviz
è il nome che vuoi assegnare al servizio.Se l'operazione ha esito positivo, verrà visualizzato un messaggio di operazione riuscita contenente l'ID, l'ora di creazione e il nome dell'immagine. L'immagine è archiviata in Container Registry e, se lo desideri, può essere riutilizzata.
Python
gcloud builds submit --tag gcr.io/PROJECT_ID/graphviz
Dove PROJECT_ID è l'ID progetto Google Cloud e
graphviz
è il nome che vuoi assegnare al servizio.Se l'operazione ha esito positivo, verrà visualizzato un messaggio di operazione riuscita contenente l'ID, l'ora di creazione e il nome dell'immagine. L'immagine è archiviata in Container Registry e, se lo desideri, può essere riutilizzata.
Go
gcloud builds submit --tag gcr.io/PROJECT_ID/graphviz
Dove PROJECT_ID è l'ID progetto Google Cloud e
graphviz
è il nome che vuoi assegnare al servizio.Se l'operazione ha esito positivo, verrà visualizzato un messaggio di operazione riuscita contenente l'ID, l'ora di creazione e il nome dell'immagine. L'immagine è archiviata in Container Registry e, se lo desideri, può essere riutilizzata.
Java
Questo esempio utilizza Jib per creare immagini Docker con gli strumenti Java comuni. Jib ottimizza le build di container senza bisogno di un Dockerfile o di dover installare Docker. Scopri di più sulla creazione di container Java con Jib.Usa il Dockerfile per configurare e creare un'immagine di base con i pacchetti di sistema installati per sostituire l'immagine di base predefinita di Jib:
gcloud builds submit --tag gcr.io/PROJECT_ID/graphviz-base
Dove PROJECT_ID è il tuo ID progetto Google Cloud.
Crea il container finale con Jib e pubblicalo su Container Registry:
mvn compile jib:build \ -Dimage=gcr.io/PROJECT_ID/graphviz \ -Djib.from.image=gcr.io/PROJECT_ID/graphviz-base
Dove PROJECT_ID è il tuo ID progetto Google Cloud.
Esegui il deployment utilizzando il comando seguente:
gcloud run deploy graphviz-web --create-if-missing --image gcr.io/PROJECT_ID/graphviz
Dove PROJECT_ID è l'ID progetto Google Cloud e
graphviz
è il nome del container indicato sopra egraphviz-web
è il nome del servizio.Attendi il completamento del deployment: questa operazione può richiedere circa mezzo minuto.
Se vuoi eseguire il deployment di un aggiornamento del codice nel servizio, ripeti i passaggi precedenti. Ogni deployment in un servizio crea una nuova revisione e avvia automaticamente la gestione del traffico quando è pronto.
Fai una prova
Prova il tuo servizio inviando richieste POST
HTTP con descrizioni della sintassi DOT nel payload della richiesta.
Invia una richiesta HTTP al tuo servizio.
Puoi incorporare il diagramma in una pagina web:
-
Per ottenere l'indirizzo IP esterno del bilanciatore del carico, esegui questo comando:
kubectl get svc istio-ingressgateway -n ASM-INGRESS-NAMESPACE
Sostituisci ASM-INGRESS-NAMESPACE con lo spazio dei nomi in cui si trova il traffico in entrata di Anthos Service Mesh. Specifica
istio-system
se hai installato Anthos Service Mesh utilizzando la sua configurazione predefinita.L'output risultante è simile al seguente:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) istio-ingressgateway LoadBalancer XX.XX.XXX.XX pending 80:32380/TCP,443:32390/TCP,32400:32400/TCP
dove il valore EXTERNAL-IP è l'indirizzo IP esterno del bilanciatore del carico.
Esegui un comando curl utilizzando questo indirizzo
EXTERNAL-IP
nell'URL. Non includere il protocollo (ad es.http://
) aSERVICE_DOMAIN
.curl -G -H "Host: SERVICE_DOMAIN" http://EXTERNAL-IP/diagram.png \ --data-urlencode "dot=digraph Run { rankdir=LR Code -> Build -> Deploy -> Run }" \ > diagram.png
-
Apri il file
diagram.png
risultante in qualsiasi applicazione che supporti i filePNG
, come Chrome.Dovrebbe avere il seguente aspetto:
Puoi esplorare una piccola raccolta di descrizioni dei diagrammi pronti all'uso.
- Copia i contenuti del file
.dot
selezionato Incollalo in un comando
curl
:curl -G -H "Host: SERVICE_DOMAIN" http://EXTERNAL-IP/diagram.png \ --data-urlencode "dot=digraph Run { rankdir=LR Code -> Build -> Deploy -> Run }" \ > diagram.png
Esegui la pulizia
Puoi eliminare le risorse create per questo tutorial per evitare costi.
Eliminazione delle risorse del tutorial
Elimina il servizio di gestione Knative di cui hai eseguito il deployment in questo tutorial:
gcloud run services delete SERVICE-NAME
Dove SERVICE-NAME è il nome del servizio che hai scelto.
Puoi anche eliminare i servizi di gestione Knative dalla console Google Cloud:
Rimuovi le configurazioni predefinite di gcloud che hai aggiunto durante la configurazione del tutorial:
gcloud config unset run/platform gcloud config unset run/cluster gcloud config unset run/cluster_location
Rimuovi la configurazione del progetto:
gcloud config unset project
Elimina le altre risorse Google Cloud create in questo tutorial:
- Elimina da Container Registry l'immagine container denominata
gcr.io/<var>PROJECT_ID</var>/graphviz
. - Se hai creato un cluster per questo tutorial, elimina il cluster.
- Elimina da Container Registry l'immagine container denominata
Passaggi successivi
- Sperimenta con l'app Graphviz:
- Aggiungi il supporto per altre utilità di Graphviz che applicano diversi algoritmi alla generazione dei diagrammi.
- Salva i diagrammi in Cloud Storage. Vuoi salvare l'immagine o la sintassi DOT?
- Implementa la protezione dagli abusi dei contenuti con l'API Cloud Natural Language.
- Esplora le architetture di riferimento, i diagrammi e le best practice su Google Cloud. Visita il nostro Cloud Architecture Center.