Usa discos de arranque secundarios para precargar datos o imágenes de contenedor


En esta página, se muestra cómo mejorar la latencia de inicio de la carga de trabajo con discos de arranque secundarios en Google Kubernetes Engine (GKE). Con los discos de arranque secundarios, puedes precargar datos o imágenes de contenedores en nodos nuevos. Esto permite que las cargas de trabajo alcancen un inicio en frío rápido y mejoren el uso general de los recursos aprovisionados.

Descripción general

A partir de la versión 1.28.3-gke.1067000, puedes configurar el grupo de nodos con discos de arranque secundarios. Puedes indicar a GKE que aprovisione los nodos y los cargue previamente con datos, como un modelo de aprendizaje automático o una imagen de contenedor. El uso de datos precargados o una imagen de contenedor en un disco secundario tiene los siguientes beneficios para tus cargas de trabajo:

  • Ajuste de escala automático más rápido
  • Menor latencia cuando se extraen imágenes grandes
  • Recuperación más rápida ante interrupciones, como eventos de mantenimiento y errores del sistema

Antes de comenzar

Antes de comenzar, asegúrate de haber realizado las siguientes tareas:

  • Habilita la API de Kubernetes Engine de Google.
  • Habilitar la API de Kubernetes Engine de Google
  • Si deseas usar Google Cloud CLI para esta tarea, instala y, luego, inicializa gcloud CLI. Si ya instalaste gcloud CLI, ejecuta gcloud components update para obtener la versión más reciente.

Requisitos

Los siguientes requisitos se aplican al uso del disco de arranque secundario:

  1. La función está disponible en la versión 1.28.3-gke.106700 de GKE y versiones posteriores.
  2. Cuando modificas la imagen de disco, debes crear un grupo de nodos nuevo. No puedes actualizar la imagen de disco en los nodos existentes.

  3. Debes configurar la transmisión de imágenes para usar la función de disco de arranque secundario.

Configura el disco de arranque secundario

En las siguientes secciones, se describe cómo configurar el disco de arranque secundario:

Precarga datos

Antes de crear el clúster de GKE y el grupo de nodos con un disco de arranque secundario, te recomendamos que prepares la imagen de disco cuando los datos estén listos durante la compilación, lo ideal sería automatizado en una canalización de CI/CD.

Prepara la imagen de disco que contiene los datos

Para crear una imagen de disco personalizada como fuente de datos, completa los siguientes pasos:

  1. Crea una VM con un disco en blanco.
  2. Conéctate a la VM a través de SSH.
    1. Activa el disco en blanco.
    2. Descarga los datos en el disco en blanco.
  3. Crea una imagen personalizada a partir del disco.

Crea el clúster de GKE y el grupo de nodos con un disco de arranque secundario

Puedes configurar un disco de arranque secundario con la gcloud CLI:

  1. Crea un clúster de GKE Standard con la transmisión de imágenes habilitada mediante la marca --enable-image-streaming:

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

    Reemplaza lo siguiente:

    • CLUSTER_NAME: Es el nombre del clúster.
    • LOCATION: Es la ubicación del clúster
    • CLUSTER-VERSION: la versión de GKE que se usará. Debe ser 1.28.3-gke.106700 o una versión posterior.
  2. Crea un grupo de nodos con un disco de arranque secundario mediante la marca --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
    

    Reemplaza DISK_IMAGE_NAME por el nombre de tu imagen de disco.

    GKE crea un grupo de nodos en el que cada nodo tiene un disco secundario con datos precargados. Esto conecta y activa el disco de arranque secundario en el nodo.

  3. De forma opcional, puedes activar la imagen de disco secundaria en los contenedores del Pod mediante una activación de volumen hostPath. Usa el siguiente manifiesto para definir los recursos de un Pod y usa una activación de volumen hostPath para precargar el disco de datos en sus contenedores:

    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
    

    Reemplaza DISK_IMAGE_NAME por el nombre de tu imagen de disco.

Precarga la imagen de contenedor

En esta guía, usarás gke-disk-image-builder para crear una instancia de VM y extraer las imágenes de contenedor en un disco. El gke-disk-image-builder crea una imagen de disco a partir de ese disco. Te recomendamos que prepares la imagen de disco justo después del paso de compilación de la imagen del contenedor, lo ideal sería automatizada en una canalización de CI/CD.

  1. Crea un bucket de Cloud Storage para almacenar los registros de ejecución de gke-disk-image-builder.
  2. Crea una imagen de disco con imágenes de contenedor precargadas.

    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
    

    Reemplaza lo siguiente:

    • PROJECT_ID: Es el nombre de tu proyecto de Google Cloud.
    • DISK_IMAGE_NAME: Es el nombre de la imagen del disco. Por ejemplo:nginx-python-image
    • LOCATION: Es la ubicación del clúster
    • LOG_BUCKET_NAME: el nombre del bucket de Cloud Storage para almacenar los registros de ejecución. Por ejemplo, gke-secondary-disk-image-logs/

  3. Crea un clúster de GKE Standard con la transmisión de imágenes habilitada:

    gcloud container clusters create CLUSTER_NAME \
        --location=LOCATION \
        --cluster-version=CLUSTER_VERSION \
        --enable-image-streaming
    
  4. Crea un grupo de nodos con un disco de arranque secundario:

    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. Agrega un nodeSelector a tu plantilla de Pods:

    nodeSelector:
        cloud.google.com/gke-nodepool: NODE_POOL_NAME
    
  6. Confirma que la caché del disco de arranque secundario esté en uso:

    kubectl get events --all-namespaces
    

    El resultado es similar al siguiente:

    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
    

    La latencia de extracción de la imagen esperada para la imagen de contenedor almacenada en caché no debe ser de más de unos segundos, sin importar el tamaño de la imagen. Para verificar la latencia de extracción de imágenes, ejecuta el siguiente comando:

    kubectl describe pod POD_NAME
    

    Reemplaza POD_NAME con el nombre del pod.

    El resultado es similar al siguiente:

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

¿Qué sigue?