Este tutorial mostra como criar um serviço de publicação do Knative personalizado que transforma um parâmetro de entrada de descrição de um gráfico num diagrama no PNG
formato de imagem. Usa o Graphviz que está instalado como um pacote do sistema no ambiente do contentor do serviço.
O Graphviz é usado através de utilitários de linha de comandos para processar pedidos.
Objetivos
- Escreva e crie um contentor personalizado com um Dockerfile
- Escreva, crie e implemente um serviço de fornecimento do Knative
- Use a utilidade Graphviz dot para gerar diagramas
- Teste o serviço publicando um diagrama de sintaxe DOT da coleção ou da sua própria criação
Custos
Neste documento, usa os seguintes componentes faturáveis do Google Cloud:
Para gerar uma estimativa de custos com base na sua utilização projetada,
use a calculadora de preços.
Antes de começar
- Este tutorial pressupõe que tem o Knative serving instalado e configurado no seu cluster.
- Certifique-se de que o ambiente de linha de comandos está configurado e que as ferramentas estão atualizadas:
Obter o exemplo de código
Para obter o exemplo de código para utilização:
Clone o repositório da app de exemplo para a sua máquina local:
Node.js
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
Em alternativa, pode transferir o exemplo como um ficheiro ZIP e extraí-lo.
Python
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
Em alternativa, pode transferir o exemplo como um ficheiro ZIP e extraí-lo.
Go
git clone https://github.com/GoogleCloudPlatform/golang-samples.git
Em alternativa, pode transferir o exemplo como um ficheiro ZIP e extraí-lo.
Java
git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git
Em alternativa, pode transferir o exemplo como um ficheiro ZIP e extraí-lo.
Altere para o diretório que contém o código de exemplo do Knative Serving:
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/
Visualizar a arquitetura
A arquitetura básica tem o seguinte aspeto:

