Utilizzare i dischi di avvio secondari per precaricare i dati o le immagini dei container


Questa pagina mostra come migliorare la latenza di avvio del carico di lavoro utilizzando i dischi di avvio secondari in Google Kubernetes Engine (GKE) per precaricare i dati o le immagini dei container sui nuovi nodi. In questo modo, i carichi di lavoro possono ottenere un avvio a freddo rapido e migliorare l'utilizzo complessivo delle risorse di cui è stato eseguito il provisioning.

Prima di leggere questa pagina, assicurati di conoscere Google Cloud, Kubernetes, i container, YAML, il runtime containerd e Google Cloud CLI.

Panoramica

A partire dalla versione GKE 1.28.3-gke.1067000 nei cluster standard e dalla versione GKE 1.30.1-gke.1329000 nei cluster Autopilot, puoi configurare il pool di nodi con dischi di avvio secondari. Puoi chiedere a GKE di eseguire il provisioning dei nodi e di precaricarli con dati, ad esempio un modello di machine learning (ML) o un'immagine contenitore. L'utilizzo di immagini container o dati precaricati su un disco secondario offre i seguenti vantaggi per i tuoi carichi di lavoro:

  • Latenza ridotta durante il recupero di immagini container di grandi dimensioni o il download di dati
  • Scalabilità automatica più rapida
  • Ripristino più rapido dalle interruzioni, come eventi di manutenzione ed errori di sistema

Le sezioni seguenti descrivono come configurare il disco di avvio secondario nei cluster GKE Autopilot e Standard.

Come funzionano i dischi di avvio secondari

Il carico di lavoro può essere avviato più rapidamente utilizzando l'immagine o i dati del contenitore precaricati sui dischi di avvio secondari. I dischi di avvio secondari hanno le seguenti caratteristiche:

  • I dischi di avvio secondari sono dischi permanenti basati su archiviazione a blocchi distribuita. Se l'immagine disco è già in uso nella zona, la data di creazione di tutti i dischi successivi dalla stessa immagine disco sarà inferiore.
  • Il tipo di disco di avvio secondario è lo stesso del disco di avvio del nodo.
  • La dimensione del disco di avvio secondario dipende dalle dimensioni dell'immagine del disco.

L'aggiunta di dischi di avvio secondari ai pool di nodi non aumenta il tempo di provisioning dei nodi. GKE esegue il provisioning dei dischi di avvio secondari da un'immagine disco in parallelo con il processo di provisioning dei nodi.

Best practice:

Per supportare le immagini dei container precaricate, GKE estende il runtime di containerd con plug-in che leggono le immagini dei container dai dischi di avvio secondari. Le immagini container vengono riutilizzate dai livelli di base.

Precarica i livelli di base di grandi dimensioni nel disco di avvio secondario, mentre i piccoli livelli superiori possono essere estratti dal registro del contenitore.

Prima di iniziare

Prima di iniziare, assicurati di aver eseguito le seguenti operazioni:

  • Attiva l'API Google Kubernetes Engine.
  • Attiva l'API Google Kubernetes Engine
  • Se vuoi utilizzare Google Cloud CLI per questa attività, installa e poi inizializza gcloud CLI. Se hai già installato gcloud CLI, ottieni la versione più recente eseguendo gcloud components update.

Requisiti

Per l'utilizzo del disco di avvio secondario si applicano i seguenti requisiti:

  1. I tuoi cluster eseguono la versione GKE 1.28.3-gke.1067000 in GKE Standard o la versione 1.30.1-gke.1329000 in GKE Autopilot.
  2. Quando modifichi l'immagine del disco, devi creare un nuovo pool di nodi. L'aggiornamento dell'immagine disco sui nodi esistenti non è supportato.
  3. Configura lo streaming di immagini per utilizzare la funzionalità del disco di avvio secondario.
  4. Utilizza Container-Optimized OS con un'immagine del nodo containerd. I nodi Autopilot utilizzano questa immagine del nodo per impostazione predefinita.
  5. Prepara l'immagine del disco con i dati pronti durante la compilazione o con immagini container precaricate. Assicurati che il cluster abbia accesso all'immagine del disco da caricare sui nodi.

    Best practice:

    Automatizza l'immagine del disco in una pipeline CI/CD.

