Questo tutorial mostra come creare un servizio Knative serving personalizzato.
che trasforma un parametro di input per la descrizione del grafico in un diagramma nell'elemento PNG
formato dell'immagine. Utilizza Graphviz che
viene installato come pacchetto di sistema nell'ambiente container del servizio.
Graphviz viene utilizzato tramite le utilità a riga di comando per gestire le richieste.
Obiettivi
- Scrivere e creare un container personalizzato con un Dockerfile
- Scrivi, crea ed esegui il deployment di un servizio Knative serving
- Usa il punto Graphviz per generare diagrammi
- Testa il servizio pubblicando un diagramma della sintassi DOT dalla raccolta o da una tua creazione
Costi
In questo documento vengono utilizzati i seguenti componenti fatturabili di Google Cloud:
Per generare una stima dei costi basata sull'utilizzo previsto,
utilizza il Calcolatore prezzi.
Prima di iniziare
- Questo tutorial presuppone che tu abbia Knative serving installati e configurati sul tuo cluster.
- Assicurati che l'ambiente a riga di comando sia configurato e che gli strumenti siano up-to-date:
Recupero dell'esempio di codice in corso
Per recuperare l'esempio di codice da utilizzare:
Clona il repository dell'app di esempio nella tua macchina locale:
Node.js
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
In alternativa, puoi scarica l'esempio . come file ZIP ed estrarlo.
Python
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
In alternativa, puoi scarica l'esempio . come file ZIP ed estrarlo.
Vai
git clone https://github.com/GoogleCloudPlatform/golang-samples.git
In alternativa, puoi scarica l'esempio . come file ZIP ed estrarlo.
Java
git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git
In alternativa, puoi scarica l'esempio . come file ZIP ed estrarlo.
Passa alla directory che contiene l'esempio di Knative serving codice:
Node.js
cd nodejs-docs-samples/run/system-package/
Python
cd python-docs-samples/run/system-package/
Vai
cd golang-samples/run/system_package/
Java
cd java-docs-samples/run/system-package/
Visualizzazione dell'architettura
L'architettura di base è simile alla seguente:
![Diagramma che mostra il flusso di richieste dall'utente al servizio web al grafico
utilità.](https://cloud.google.com/static/anthos/run/docs/tutorials/images/diagram-as-a-service.png?authuser=4&hl=it)
L'utente invia una richiesta HTTP al servizio Knative serving che esegue un'utilità Graphviz per trasformare la richiesta in un'immagine. L'immagine è inviati all'utente come risposta HTTP.
Nozioni di base sul codice
Definisci la configurazione del tuo ambiente con l'Dockerfile
Dockerfile
è specifico per la lingua e l'ambiente operativo di base.
come Ubuntu, che il tuo servizio utilizzerà.
Questo servizio richiede uno o più pacchetti di sistema aggiuntivi non disponibili da predefinito.
Apri
Dockerfile
in un editor.Cerca un
Dockerfile
RUN
l'Informativa. Questa istruzione consente di eseguire comandi shell arbitrari per modificare dell'ambiente. SeDockerfile
prevede più fasi, identificate da più istruzioniFROM
, lo troverai nell'ultima fase.I pacchetti specifici richiesti e il meccanismo per installarli variano a seconda il sistema operativo dichiarato all'interno del container.
Per ricevere istruzioni relative al tuo sistema operativo o all'immagine di base, fai clic sull'icona scheda appropriata.
Debian/Ubuntu Alpine Alps richiede un secondo pacchetto per il supporto dei caratteri.Per determinare il sistema operativo dell'immagine container, controlla il nome in l'istruzione
FROM
o un file README associato all'immagine di base. Ad esempio: Se estendi danode
, puoi trovare la documentazione e l'istanza principaleDockerfile
su 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 un
che esegue il comando appropriato dell'utilità dot
.
Nel gestore HTTP di seguito, viene estratto un parametro di input per la descrizione del grafico
la variabile stringa di query dot
.
Le descrizioni dei grafici possono includere caratteri che devono essere Codificato come URL per l'utilizzo in una stringa di query.
Node.js
Python
Vai
Java
Dovrai distinguere tra errori interni del server e utenti non validi
di testo. Questo servizio di esempio restituisce un errore interno del server per tutti i punti
errori della riga di comando, a meno che il messaggio di errore non contenga la stringa syntax
, che
indica un problema di input utente.
Generare un diagramma
La logica di base della generazione di diagrammi utilizza lo strumento a riga di comando. il parametro di input della descrizione del grafico in un diagramma nel formato di immagine PNG.
Node.js
Python
Vai
Java
Progettazione di un servizio sicuro
Eventuali vulnerabilità nello strumento dot
sono potenziali vulnerabilità di
servizio web. Puoi mitigare questo problema utilizzando versioni aggiornate del
graphviz
creando regolarmente l'immagine container.
Se estendi l'esempio corrente in modo da accettare l'input utente come riga di comando occorre proteggere attacchi di tipo command-injection. Alcuni di i modi per prevenire gli attacchi di iniezione includono:
- Mappatura degli input a un dizionario di parametri supportati
- Gli input di convalida corrispondono a un intervallo di valori di sicurezza nota, magari utilizzando regolari espressioni
- Sequenza di escape degli input per garantire che la sintassi della shell non venga valutata
Spedizione del codice
Per distribuire il codice, devi utilizzare Cloud Build e caricarlo sul Container Registry ed eseguire il deployment su Knative serving:
Esegui questo comando per creare il container e pubblicarlo su e Container Registry.
Node.js
gcloud builds submit --tag gcr.io/PROJECT_ID/graphviz
Dove PROJECT_ID è l'ID progetto Google Cloud e
graphviz
è l'ID che vuoi assegnare al servizio.Se l'operazione riesce, verrà visualizzato il messaggio SUCCESS contenente l'ID, la creazione ora e nome dell'immagine. L'immagine è archiviata in Container Registry e può essere se lo desideri,
Python
gcloud builds submit --tag gcr.io/PROJECT_ID/graphviz
Dove PROJECT_ID è l'ID progetto Google Cloud e
graphviz
è l'ID che vuoi assegnare al servizio.Se l'operazione riesce, verrà visualizzato il messaggio SUCCESS contenente l'ID, la creazione ora e nome dell'immagine. L'immagine è archiviata in Container Registry e può essere se lo desideri,
Vai
gcloud builds submit --tag gcr.io/PROJECT_ID/graphviz
Dove PROJECT_ID è l'ID progetto Google Cloud e
graphviz
è l'ID che vuoi assegnare al servizio.Se l'operazione riesce, verrà visualizzato il messaggio SUCCESS contenente l'ID, la creazione ora e nome dell'immagine. L'immagine è archiviata in Container Registry e può essere se lo desideri,
Java
Questo esempio utilizza Jib per creare utilizzando strumenti Java comuni. Jib ottimizza le build di container senza la necessità di un Dockerfile o di avere Docker installato. Scopri di più sulla creazione di container Java con Jib.Utilizzando il Dockerfile, configura e crea un'immagine di base con il sistema pacchetti installati per sostituire l'immagine di base predefinita di Jib:
gcloud builds submit --tag gcr.io/PROJECT_ID/graphviz-base
Dove PROJECT_ID è l'ID progetto Google Cloud.
Crea il tuo 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 è l'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
è l'ID del container indicato sopra, mentregraphviz-web
è il nome completamente gestito di Google Cloud.Attendi il completamento del deployment: l'operazione può richiedere circa mezzo minuto.
Se vuoi eseguire il deployment di un aggiornamento del codice nel servizio, ripeti la precedente passaggi. Ogni deployment in un servizio crea una nuova revisione e, e inizia a gestire il traffico quando è pronto.
Fai una prova
Prova il tuo servizio inviando richieste POST
HTTP con sintassi DOT
nel payload della richiesta.
Invia una richiesta HTTP al tuo servizio.
Puoi incorporare il diagramma in una pagina web:
-
Per ottenere l'IP esterno per il 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 Cloud Service Mesh. Specifica
istio-system
se ha installato Cloud Service Mesh utilizzando la 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 è il tuo indirizzo IP esterno del modulo di Google Cloud.
Esegui un comando curl utilizzando questo indirizzo
EXTERNAL-IP
nell'URL. Azioni sconsigliate includi 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 supportiPNG
file, come Chrome.Dovrebbe avere il seguente aspetto:
. Fonte: Descrizione DOT
Puoi esplorare una piccola raccolta di descrizioni dei diagrammi già pronte.
- 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 in corso...
Elimina il servizio Knative serving 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 Knative serving 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 altre risorse Google Cloud create in questo tutorial:
- Elimina l'immagine container denominata
gcr.io/<var>PROJECT_ID</var>/graphviz
da Container Registry. - Se hai creato un cluster per questo tutorial, elimina il cluster.
- Elimina l'immagine container denominata
Passaggi successivi
- Sperimenta con l'app Graphviz:
- È stato aggiunto il supporto di altre utilità di Graphviz che applicano algoritmi diversi a la generazione di diagrammi.
- Salva i diagrammi in Cloud Storage. Vuoi salvare l'immagine? o la sintassi DOT?
- Implementa la protezione dall'abuso dei contenuti con l'API Cloud Natural Language.
- Esplora le architetture di riferimento, i diagrammi e le best practice su Google Cloud. Dai un'occhiata al nostro Centro architetture cloud.