O utilizador faz um pedido HTTP ao serviço Knative Serving, que executa um utilitário Graphviz para transformar o pedido numa imagem. Essa imagem é enviada ao utilizador como resposta HTTP.
Compreender o código
Definir a configuração do ambiente com o Dockerfile
O seu Dockerfile
é específico do idioma e do ambiente de funcionamento base, como o Ubuntu, que o seu serviço vai usar.
Este serviço requer um ou mais pacotes de sistema adicionais que não estão disponíveis por predefinição.
Abra o
Dockerfile
num editor.Procure um extrato da
Dockerfile
RUN
Esta declaração permite a execução de comandos de shell arbitrários para modificar o ambiente. Se oDockerfile
tiver várias fases, identificadas pela localização de várias declaraçõesFROM
, é encontrado na última fase.Os pacotes específicos necessários e o mecanismo para os instalar variam consoante o sistema operativo declarado no contentor.
Para obter instruções para o seu sistema operativo ou imagem base, clique no separador adequado.
Debian/Ubuntu Alpine O Alpine requer um segundo pacote para suporte de fontes.Para determinar o sistema operativo da sua imagem de contentor, verifique o nome na declaração
FROM
ou num ficheiro README associado à sua imagem base. Por exemplo, se estender a partir denode
, pode encontrar documentação e o elemento principalDockerfile
no Docker Hub.Teste a personalização compilando a imagem
docker build
localmente ou com o Cloud Build.
Processar pedidos recebidos
O serviço de exemplo usa parâmetros do pedido HTTP recebido para invocar uma chamada de sistema que executa o comando de utilitário dot
adequado.
No controlador HTTP abaixo, um parâmetro de entrada de descrição do gráfico é extraído da variável de cadeia de consulta dot
.
As descrições dos gráficos podem incluir carateres que têm de ser codificados em URL para utilização numa string de consulta.
Node.js
Python
Go
Java
Tem de distinguir entre erros internos do servidor e entradas do utilizador inválidas. Este serviço de exemplo devolve um erro interno do servidor para todos os erros de linha de comandos, a menos que a mensagem de erro contenha a string syntax
, que indica um problema de entrada do utilizador.
A gerar um diagrama
A lógica essencial da geração de diagramas usa a ferramenta de linha de comando dot para processar o parâmetro de entrada de descrição do gráfico num diagrama no formato de imagem PNG.
Node.js
Python
Go
Java
Conceber um serviço seguro
Quaisquer vulnerabilidades na ferramenta dot
são potenciais vulnerabilidades do serviço Web. Pode mitigar esta situação usando versões atualizadas do pacote graphviz
através da recompilação da imagem do contentor de forma regular.
Se estender o exemplo atual para aceitar a entrada do utilizador como parâmetros da linha de comandos, deve proteger-se contra ataques de injeção de comandos. Algumas das formas de evitar ataques de injeção incluem:
- Mapeamento de entradas para um dicionário de parâmetros suportados
- Validar se as entradas correspondem a um intervalo de valores conhecidos e seguros, talvez usando expressões regulares
- Escape às entradas para garantir que a sintaxe da shell não é avaliada
Envio do código
Para enviar o seu código, compile-o com o Cloud Build, carregue-o para o Container Registry e implemente-o no Knative Serving:
Execute o seguinte comando para criar o contentor e publicar no Container Registry.
Node.js
gcloud builds submit --tag gcr.io/PROJECT_ID/graphviz
Onde PROJECT_ID é o ID do projeto Google Cloud e
graphviz
é o nome que quer dar ao seu serviço.Após a conclusão com êxito, é apresentada uma mensagem SUCCESS com o ID, a hora de criação e o nome da imagem. A imagem é armazenada no Container Registry e pode ser reutilizada, se quiser.
Python
gcloud builds submit --tag gcr.io/PROJECT_ID/graphviz
Onde PROJECT_ID é o ID do projeto Google Cloud e
graphviz
é o nome que quer dar ao seu serviço.Após a conclusão com êxito, é apresentada uma mensagem SUCCESS com o ID, a hora de criação e o nome da imagem. A imagem é armazenada no Container Registry e pode ser reutilizada, se quiser.
Go
gcloud builds submit --tag gcr.io/PROJECT_ID/graphviz
Onde PROJECT_ID é o ID do projeto Google Cloud e
graphviz
é o nome que quer dar ao seu serviço.Após a conclusão com êxito, é apresentada uma mensagem SUCCESS com o ID, a hora de criação e o nome da imagem. A imagem é armazenada no Container Registry e pode ser reutilizada, se quiser.
Java
Este exemplo usa o Jib para criar imagens do Docker com ferramentas Java comuns. O Jib otimiza as compilações de contentores sem necessidade de um Dockerfile ou de ter o Docker instalado. Saiba mais sobre como criar contentores Java com o Jib.Usando o Dockerfile, configure e crie uma imagem de base com os pacotes do sistema instalados para substituir a imagem de base predefinida do Jib:
gcloud builds submit --tag gcr.io/PROJECT_ID/graphviz-base
Onde PROJECT_ID é o ID do seu Google Cloud projeto.
Crie o contentor final com o Jib e publique-o no Container Registry:
mvn compile jib:build \ -Dimage=gcr.io/PROJECT_ID/graphviz \ -Djib.from.image=gcr.io/PROJECT_ID/graphviz-base
Onde PROJECT_ID é o ID do seu Google Cloud projeto.
Implemente com o seguinte comando:
gcloud run deploy graphviz-web --create-if-missing --image gcr.io/PROJECT_ID/graphviz
Onde PROJECT_ID é o ID do seu projeto, Google Cloud é o nome do contentor acima e
graphviz-web
é o nome do serviço.graphviz
Aguarde até que a implementação esteja concluída. Este processo pode demorar cerca de meio minuto.
Se quiser implementar uma atualização de código no serviço, repita os passos anteriores. Cada implementação num serviço cria uma nova revisão e começa automaticamente a publicar tráfego quando estiver pronta.
Experimentar
Experimente o seu serviço enviando pedidos HTTP POST
com descrições de sintaxe DOT
no payload do pedido.
Envie um pedido HTTP para o seu serviço.
Pode incorporar o diagrama numa página Web:
-
Para obter o IP externo do balanceador de carga, execute o seguinte comando:
kubectl get svc istio-ingressgateway -n ASM-INGRESS-NAMESPACE
Substitua ASM-INGRESS-NAMESPACE pelo espaço de nomes onde se encontra a entrada do Cloud Service Mesh. Especifique
istio-system
se tiver instalado o Cloud Service Mesh com a respetiva configuração predefinida.O resultado tem um aspeto semelhante ao seguinte:
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
em que o valor EXTERNAL-IP é o seu endereço IP externo do LoadBalancer.
Execute um comando curl com este endereço
EXTERNAL-IP
no URL. Não inclua o protocolo (por exemplo:http://
) emSERVICE_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
-
Abra o ficheiro
diagram.png
resultante em qualquer aplicação que suporte ficheirosPNG
, como o Chrome.Deve ter esta forma:
Fonte: Descrição do DOT
Pode explorar uma pequena coleção de descrições de diagramas prontas.
- Copie o conteúdo do ficheiro
.dot
selecionado Cole-o num 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
Limpar
Pode eliminar os recursos criados para este tutorial para evitar incorrer em custos.
Eliminar recursos do tutorial
Elimine o serviço Knative Serving que implementou neste tutorial:
gcloud run services delete SERVICE-NAME
Onde SERVICE-NAME é o nome do serviço escolhido.
Também pode eliminar serviços Knative serving a partir da Google Cloud consola:
Remova as configurações predefinidas do gcloud que adicionou durante a configuração do tutorial:
gcloud config unset run/platform gcloud config unset run/cluster gcloud config unset run/cluster_location
Remova a configuração do projeto:
gcloud config unset project
Elimine outros Google Cloud recursos criados neste tutorial:
- Elimine a imagem do contentor denominada
gcr.io/<var>PROJECT_ID</var>/graphviz
do Container Registry. - Se criou um cluster para este tutorial, elimine o cluster.
- Elimine a imagem do contentor denominada
O que se segue?
- Experimente a sua app Graphviz:
- Adicionar suporte para outras utilidades do Graphviz que aplicam algoritmos diferentes à geração de diagramas.
- Guarde diagramas no Cloud Storage. Quer guardar a imagem ou a sintaxe DOT?
- Implemente a proteção contra abuso de conteúdo com a API Cloud Natural Language.
- Explore arquiteturas de referência, diagramas e práticas recomendadas sobre o Google Cloud. Consulte o nosso Centro de arquitetura na nuvem.