Limitazioni

I dischi di avvio secondari presentano le seguenti limitazioni:

  • Non puoi aggiornare i dischi di avvio secondari per i nodi esistenti. Per collegare una nuova immagine disco, crea un nuovo pool di nodi.

Prepara il disco di avvio secondario

Per preparare il disco di avvio secondario, scegli la scheda Immagini per il precaricamento delle immagini del container o la scheda Dati per il precaricamento dei dati, quindi completa le seguenti istruzioni:

Immagini

GKE fornisce uno strumento chiamato gke-disk-image-builder per creare una macchina virtuale (VM), estrarre le immagini dei contenitori su un disco e creare un'immagine disco da quel disco.

Per creare un'immagine disco con più immagini container precaricate, completa i seguenti passaggi:

  1. Crea un bucket Cloud Storage per archiviare i log di esecuzione di gke-disk-image-builder.
  2. Crea un'immagine 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

Sostituisci quanto segue:

  • PROJECT_ID: il nome del tuo progetto Google Cloud.
  • DISK_IMAGE_NAME: il nome dell'immagine del disco. Ad esempio, nginx-python-image.
  • LOCATION: la posizione del cluster.
  • LOG_BUCKET_NAME: il nome del bucket Cloud Storage per archiviare i log di esecuzione. Ad esempio,gke-secondary-disk-image-logs/.

Quando crei un'immagine disco con gke-disk-image-builder, Google Cloud crea più risorse per completare la procedura (ad esempio un'istanza VM, un disco temporaneo e un disco permanente). Al termine dell'esecuzione, lo strumento di creazione di immagini ripulisce tutte le risorse, ad eccezione dell'immagine disco che hai creato.

Dati

Crea un'immagine disco personalizzata come origine dati completando i seguenti passaggi:

  1. Crea una VM con un disco vuoto.
  2. Utilizza SSH per connetterti alla VM.
    1. Monta il disco vuoto.
    2. Scarica i dati sul disco vuoto.
  3. Crea un'immagine personalizzata dal disco.

Configura il disco di avvio secondario

Puoi configurare il disco di avvio secondario in un cluster GKE Autopilot o Standard.

Best practice:

Utilizza un cluster Autopilot per un'esperienza Kubernetes completamente gestita. Per scegliere la modalità operativa GKE più adatta ai tuoi carichi di lavoro, consulta Scegliere una modalità operativa GKE.

Usa GKE Autopilot

In questa sezione crei una lista consentita di immagini disco per consentire l'immagine disco in un cluster GKE Autopilot esistente. Poi, modifica il selettore dei nodi del pod in modo da utilizzare un disco di avvio secondario.

Consenti le immagini disco nel progetto

In questa sezione crei un GCPResourceAllowlist per consentire a GKE di creare nodi con dischi di avvio secondari dalle immagini dei dischi nel tuo progetto Google Cloud.

  1. Salva il seguente manifest come allowlist-disk.yaml:

    apiVersion: "node.gke.io/v1"
    kind: GCPResourceAllowlist
    metadata:
      name: gke-secondary-boot-disk-allowlist
    spec:
      allowedResourcePatterns:
      - "projects/PROJECT_ID/global/images/.*"
    

    Sostituisci PROJECT_ID con l'ID del tuo progetto per ospitare l'immagine del disco.

  2. Applica il manifest:

    kubectl apply -f allowlist-disk.yaml
    

    GKE crea nodi con dischi di avvio secondari da tutte le immagini dei dischi del progetto.

Aggiorna il selettore dei nodi del pod per utilizzare un disco di avvio secondario

