Utilizza dischi di avvio secondari per precaricare le immagini container o di dati


Questa pagina mostra come migliorare la latenza di avvio del carico di lavoro utilizzando avvia i dischi in Google Kubernetes Engine (GKE) precaricare i dati o le immagini container su nuovi nodi. Ciò consente ai carichi di lavoro di raggiungere un avvio a freddo rapido e per migliorare l'utilizzo complessivo delle risorse di cui è stato eseguito il provisioning.

Questa pagina presuppone la conoscenza di Google Cloud, Kubernetes, container, YAML, il runtime containerd e Google Cloud CLI.

Panoramica

A partire da GKE versione 1.28.3-gke.1067000 in Standard di GKE e nella versione GKE 1.30.1-gke.1329000 Autopilot, puoi configurare il pool di nodi con un avvio secondario i dischi permanenti. Puoi capire GKE per eseguire il provisioning dei nodi e precaricarli con dati, ad esempio un modello di machine learning o un'immagine container. Utilizzare le immagini container precaricate o i dati in un disco secondario presentano i seguenti vantaggi per i carichi di lavoro:

  • Latenza ridotta durante il pull 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 GKE Autopilot e Standard.

Come funzionano i dischi di avvio secondari

Il carico di lavoro può avviarsi più rapidamente utilizzando il container precaricato su dischi di avvio secondari. I dischi di avvio secondari hanno le seguenti caratteristiche:

  • I dischi di avvio secondari sono Dischi permanenti supportati da archiviazione a blocchi distribuita. Se l'immagine disco è già in uso nella zona, l'ora di creazione di tutto il disco successivo dalla stessa immagine disco sarà inferiore.
  • Il tipo di disco di avvio secondario è uguale al disco di avvio del nodo.
  • La dimensione del disco di avvio secondario viene decisa in base alle dimensioni dell'immagine del disco.

L'aggiunta di dischi di avvio secondari ai pool di nodi non aumenta per eseguire il provisioning. GKE esegue il provisioning dei dischi di avvio secondari l'immagine disco in parallelo al processo di provisioning dei nodi.

Per supportare le immagini container precaricate, GKE estende la containerd con plug-in che leggono la classe da dischi di avvio secondari. Le immagini container vengono riutilizzate strati di base: ti consigliamo di precaricare i livelli di base grandi nel mentre i livelli superiori più piccoli possono essere estratti registro di sistema.

Prima di iniziare

Prima di iniziare, assicurati di aver eseguito le seguenti attività:

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

Requisiti

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

  1. I cluster stanno eseguendo la versione GKE 1.28.3-gke.1067000 in GKE Standard o versione 1.30.1-gke.1329000 in GKE Autopilot.
  2. Quando modifichi l'immagine disco, crea un nuovo pool di nodi. Aggiornamento l'immagine disco sui nodi esistenti non è supportata.
  3. Configurare Flusso di immagini per utilizzare la funzionalità del disco di avvio secondario.
  4. Utilizza Container-Optimized OS con un nodo containerd dell'immagine. I nodi Autopilot utilizzano questa immagine del nodo per impostazione predefinita.
  5. Prepara l'immagine disco con dati pronti in fase di creazione o con dati precaricati immagini container. Assicurati che il cluster abbia accesso all'immagine disco da caricare tra i nodi. Consigliamo di automatizzare l'immagine disco in una soluzione CI/CD una pipeline o un blocco note personalizzato.

prepara il disco di avvio secondario

Per preparare il disco di avvio secondario, scegli la scheda Immagini per il precaricamento immagini container o scegli la scheda Dati per precaricare i dati, segui queste istruzioni:

Immagini

GKE offre uno strumento chiamato gke-disk-image-builder per creare una macchina virtuale (VM) ed eseguire il pull delle immagini container su un disco, quindi creare un disco dell'immagine da quel disco.

Per creare un'immagine disco con più immagini container precaricate, completa la 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 località del cluster.
  • LOG_BUCKET_NAME: il nome dell'istanza di 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 il processo (ad ad esempio un'istanza VM, un disco temporaneo e un disco permanente). Dopo la sua esecuzione, il generatore di immagini esegue la pulizia di tutte le risorse, tranne dell'immagine disco è stato creato.

Dati

Crea un'immagine disco personalizzata come origine dati completando quanto segue passaggi:

  1. Crea una VM con un disco vuoto.
  2. Utilizza SSH per connetterti alla VM.
    1. Installa il disco vuoto.
    2. Scarica i dati su un 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. Ti consigliamo di utilizzare una 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 di GKE.

Usa GKE Autopilot

In questa sezione creerai una lista consentita di immagini disco per consentirne l'utilizzo in un GKE esistente Autopilot. Quindi, modifica il selettore dei nodi pod in modo da utilizzare una disco di avvio secondario.

Consenti l'utilizzo di immagini disco nel tuo progetto

