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.
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
.
Abilita l'API Container File System.
Requisiti
Per l'utilizzo del disco di avvio secondario si applicano i seguenti requisiti:
- 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.
- Quando modifichi l'immagine del disco, devi creare un nuovo pool di nodi. L'aggiornamento dell'immagine disco sui nodi esistenti non è supportato.
- Configura lo streaming di immagini per utilizzare la funzionalità del disco di avvio secondario.
- Utilizza Container-Optimized OS con un'immagine del nodo containerd. I nodi Autopilot utilizzano questa immagine del nodo per impostazione predefinita.
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:
- Crea un bucket Cloud Storage per archiviare i log di esecuzione di
gke-disk-image-builder
. - 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:
Configura il disco di avvio secondario
Puoi configurare il disco di avvio secondario in un cluster GKE Autopilot o Standard.
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.
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.
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.
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.
Utilizza il comando
kubectl apply
per applicare la specifica Kubernetes con il modello di pod.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
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
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.
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.
Aggiungi un
nodeSelector
al modello di pod:nodeSelector: cloud.google.com/gke-nodepool: NODE_POOL_NAME
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
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
Per creare un cluster con il pool di nodi predefinito utilizzando Terraform, consulta il seguente esempio:
Crea un pool di nodi con un disco di avvio secondario nello stesso progetto:
Per scoprire di più sull'utilizzo di Terraform, consulta Assistenza di Terraform per GKE.
Aggiungi un
nodeSelector
al modello di pod:nodeSelector: cloud.google.com/gke-nodepool: NODE_POOL_NAME
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
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
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.
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.
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
Per creare un cluster con il pool di nodi predefinito utilizzando Terraform, consulta il seguente esempio:
Crea un pool di nodi con un disco di avvio secondario nello stesso progetto:
Per scoprire di più sull'utilizzo di Terraform, consulta Assistenza di Terraform per GKE.
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 relativi 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.
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.
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.
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
.
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.
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
- Utilizza Utilizzare il flusso di immagini per eseguire il pull delle immagini container per eseguire il pull delle immagini container trasmettendo i dati delle immagini in base alle esigenze dei tuoi carichi di lavoro.
- Consulta l'articolo Migliorare l'efficienza del carico di lavoro utilizzando NCCL Fast Socket per scoprire come utilizzare il plug-in Fast Socket di NVIDIA Collective Communication Library (NCCL).