In questa sezione, modificherai la specifica del pod in modo che GKE crei i nodi con il disco di avvio secondario.

  1. Aggiungi un nodeSelector al modello di pod:

    nodeSelector:
        cloud.google.com.node-restriction.kubernetes.io/gke-secondary-boot-disk-DISK_IMAGE_NAME=CONTAINER_IMAGE_CACHE.PROJECT_ID
    

    Sostituisci quanto segue:

    • DISK_IMAGE_NAME: il nome dell'immagine disco.
    • PROJECT_ID: l'ID del tuo progetto per ospitare l'immagine del disco.
  2. Utilizza il comando kubectl apply per applicare la specifica Kubernetes con il modello di pod.

  3. Verifica che la cache del disco di avvio secondario sia in uso:

    kubectl get events --all-namespaces
    

    L'output è simile al seguente:

    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
    
  4. Controlla la latenza del pull delle immagini:

    kubectl describe pod POD_NAME
    

    Sostituisci POD_NAME con il nome del pod.

    L'output è simile al seguente:

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

La latenza di estrazione dell'immagine prevista per l'immagine del contenitore memorizzata nella cache dovrebbe essere ridotta notevolmente, indipendentemente dalle dimensioni dell'immagine.

Utilizzare GKE Standard

Per creare un cluster GKE Standard e un pool di nodi, completa le seguenti istruzioni, scegliendo la scheda Immagini o Dati in base al suo voler precaricare le immagini dei contenitori o i dati sul disco di avvio secondario:

Immagini

Per configurare un disco di avvio secondario, utilizza Google Cloud CLI o Terraform:

gcloud

  1. Crea un cluster GKE Standard con lo streaming di immagini abilitato:

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

    Sostituisci quanto segue:

    • CLUSTER_NAME: il nome del tuo cluster.
    • LOCATION: la posizione del cluster.
    • VERSION: la versione di GKE da utilizzare. La versione GKE deve essere 1.28.3-gke.1067000 o successiva.
  2. Crea un pool di nodi con un disco di avvio secondario nello stesso progetto:

    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
    

    Sostituisci quanto segue:

    • NODE_POOL_NAME: il nome del pool di nodi.
    • CLUSTER_NAME: il nome del cluster esistente.
    • LOCATION: le zona di computing separate da virgole del cluster.
    • DISK_IMAGE_NAME: il nome dell'immagine disco.

    Per creare un pool di nodi con un disco di avvio secondario dall'immagine del disco in un altro progetto, completa i passaggi descritti in Utilizzare un disco di avvio secondario in un altro progetto.

  3. Aggiungi un nodeSelector al modello di pod:

    nodeSelector:
        cloud.google.com/gke-nodepool: NODE_POOL_NAME
    
  4. Verifica che la cache del disco di avvio secondario sia in uso:

    kubectl get events --all-namespaces
    

    L'output è simile al seguente:

    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
    
  5. Controlla la latenza del pull dell'immagine eseguendo il seguente comando:

    kubectl describe pod POD_NAME
    

    Sostituisci POD_NAME con il nome del pod.

    L'output è simile al seguente:

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

La latenza di estrazione dell'immagine prevista per l'immagine del contenitore memorizzata nella cache non deve essere superiore a pochi secondi, indipendentemente dalle dimensioni dell'immagine.

Terraform

  1. Per creare un cluster con il pool di nodi predefinito utilizzando Terraform, consulta il seguente esempio:

    resource "google_container_cluster" "default" {
      name               = "default"
      location           = "us-central1-a"
      initial_node_count = 1
      # Set `min_master_version` because secondary_boot_disks require GKE 1.28.3-gke.106700 or later.
      min_master_version = "1.28"
      # Setting `deletion_protection` to `true` would prevent
      # accidental deletion of this instance using Terraform.
      deletion_protection = false
    }
  2. Crea un pool di nodi con un disco di avvio secondario nello stesso progetto:

    resource "google_container_node_pool" "secondary-boot-disk-container" {
      name               = "secondary-boot-disk-container"
      location           = "us-central1-a"
      cluster            = google_container_cluster.default.name
      initial_node_count = 1
    
      node_config {
        machine_type = "e2-medium"
        image_type   = "COS_CONTAINERD"
        gcfs_config {
          enabled = true
        }
        secondary_boot_disks {
          disk_image = ""
          mode       = "CONTAINER_IMAGE_CACHE"
        }
      }
    }

    Per scoprire di più sull'utilizzo di Terraform, consulta Assistenza di Terraform per GKE.

  3. Aggiungi un nodeSelector al modello di pod:

    nodeSelector:
        cloud.google.com/gke-nodepool: NODE_POOL_NAME
    
  4. Verifica che la cache del disco di avvio secondario sia in uso:

    kubectl get events --all-namespaces
    

    L'output è simile al seguente:

    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
    
  5. Controlla la latenza del pull dell'immagine eseguendo il seguente comando:

    kubectl describe pod POD_NAME
    

    Sostituisci POD_NAME con il nome del pod.

    L'output è simile al seguente:

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