In questa sezione creerai un GCPResourceAllowlist per consentire a GKE per creare nodi con dischi di avvio secondari dalle immagini disco 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 il tuo ID progetto per ospitare il l'immagine disco.

  2. Applica il manifest:

    kubectl apply -f allowlist-disk.yaml
    

    GKE crea nodi con dischi di avvio secondari da tutte le immagini disco nel progetto.

Aggiorna il selettore di nodi pod in modo che utilizzi un disco di avvio secondario

In questa sezione, modificare le specifiche del pod in modo che GKE crei i nodi con 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 progetto per ospitare l'immagine disco.
  2. Usa 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 del pull dell'immagine prevista per l'immagine del container memorizzata nella cache deve essere notevolmente ridotto, indipendentemente dalle dimensioni dell'immagine.

Utilizza 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 a se vuoi precaricare le immagini container o i dati disco di avvio:

Immagini

Puoi configurare un disco di avvio secondario utilizzando Google Cloud CLI oppure Terraform:

gcloud

  1. Crea un cluster GKE Standard con immagine Streaming 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 località del cluster.
    • VERSION: la versione GKE da utilizzare. La La versione GKE deve essere 1.28.3-gke.106700 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: la zona o le zone di computing separate da della virgola del cluster.
    • DISK_IMAGE_NAME: il nome dell'immagine disco.

    Per creare un pool di nodi con un disco di avvio secondario dall'immagine 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 delle immagini eseguendo questo 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 del pull dell'immagine prevista per l'immagine del container memorizzata nella cache deve essere per non più di qualche secondo, a prescindere dalle dimensioni dell'immagine.

Terraform

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

    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 saperne di più sull'utilizzo di Terraform, consulta Supporto 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 delle immagini eseguendo questo 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 prevista per il pull dell'immagine per l'immagine del container memorizzata nella cache non deve essere qualche secondo, a prescindere dalle dimensioni dell'immagine.

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

Dati

Puoi configurare un disco di avvio secondario e precaricare i dati utilizzando il comando Google Cloud CLI o Terraform:

gcloud

  1. Crea un cluster GKE Standard con immagine Streaming 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 località del cluster.
    • VERSION: la versione GKE da utilizzare. La La versione di GKE deve essere 1.28.3-gke.106700 o successiva.
  2. Crea un pool di nodi con un disco di avvio secondario utilizzando il comando --secondary-boot-disk flag:

    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: la zona o le zone di computing separate da della virgola del cluster.
    • DISK_IMAGE_NAME: il nome dell'immagine disco.

    Per creare un pool di nodi con un disco di avvio secondario dall'immagine 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. Facoltativamente, puoi montare l'immagine del disco secondario nei container di pod utilizzando un montaggio del volume hostPath. Utilizza il manifest seguente per definire un pod e utilizzare un montaggio del volume hostPath per precaricare il disco dati 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 di dell'immagine disco.

Terraform

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

    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 saperne di più sull'utilizzo di Terraform, consulta Supporto Terraform per GKE.

  3. Facoltativamente, puoi montare l'immagine del disco secondario nei container di pod utilizzando un montaggio del volume hostPath. Utilizza il manifest seguente per definire un pod e utilizzare un montaggio del volume hostPath per precaricare il disco dati 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 disco.

Scalabilità automatica dei cluster con dischi di avvio secondari

Puoi creare un pool di nodi e configurare la scalabilità automatica del cluster con un avvio secondario il disco utilizzando 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: la zona o le zone di computing separate da della virgola del cluster.
  • DISK_IMAGE_NAME: il nome dell'immagine disco.
  • MIN_NODES: il numero minimo di nodi da la scalabilità automatica per il pool di nodi specificato per zona. Per specificare numero minimo di nodi per l'intero pool di nodi in GKE 1.24 e versioni successive, utilizza --total-min-nodes. Le bandiere --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 la scalabilità automatica per il pool di nodi specificato per zona. Per specificare numero massimo di nodi per l'intero pool di nodi in GKE 1.24 e versioni successive, utilizza --total-max-nodes. Le bandiere --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 crea ed elimina automaticamente i pool di nodi per soddisfare le esigenze di risorse carichi di lavoro con scale out impegnativi.

  1. Crea una risorsa personalizzata nella lista consentita di immagini disco per il disco di avvio secondario per Provisioning automatico dei nodi GKE simile al 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 il tuo ID progetto per ospitare l'immagine disco.

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

    kubectl apply -f ALLOWLIST_FILE
    

    Sostituisci ALLOWLIST_FILE con il nome del file manifest.

  3. Aggiorna il selettore dei nodi 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 progetto per ospitare l'immagine disco.

Usa 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 disco in una in un progetto diverso usando il flag --secondary-boot-disk.

  1. Crea un pool di nodi con un disco di avvio secondario dall'immagine disco in un in un progetto diverso usando 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 che a cui appartiene l'immagine disco.

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

  2. Concedi l'accesso alle immagini disco che appartengono a un altro progetto aggiungendo "Utente immagine Compute" ruoli per gli account di servizio del cluster:

    • Account di servizio di computing 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