Modelos de instância determinísticos


Esta página descreve quando e por que motivo deve criar modelos de instâncias determinísticos. Os modelos de instância determinísticos indicam explicitamente o tipo de serviços ou apps de terceiros a instalar nas suas instâncias quando o modelo de instância é implementado. Ao criar modelos de instâncias determinísticos, minimiza a ambiguidade e o comportamento inesperado dos modelos de instâncias.

Porquê criar modelos de instâncias determinísticos

Em geral, recomendamos que as propriedades do modelo de instância sejam o mais explícitas e determinísticas possível. Se usar scripts de inicialização nos modelos de instâncias que instalam ou usam serviços de terceiros, certifique-se de que estes scripts fornecem informações explícitas, como a versão da app a instalar. O Compute Engine só pode basear-se em informações definidas no modelo e não tem controlo sobre os serviços de terceiros referenciados. Se o modelo for demasiado vago, o modelo de instância pode ter um comportamento inesperado.

Por exemplo, considere o seguinte comando para criar um modelo de instância com um script de arranque que instala o apache2 e usa um ficheiro alojado num servidor externo:

gcloud compute instance-templates create example-template-with-startup \
    --image-family debian-9 \
    --image-project debian-cloud \
    --metadata startup-script='#! /bin/bash
    sudo apt install -y apache2
    scp myuser@108.59.87.185:index.php /var/www/'

Existem dois potenciais problemas com este script de arranque:

  • O script não define explicitamente que versão do apache2 instalar e baseia-se na versão atual disponível no repositório apt.
  • O script baseia-se num ficheiro alojado num fornecedor externo que não tem versões e que pode ter sido alterado desde a última vez que o modelo de instância foi usado.

Se usar um autoscaler, um modelo de instância não determinístico pode fazer com que o autoscaler adicione novas instâncias a um grupo de instâncias gerido com uma configuração diferente, como uma versão diferente do apache2.

Da mesma forma, se aplicou este modelo a um grupo de instâncias gerido, atualizou o grupo para um serviço de modelo diferente e, em seguida, decidiu reverter para o modelo anterior, pode acabar com instâncias que usam uma versão diferente do ficheiro apache2 ou index.php do que antes da atualização, porque as suas instâncias obtêm sempre a versão mais recente no arranque.

Evitar o comportamento ambíguo ou inesperado do modelo de instância

Para evitar um comportamento inesperado do modelo, use os seguintes métodos:

  • Use imagens otimizadas para contentores ou o Docker com etiquetas do Docker. Por exemplo, recomendamos que atribua novas etiquetas para cada nova compilação da sua imagem do Docker e use estas etiquetas nos modelos de instâncias em vez da etiqueta mais recente predefinida. Para uma imagem otimizada para contentores, pode referenciar explicitamente uma compilação específica da sua imagem no ficheiro de manifesto. O exemplo abaixo usa a imagem do Docker "myimage" na versão etiquetada com "version_2_1_3":

    version: v1beta2
    containers:
      - name: simple-echo
        image: myimage:version_2_1_3
           [ rest of your manifest file ]
    
  • Crie uma imagem personalizada para usar como imagem do modelo. Isto é preferível aos scripts de arranque, porque garante que todas as instâncias são iguais. Os scripts de arranque podem ter resultados diferentes após as atualizações do pacote de distribuição. Use scripts de arranque nos seus modelos de instâncias para criar protótipos e desenvolver rapidamente, e use imagens personalizadas quando estiver pronto para implementar serviços de qualidade de produção.

  • Se usar scripts de arranque, considere atualizá-los para serem determinísticos. Por exemplo, crie uma nova versão do modelo anterior e especifique um script de arranque determinístico da seguinte forma:

    gcloud compute instance-templates create example-template-with-startup-2-1-3 \
        --image-family debian-9 \
        --image-project debian-cloud \
        --metadata startup-script='#! /bin/bash
        sudo apt install -y apache2=2.2.20-1ubuntu1
        scp myuser@108.59.87.185:version_2_1_3/index.php /var/www/'
    

    em que "version_2_1_3" é um subdiretório que contém scripts PHP para a versão 2.1.3 do seu serviço.

  • Quando especificar um modelo de instância, por exemplo, quando estiver a criar ou a atualizar um grupo de instâncias gerido, a Google recomenda que especifique o valor do ID do modelo em vez do valor do nome. Embora ambos os valores sejam válidos, o ID é exclusivo, o que significa que o modelo de instância que especificar é o que é usado quando cria VMs a partir desse modelo de instância. A utilização de um ID em vez de um nome ajuda a mitigar potenciais vulnerabilidades de segurança. Por exemplo, vulnerabilidades TOCTOU, em que um atacante pode eliminar um modelo e recriá-lo com o mesmo nome antes da sua utilização.

    Para ver o ID de um modelo de instância, consulte o artigo Obtenha informações sobre um modelo de instância.

O que se segue?