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) para precargar datos o imágenes de contenedores en nodos nuevos. Esto permite que las cargas de trabajo logren un inicio en frío rápido y mejoren la utilización general de los recursos aprovisionados.
Antes de leer esta página, asegúrate de estar familiarizado con Google Cloud, Kubernetes, los contenedores, YAML, el tiempo de ejecución de containerd y Google Cloud CLI.
Descripción general
A partir de la versión 1.28.3-gke.1067000 en clústeres estándar y de la versión 1.30.1-gke.1329000 en clústeres de Autopilot, puedes configurar el grupo de nodos con discos de arranque secundarios. Puedes indicarle a GKE que aprovisione los nodos y los precargue con datos, como un modelo de aprendizaje automático (AA) o una imagen de contenedor. Usar imágenes de contenedor o datos precargados en un disco secundario tiene los siguientes beneficios para tus cargas de trabajo:
- Menor latencia cuando se extraen imágenes de contenedores grandes o se descargan datos
- Ajuste de escala automático más rápido
- Recuperación más rápida ante interrupciones, como eventos de mantenimiento y errores del sistema
En las siguientes secciones, se describe cómo configurar el disco de arranque secundario en los clústeres de GKE Autopilot y Standard.
Cómo funcionan los discos de arranque secundarios
Tu carga de trabajo puede iniciarse más rápido si usas la imagen de contenedor o los datos precargados en los discos de arranque secundarios. Los discos de arranque secundarios tienen las siguientes características:
- Los discos de arranque secundarios son discos persistentes respaldados por almacenamiento en bloque distribuido.
- El Persistent Disk se instancia a partir de imágenes de disco que creas con anticipación.
- Por motivos de escalabilidad, cada nodo obtiene su propia instancia de Persistent Disk creada a partir de la imagen de disco. Estas instancias de disco persistente se borran cuando se borra el nodo.
- Si la imagen de disco ya está en uso en la zona, el tiempo de creación de todos los discos posteriores creados a partir de la misma imagen de disco será menor.
- El tipo de disco de arranque secundario es el mismo que el del disco de arranque del nodo.
- El tamaño del disco de arranque secundario se decide según el tamaño de la imagen del disco.
Por lo general, agregar discos de arranque secundarios a tus grupos de nodos no aumenta el tiempo de aprovisionamiento de nodos. GKE aprovisiona discos de arranque secundarios a partir de la imagen de disco en paralelo con el proceso de aprovisionamiento de nodos.
Para admitir imágenes de contenedor precargadas, GKE extiende el entorno de ejecución de containerd con complementos que leen las imágenes de contenedor de los discos de arranque secundarios. Las imágenes de contenedor se reutilizan en las capas base.
Precarga las capas base grandes en el disco de arranque secundario, mientras que las capas superiores pequeñas se pueden extraer de Container Registry.
Antes de comenzar
Antes de comenzar, asegúrate de haber realizado las siguientes tareas:
- Habilita la API de Google Kubernetes Engine. Habilitar la API de Google Kubernetes Engine
- Si deseas usar Google Cloud CLI para esta tarea, instala y, luego, inicializa gcloud CLI. Si ya instalaste gcloud CLI, ejecuta el comando
gcloud components update
para obtener la versión más reciente. Es posible que las versiones anteriores de gcloud CLI no admitan la ejecución de los comandos que se describen en este documento.
Habilita la API del sistema de archivos de contenedor.
Requisitos
Se aplican los siguientes requisitos para usar el disco de arranque secundario:
- Tus clústeres ejecutan la versión 1.28.3-gke.1067000 de GKE en GKE Standard o la versión 1.30.1-gke.1329000 en GKE Autopilot.
- Cuando modifiques la imagen del disco, deberás crear un grupo de nodos nuevo. No se admite la actualización de la imagen de disco en nodos existentes.
- Configura la transmisión de imágenes para usar la función de disco de arranque secundario.
- Usa Container-Optimized OS con una imagen de nodo de containerd. Los nodos de Autopilot usan esta imagen de nodo de forma predeterminada.
Prepara la imagen de disco con datos listos durante el tiempo de compilación o con imágenes de contenedor precargadas. Asegúrate de que tu clúster tenga acceso a la imagen de disco para cargarla en los nodos.
Práctica recomendada: Automatiza la imagen de disco en una canalización de CI/CD.
Limitaciones
No puedes actualizar los discos de arranque secundarios para los nodos existentes. Para adjuntar una nueva imagen de disco, crea un grupo de nodos nuevo.
Precios
Cuando creas grupos de nodos con discos de arranque secundarios, GKE adjunta un Persistent Disk a cada nodo del grupo. Los discos persistentes se facturan según los precios de los discos de Compute Engine.
Prepara la imagen de disco de arranque secundario
Para preparar la imagen del disco de arranque secundario, elige la pestaña Imágenes para precargar imágenes de contenedor o la pestaña Datos para precargar datos y, luego, completa las siguientes instrucciones:
Imágenes
GKE proporciona una herramienta llamada gke-disk-image-builder
para crear una máquina virtual (VM), extraer las imágenes de contenedor en un disco y, luego, crear una imagen de disco a partir de ese disco.
Para crear una imagen de disco con varias imágenes de contenedor precargadas, completa los siguientes pasos:
- Crea un bucket de Cloud Storage
para almacenar los registros de ejecución de
gke-disk-image-builder
. - Crea una imagen de disco con
gke-disk-image-builder
.
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: 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/
.
Cuando creas una imagen de disco con gke-disk-image-builder
,Google Cloud crea varios recursos para completar el proceso (por ejemplo, una instancia de VM, un disco temporal y un disco persistente). Después de su ejecución, el
compilador de imágenes limpia todos los recursos, excepto la imagen de disco que
creaste.
Datos
Para crear una imagen de disco personalizada como fuente de datos, completa los siguientes pasos:
Configura el disco de arranque secundario
Puedes configurar el disco de arranque secundario en un clúster de GKE Autopilot o Standard.
Usa un clúster de Autopilot para una experiencia de Kubernetes completamente administrada. Para elegir el modo de operación de GKE que se adapte mejor a tus cargas de trabajo, consulta Elige un modo de operación de GKE.
Use GKE Autopilot
En esta sección, crearás una lista de entidades permitidas de imágenes de disco para permitir la imagen de disco en un clúster de Autopilot de GKE existente. Luego, modificas el selector de nodos de Pod para usar un disco de arranque secundario.
Permite las imágenes de disco en tu proyecto
En esta sección, crearás un GCPResourceAllowlist
para permitir que GKE
cree nodos con discos de arranque secundarios a partir de las imágenes de disco en tu
proyecto deGoogle Cloud .
Guarda el siguiente manifiesto como
allowlist-disk.yaml
:apiVersion: "node.gke.io/v1" kind: GCPResourceAllowlist metadata: name: gke-secondary-boot-disk-allowlist spec: allowedResourcePatterns: - "projects/PROJECT_ID/global/images/.*"
Reemplaza PROJECT_ID por el ID de tu proyecto para alojar la imagen de disco.
Aplica el manifiesto
kubectl apply -f allowlist-disk.yaml
GKE crea nodos con discos de arranque secundarios a partir de todas las imágenes de disco del proyecto.
Actualiza el selector de nodos de Pod para usar un disco de arranque secundario
En esta sección, modificarás la especificación del Pod para que GKE cree los nodos con el disco de arranque secundario.
Agrega un
nodeSelector
a tu plantilla de Pod:nodeSelector: cloud.google.com.node-restriction.kubernetes.io/gke-secondary-boot-disk-DISK_IMAGE_NAME: CONTAINER_IMAGE_CACHE.PROJECT_ID
Reemplaza lo siguiente:
- DISK_IMAGE_NAME: Es el nombre de tu imagen de disco.
- PROJECT_ID: Es el ID de tu proyecto para alojar la imagen de disco.
Usa el comando
kubectl apply
para aplicar la especificación de Kubernetes con la plantilla de Pod.Confirma que la memoria caché del disco de arranque secundario esté en uso:
kubectl get events --all-namespaces
El resultado es similar a este:
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 forma más confiable de confirmar que la memoria caché del disco de arranque secundario está en uso es la siguiente:
Consulta el registro del nodo que te interesa con este nombre de registro:
logName="projects/PROJECT_ID/logs/gcfs-snapshotter"
Reemplaza
PROJECT_ID
por el Google Cloud ID del proyecto.El registro similar a
Image gcr.io/k8s-staging-jobsejt/pytorch-mnist:latest is backed by secondary boot disk caching by 100.0%...
indica que se usó la memoria caché del disco de arranque secundario.Verifica la latencia de extracción de la imagen:
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 …
La latencia esperada de extracción de la imagen de contenedor almacenada en caché debería reducirse significativamente, independientemente del tamaño de la imagen.
Usa GKE Standard
Para crear un clúster de GKE Standard y un grupo de nodos, completa las siguientes instrucciones y elige la pestaña Imágenes o Datos según si deseas precargar imágenes de contenedores o datos en el disco de arranque secundario:
Imágenes
Para configurar un disco de arranque secundario, usa Google Cloud CLI o Terraform:
gcloud
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=VERSION \ --enable-image-streaming
Reemplaza lo siguiente:
- CLUSTER_NAME: El nombre de tu clúster.
- LOCATION: Es la ubicación del clúster
- VERSION: la versión de GKE que se usará. La
versión de GKE debe ser
1.28.3-gke.1067000
o posterior.
Crea un grupo de nodos con un disco de arranque secundario en el mismo proyecto:
gcloud 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
Reemplaza lo siguiente:
- NODE_POOL_NAME: el nombre del grupo de nodos
- CLUSTER_NAME: es el nombre del clúster existente.
- LOCATION: Es la zona o las zonas de procesamiento del clúster, separadas por comas.
- DISK_IMAGE_NAME: Es el nombre de tu imagen de disco.
Para crear un grupo de nodos con un disco de arranque secundario a partir de la imagen de disco en un proyecto diferente, completa los pasos que se indican en Usa un disco de arranque secundario en un proyecto diferente.
Agrega un
nodeSelector
a tu plantilla de Pod:nodeSelector: cloud.google.com/gke-nodepool: NODE_POOL_NAME
Confirma que la memoria caché del disco de arranque secundario esté en uso:
kubectl get events --all-namespaces
El resultado es similar a este:
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 forma más confiable de confirmar que la memoria caché del disco de arranque secundario está en uso es la siguiente:
Consulta el registro del nodo que te interesa con este nombre de registro:
logName="projects/PROJECT_ID/logs/gcfs-snapshotter"
Reemplaza
PROJECT_ID
por el Google Cloud ID del proyecto.El registro similar a
Image gcr.io/k8s-staging-jobsejt/pytorch-mnist:latest is backed by secondary boot disk caching by 100.0%...
indica que se usó la memoria caché del disco de arranque secundario.Para verificar la latencia de extracción de la imagen, 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 …
La latencia esperada de extracción de la imagen del contenedor almacenada en caché no debería superar unos pocos segundos, independientemente del tamaño de la imagen.
Terraform
Para crear un clúster con el grupo de nodos predeterminado a través de Terraform, consulta el siguiente ejemplo:
Crea un grupo de nodos con un disco de arranque secundario en el mismo proyecto:
Si deseas obtener más información sobre el uso de Terraform, consulta Compatibilidad con Terraform para GKE.
Agrega un
nodeSelector
a tu plantilla de Pod:nodeSelector: cloud.google.com/gke-nodepool: NODE_POOL_NAME
Confirma que la memoria caché del disco de arranque secundario esté en uso:
kubectl get events --all-namespaces
El resultado es similar a este:
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
Para verificar la latencia de extracción de la imagen, 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 …
La latencia esperada de extracción de la imagen del contenedor almacenada en caché no debería ser de más de unos segundos, independientemente del tamaño de la imagen.
Si deseas obtener más información sobre el uso de Terraform, consulta Compatibilidad con Terraform para GKE.
Datos
Puedes configurar un disco de arranque secundario y precargar datos con Google Cloud CLI o Terraform:
gcloud
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=VERSION \ --enable-image-streaming
Reemplaza lo siguiente:
- CLUSTER_NAME: El nombre de tu clúster.
- LOCATION: Es la ubicación del clúster
- VERSION: la versión de GKE que se usará. La versión de GKE debe ser 1.28.3-gke.1067000 o posterior.
Crea un grupo de nodos con un disco de arranque secundario mediante la marca
--secondary-boot-disk
:gcloud 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
Reemplaza lo siguiente:
- NODE_POOL_NAME: el nombre del grupo de nodos
- CLUSTER_NAME: es el nombre del clúster existente.
- LOCATION: Es la zona o las zonas de procesamiento del clúster, separadas por comas.
- DISK_IMAGE_NAME: Es el nombre de tu imagen de disco.
Para crear un grupo de nodos con un disco de arranque secundario a partir de la imagen de disco en un proyecto diferente, completa los pasos que se indican en Usa un disco de arranque secundario en un proyecto diferente.
GKE crea un grupo de nodos en el que cada nodo tiene un disco secundario con datos precargados. GKE adjunta y activa el disco de arranque secundario en el nodo.
Para acceder a los datos, activa la imagen de disco de arranque secundaria en los contenedores del Pod con una activación de volumen hostPath. Establece
/usr/local/data_path_sbd
en la ruta de acceso del contenedor en la que deseas que residan los datos: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.
Terraform
Para crear un clúster con el grupo de nodos predeterminado a través de Terraform, consulta el siguiente ejemplo:
Crea un grupo de nodos con un disco de arranque secundario en el mismo proyecto:
Si deseas obtener más información sobre el uso de Terraform, consulta Compatibilidad con Terraform para GKE.
Para acceder a los datos, activa la imagen de disco de arranque secundaria en los contenedores del Pod con una activación de volumen hostPath. Establece
/usr/local/data_path_sbd
en la ruta de acceso del contenedor en la que deseas que residan los datos: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.
Ajuste de escala automático de clústeres con discos de arranque secundarios
Para crear un grupo de nodos y configurar el ajuste de escala automático del clúster en un disco de arranque secundario, usa Google Cloud CLI:
gcloud 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 \
--enable-autoscaling \
--num-nodes NUM_NODES \
--min-nodes MIN_NODES \
--max-nodes MAX_NODES
Reemplaza lo siguiente:
- NODE_POOL_NAME: el nombre del grupo de nodos
- CLUSTER_NAME: es el nombre del clúster existente.
- LOCATION: Es la zona o las zonas de procesamiento del clúster, separadas por comas.
- DISK_IMAGE_NAME: Es el nombre de tu imagen de disco.
- MIN_NODES: es la cantidad mínima de nodos que se deben escalar de forma automática para el grupo de nodos especificado por zona. A fin de especificar la cantidad mínima de nodos para todo el grupo de nodos en las versiones 1.24 y posteriores de GKE, usa
--total-min-nodes
. Las marcas--total-min-nodes
y--total-max-nodes
son mutuamente excluyentes con las marcas--min-nodes
y--max-nodes
. - MAX_NODES: la cantidad máxima de nodos que se escalarán de forma automática para el grupo de nodos especificado por zona. A fin de especificar la cantidad máxima de nodos para todo el grupo de nodos en las versiones 1.24 de GKE y posteriores, usa
--total-max-nodes
. Las marcas--total-min-nodes
y--total-max-nodes
son mutuamente excluyentes con las marcas--min-nodes
y--max-nodes
.
Aprovisionamiento automático de nodos con discos de arranque secundarios
En GKE 1.30.1-gke.1329000 y versiones posteriores, puedes configurar el aprovisionamiento automático de nodos para crear y borrar automáticamente grupos de nodos y satisfacer las demandas de recursos de tus cargas de trabajo.
Crea un recurso personalizado de lista de entidades permitidas de imágenes de disco para el disco de arranque secundario del aprovisionamiento automático de nodos de GKE, similar al siguiente:
apiVersion: "node.gke.io/v1" kind: GCPResourceAllowlist metadata: name: gke-secondary-boot-disk-allowlist spec: allowedResourcePatterns: - "projects/<PROJECT_ID>/global/images/.*"
Reemplaza PROJECT_ID por el ID de tu proyecto para alojar la imagen de disco.
Para implementar el recurso personalizado de la lista de entidades permitidas en el clúster, ejecuta el siguiente comando:
kubectl apply -f ALLOWLIST_FILE
Reemplaza ALLOWLIST_FILE por el nombre del archivo de manifiesto.
Actualiza el selector de nodos de Pod para usar un disco de arranque secundario:
nodeSelector: cloud.google.com.node-restriction.kubernetes.io/gke-secondary-boot-disk-DISK_IMAGE_NAME:CONTAINER_IMAGE_CACHE.PROJECT_ID
Reemplaza lo siguiente:
- DISK_IMAGE_NAME: Es el nombre de tu imagen de disco.
- PROJECT_ID: Es el ID de tu proyecto para alojar la imagen de disco.
Usa un disco de arranque secundario en un proyecto diferente
Cuando creas un grupo de nodos con un disco de arranque secundario, puedes indicarle a GKE que use la imagen de disco en un proyecto diferente con la marca --secondary-boot-disk
.
Crea un grupo de nodos con un disco de arranque secundario a partir de la imagen de disco en un proyecto diferente con la marca
--secondary-boot-disk
. Por ejemplo:gcloud beta container node-pools create NODE_POOL_NAME \ --cluster=CLUSTER_NAME \ --location LOCATION \ --enable-image-streaming \ --secondary-boot-disk=disk-image=projects/IMAGE_PROJECT_ID/global/images/DISK_IMAGE_NAME,mode=CONTAINER_IMAGE_CACHE
Reemplaza lo siguiente:
- DISK_IMAGE_NAME: Es el nombre de tu imagen de disco.
- IMAGE_PROJECT_ID: Es el nombre del proyecto al que pertenece la imagen de disco.
GKE crea un grupo de nodos en el que cada nodo tiene un disco secundario con datos precargados. GKE adjunta y activa el disco de arranque secundario en el nodo.
Otorga acceso a imágenes de disco que pertenecen a otro proyecto agregando roles de "Usuario de imagen de Compute" para las cuentas de servicio del clúster:
- Cuenta de servicio de Compute predeterminada: CLUSTER_PROJECT_NUMBER@cloudservices.gserviceaccount.com
- Cuenta de servicio de GKE: service-CLUSTER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com
gcloud projects add-iam-policy-binding IMAGE_PROJECT_ID \ --member serviceAccount:CLUSTER_PROJECT_NUMBER@cloudservices.gserviceaccount.com \ --role roles/compute.imageUser gcloud projects add-iam-policy-binding IMAGE_PROJECT_ID \ --member serviceAccount:service-CLUSTER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com \ --role roles/compute.imageUser
¿Qué sigue?
- Usa Usa la transmisión de imágenes para extraer imágenes de contenedor para extraer imágenes de contenedor mediante la transmisión de datos de imágenes según tus cargas de trabajo.
- Consulta Mejora la eficiencia de la carga de trabajo con Fast Socket de NCCL para obtener información sobre cómo usar el complemento Fast Socket de la biblioteca de comunicación colectiva de NVIDIA (NCCL).