La latenza di pull dell'immagine prevista per l'immagine del contenitore memorizzata nella cache non deve essere superiore a pochi secondi, indipendentemente dalle dimensioni dell'immagine.

Per scoprire di più sull'utilizzo di Terraform, consulta la pagina Assistenza di Terraform per GKE.

Dati

Puoi configurare un disco di avvio secondario e precaricare i dati utilizzando l'interfaccia a Google Cloud CLI o Terraform:

gcloud

  1. Crea un cluster GKE Standard con lo streaming di immagini abilitato:

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

    Sostituisci quanto segue:

    • CLUSTER_NAME: il nome del tuo cluster.
    • LOCATION: la posizione del cluster.
    • VERSION: la versione di GKE da utilizzare. La versione GKE deve essere 1.28.3-gke.1067000 o successiva.
  2. Crea un pool di nodi con un disco di avvio secondario utilizzando il flag --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
    

    Sostituisci quanto segue:

    • NODE_POOL_NAME: il nome del pool di nodi.
    • CLUSTER_NAME: il nome del cluster esistente.
    • LOCATION: le zona di computing separate da virgole del cluster.
    • DISK_IMAGE_NAME: il nome dell'immagine disco.

    Per creare un pool di nodi con un disco di avvio secondario dall'immagine del disco in un altro progetto, completa i passaggi descritti in Utilizzare un disco di avvio secondario in un altro progetto.

    GKE crea un pool di nodi in cui ogni nodo ha un disco secondario con dati precaricati. GKE collega e monta il disco di avvio secondario sul nodo.

  3. Se vuoi, puoi montare l'immagine disco secondaria nei container del pod utilizzando un montaggio del volume hostPath. Utilizza il seguente manifest per definire le risorse di un pod e utilizza un montaggio del volume hostPath per precaricare il disco dati nei suoi container:

    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
    

    Sostituisci DISK_IMAGE_NAME con il nome dell'immagine del disco.

Terraform

  1. Per creare un cluster con il pool di nodi predefinito utilizzando Terraform, consulta il seguente esempio:

    resource "google_container_cluster" "default" {
      name               = "default"
      location           = "us-central1-a"
      initial_node_count = 1
      # Set `min_master_version` because secondary_boot_disks require GKE 1.28.3-gke.106700 or later.
      min_master_version = "1.28"
      # Setting `deletion_protection` to `true` would prevent
      # accidental deletion of this instance using Terraform.
      deletion_protection = false
    }
  2. Crea un pool di nodi con un disco di avvio secondario nello stesso progetto:

    resource "google_container_node_pool" "secondary-boot-disk-data" {
      name               = "secondary-boot-disk-data"
      location           = "us-central1-a"
      cluster            = google_container_cluster.default.name
      initial_node_count = 1
    
      node_config {
        machine_type = "e2-medium"
        image_type   = "COS_CONTAINERD"
        gcfs_config {
          enabled = true
        }
        secondary_boot_disks {
          disk_image = ""
        }
      }
    }

    Per scoprire di più sull'utilizzo di Terraform, consulta Assistenza di Terraform per GKE.

  3. Se vuoi, puoi montare l'immagine disco secondaria nei container del pod utilizzando un montaggio del volume hostPath. Utilizza il seguente manifest per definire le risorse di un pod e utilizza un montaggio del volume hostPath per precaricare il disco dati nei suoi container:

    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
    

    Sostituisci DISK_IMAGE_NAME con il nome dell'immagine del disco.

