Usar discos de inicialização secundários para pré-carregar dados ou imagens de contêiner


Nesta página, mostramos como melhorar a latência de inicialização da carga de trabalho usando discos de inicialização secundários no Google Kubernetes Engine (GKE). Com discos de inicialização secundários, é possível pré-carregar dados ou imagens de contêiner em novos nós. Isso permite que as cargas de trabalho realizem uma inicialização a frio rápida e melhorem a utilização geral dos recursos provisionados.

Visão geral

A partir da versão 1.28.3-gke.1067000, é possível configurar o pool de nós com discos de inicialização secundários. Peça ao GKE para provisionar os nós e pré-carregá-los com dados, como um modelo de machine learning ou uma imagem de contêiner. O uso de dados pré-carregados ou de uma imagem de contêiner em um disco secundário tem os seguintes benefícios para suas cargas de trabalho:

  • Escalonamento automático mais rápido
  • Latência reduzida ao extrair imagens grandes
  • Recuperação mais rápida de interrupções, como eventos de manutenção e erros do sistema

Antes de começar

Antes de começar, verifique se você realizou as tarefas a seguir:

  • Ativar a API Google Kubernetes Engine.
  • Ativar a API Google Kubernetes Engine
  • Se você quiser usar a Google Cloud CLI para essa tarefa, instale e, em seguida, inicialize a CLI gcloud. Se você instalou a CLI gcloud anteriormente, instale a versão mais recente executando gcloud components update.

Requisitos

Os requisitos a seguir se aplicam ao uso do disco de inicialização secundário:

  1. O recurso está disponível na versão 1.28.3-gke.106700 e mais recentes do GKE.
  2. Ao modificar a imagem do disco, é preciso criar um novo pool de nós. Não é possível atualizar a imagem do disco nos nós atuais.

  3. Configure o streaming de imagens para usar o recurso do disco de inicialização secundário.

Configurar o disco de inicialização secundário

As seções a seguir descrevem como configurar o disco de inicialização secundário:

Pré-carregar dados

Antes de criar o cluster do GKE e o pool de nós com um disco de inicialização secundário, recomendamos que você prepare a imagem do disco quando os dados estiverem prontos durante a criação, de preferência automatizados em um pipeline de CI/CD.

Preparar a imagem do disco que contém os dados

Crie uma imagem de disco personalizada como a fonte de dados concluindo as seguintes etapas:

  1. Crie uma VM com um disco em branco.
  2. Conecte-se por SSH à VM.
    1. Monte o disco em branco.
    2. Faça o download dos dados no disco em branco.
  3. Crie uma imagem personalizada a partir do disco.

Crie o pool de nós e o cluster do GKE com um disco de inicialização secundário

É possível configurar um disco de inicialização secundário usando a gcloud CLI:

  1. Crie um cluster do GKE Standard com o streaming de imagens ativado usando a sinalização --enable-image-streaming:

    gcloud container clusters create CLUSTER_NAME \
        --location LOCATION \
        --cluster-version=CLUSTER_VERSION \
        --enable-image-streaming
    

    Substitua:

    • CLUSTER_NAME: o nome do cluster.
    • LOCATION: o local do cluster.
    • CLUSTER-VERSION: a versão do GKE a ser usada. Precisa ser 1.28.3-gke.106700 ou mais recente.
  2. Crie um pool de nós com um disco de inicialização secundário usando a sinalização --secondary-boot-disk=disk-image:

    gcloud beta container node-pools create NODE_POOL_NAME \
        --cluster=CLUSTER_NAME \
        --location LOCATION \
        --enable-image-streaming \
        --secondary-boot-disk=disk-image=global/images/DATA_DISK IMAGE
    

    Substitua DISK_IMAGE_NAME pelo nome da imagem do disco.

    O GKE cria um pool de nós em que cada nó tem um disco secundário com dados pré-carregados. Isso anexa e monta o disco de inicialização secundário no nó.

  3. Outra opção é montar a imagem do disco secundário nos contêineres do pod usando uma montagem de volume hostPath. Use o manifesto a seguir para definir os recursos do pod e use uma montagem de volume hostPath para pré-carregar o disco de dados nos contêineres:

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-name
    spec:
      containers:
      ...
      volumeMounts:
      - mountPath: /usr/local/data_path_sbd
        name: data_path_sbd
    ...
    volumes:
      - name: data_path_sbd
        hostPath:
            path: /mnt/disks/gke-secondary-disks/gke-DISK_IMAGE_NAME-disk
    

    Substitua DISK_IMAGE_NAME pelo nome da imagem do disco.

Pré-carregar a imagem do contêiner

Neste guia, você usa gke-disk-image-builder para criar uma instância de VM e extrair as imagens de contêiner em um disco. O gke-disk-image-builder cria uma imagem do disco a partir desse disco. Recomendamos que você prepare a imagem do disco logo após a etapa de criação da imagem do contêiner, idealmente automatizada em um pipeline de CI/CD.

  1. Crie um bucket do Cloud Storage para armazenar os registros de execução de gke-disk-image-builder.
  2. Criar uma imagem de disco com imagens de contêiner pré-carregadas.

    go run ./cli \
        --project-name=PROJECT_ID \
        --image-name=DISK_IMAGE_NAME \
        --zone=LOCATION \
        --gcs-path=gs://LOG_BUCKET_NAME \
        --disk-size-gb=10 \
        --container-image=docker.io/library/python:latest \
        --container-image=docker.io/library/nginx:latest
    

    Substitua:

    • PROJECT_ID: o nome do seu projeto do Google Cloud.
    • DISK_IMAGE_NAME: o nome da imagem do disco. Por exemplo, nginx-python-image.
    • LOCATION: o local do cluster.
    • LOG_BUCKET_NAME: o nome do bucket do Cloud Storage para armazenar os registros de execução. Por exemplo, gke-secondary-disk-image-logs/.

  3. Crie um cluster do GKE Standard com o streaming de imagens ativado:

    gcloud container clusters create CLUSTER_NAME \
        --location=LOCATION \
        --cluster-version=CLUSTER_VERSION \
        --enable-image-streaming
    
  4. Crie um pool de nós com um disco de inicialização secundário:

    gcloud beta container node-pools create NODE_POOL_NAME \
    --cluster=CLUSTER_NAME \
    --location=LOCATION \ \
    --enable-image-streaming \
    --secondary-boot-disk=disk-image=global/images/DISK_IMAGE_NAME,mode=CONTAINER_IMAGE_CACHE
    
  5. Adicione um nodeSelector ao seu modelo de pod:

    nodeSelector:
        cloud.google.com/gke-nodepool: NODE_POOL_NAME
    
  6. Confirme se o cache do disco de inicialização secundário está em uso:

    kubectl get events --all-namespaces
    

    O resultado será assim:

    75s         Normal      SecondaryDiskCachin
    node/gke-pd-cache-demo-default-pool-75e78709-zjfm   Image
    gcr.io/k8s-staging-jobsejt/pytorch-mnist:latest is backed by secondary disk cache
    

    A latência de extração esperada da imagem do contêiner em cache não deve ser maior do que alguns segundos, independentemente do tamanho da imagem. Verifique a latência de extração da imagem executando o seguinte comando:

    kubectl describe pod POD_NAME
    

    Substitua POD_NAME pelo nome do pod.

    A saída será assim:

    …
      Normal  Pulled     15m   kubelet            Successfully pulled image "docker.io/library/nginx:latest" in 0.879149587s
    …
    

A seguir