Usar o streaming de imagens para reduzir o tempo de inicialização do contêiner

Neste documento, descrevemos como usar o streaming de imagens para extrair imagens de contêiner em jobs de contêiner do Batch.

O streaming de imagens permite que os jobs em lote sejam inicializados sem esperar o término do download de uma imagem de contêiner, o que oferece os seguintes benefícios:

  • Latência reduzida ao extrair imagens grandes
  • Tempo mais rápido para iniciar a execução do job

Antes de começar

Limitações

O streaming de imagens em lote tem as seguintes limitações:

  • O Batch só oferece suporte ao streaming de imagens para imagens de contêiner armazenadas no Artifact Registry. Se você usa o Container Registry para gerenciar imagens de contêiner, pode fazer a transição para o Artifact Registry.
  • Execute as VMs do job em lote no mesmo local em que você armazena a imagem de contêiner no Artifact Registry.
  • Contêineres que usam a versão 2 do manifesto de imagem do Docker (esquema 1) não são compatíveis.
  • Quando você usa o streaming de imagens, os contêineres executáveis aceitam apenas os seguintes campos:
    • imageUri
    • commands
    • entrypoint
    • volumes
    • enableImageStreaming
  • Não é possível usar imagens de contêiner com camadas vazias ou duplicadas.

Criar um job que use streaming de imagens

Para criar um job de contêiner do Batch que use streaming de imagens, faça o seguinte:

Use a Google Cloud CLI ou a API REST para criar um job de contêiner. Para ativar o streaming de imagens em um contêiner executável, defina o campo enableImageStreaming como true e o campo imageUri como uma imagem armazenada em um local do Artifact Registry que contenha o local da VM do job.

"container": {
    ...
    "enableImageStreaming": true
        }

Por exemplo, um job que usa streaming de imagens teria um arquivo de configuração JSON semelhante ao seguinte:

{
    "taskGroups": [
        {
            "taskCount": "1",
            "taskCountPerNode": "1",
            "taskSpec": {
                "runnables": [
                    {
                        "container": {
                            "imageUri": "LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE:TAG",
                            "enableImageStreaming": true
                        }
                    }
                ]
            }
        }
    ],
    "allocationPolicy": {
        "instances": [
            {
                "policy": {
                    "machineType": "e2-standard-4"
                }
            }
        ]
    },
    "logsPolicy": {
        "destination": "CLOUD_LOGGING"
    }
}

Substitua os seguintes valores:

  • LOCATION: o local regional ou multirregional do repositório em que a imagem está armazenada, por exemplo, us-east1 ou us. O local do contêiner precisa ser o mesmo das VMs do job do lote.
  • PROJECT-ID: o projeto que contém a imagem do contêiner. Se o ID do projeto contiver dois pontos (:), consulte Projetos com escopo de domínio.
  • REPOSITORY: o nome do repositório em que a imagem está armazenada.
  • IMAGE: o nome da imagem do contêiner.
  • TAG: a tag aplicada à imagem.

A seguir