Scalabilità automatica dei cluster con dischi di avvio secondari

Per creare un pool di nodi e configurare la scalabilità automatica del cluster su un disco di avvio secondario, utilizza 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

Sostituisci quanto segue:

  • NODE_POOL_NAME: il nome del pool di nodi.
  • CLUSTER_NAME: il nome del cluster esistente.
  • LOCATION: le zona di computing separate da virgole del cluster.
  • DISK_IMAGE_NAME: il nome dell'immagine disco.
  • MIN_NODES: il numero minimo di nodi da scalare automaticamente per il pool di nodi specificato per zona. Per specificare il numero minimo di nodi per l'intero pool di nodi nelle versioni GKE 1.24 e successive, utilizza --total-min-nodes. I flag --total-min-nodes e --total-max-nodes si escludono a vicenda con i flag --min-nodes e --max-nodes.
  • MAX_NODES: il numero massimo di nodi da scalare automaticamente per il pool di nodi specificato per zona. Per specificare il numero massimo di nodi per l'intero pool di nodi nelle versioni GKE 1.24 e successive, utilizza --total-max-nodes. I flag --total-min-nodes e --total-max-nodes si escludono a vicenda con i flag --min-nodes e --max-nodes.

Provisioning automatico dei nodi con dischi di avvio secondari

In GKE 1.30.1-gke.1329000 e versioni successive, puoi configurare il provisioning automatico dei nodi per creare ed eliminare automaticamente i node pool in modo da soddisfare le richieste di risorse dei tuoi carichi di lavoro.

  1. Crea una risorsa personalizzata della lista consentita di immagini disco per il disco di avvio secondario per il provisioning automatico dei nodi GKE simile alla seguente:

    apiVersion: "node.gke.io/v1"
    kind: GCPResourceAllowlist
    metadata:
      name: gke-secondary-boot-disk-allowlist
    spec:
      allowedResourcePatterns:
      - "projects/<PROJECT_ID>/global/images/.*"
    

    Sostituisci PROJECT_ID con l'ID del tuo progetto per ospitare l'immagine disco.

  2. Esegui il deployment della risorsa personalizzata della lista consentita nel cluster, esegui il seguente comando:

    kubectl apply -f ALLOWLIST_FILE
    

    Sostituisci ALLOWLIST_FILE con il nome file del manifest.

  3. Aggiorna il selettore dei nodi del pod per utilizzare il disco di avvio secondario:

    nodeSelector:
        cloud.google.com.node-restriction.kubernetes.io/gke-secondary-boot-disk-DISK_IMAGE_NAME=CONTAINER_IMAGE_CACHE.PROJECT_ID
    

    Sostituisci quanto segue:

    • DISK_IMAGE_NAME: il nome dell'immagine disco.
    • PROJECT_ID: l'ID del tuo progetto per ospitare l'immagine del disco.

Utilizzare un disco di avvio secondario in un altro progetto

Quando crei un pool di nodi con un disco di avvio secondario, puoi indicare a GKE di utilizzare l'immagine del disco in un progetto diverso utilizzando il flag --secondary-boot-disk.

  1. Crea un pool di nodi con un disco di avvio secondario dall'immagine del disco in un progetto diverso utilizzando il flag --secondary-boot-disk. Ad esempio:

    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
    
    

    Sostituisci quanto segue:

    • DISK_IMAGE_NAME: il nome dell'immagine disco.
    • IMAGE_PROJECT_ID: il nome del progetto a cui appartiene l'immagine del disco.

    GKE crea un pool di nodi in cui ogni nodo ha un disco secondario con dati precaricati. GKE collega e monta il disco di avvio secondario sul nodo.

  2. Concedi l'accesso alle immagini disco appartenenti a un progetto diverso aggiungendo i ruoli "Utente immagine di calcolo" per gli account di servizio del cluster:

    • Account di servizio Compute predefinito: CLUSTER_PROJECT_NUMBER@cloudservices.gserviceaccount.com
    • Account di servizio 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
    

Passaggi successivi