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 meglio Google Cloud, Kubernetes, i container, 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. Utilizzo delle immagini container precaricate o i dati in un disco secondario presentano i seguenti vantaggi per i 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 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 è lo stesso del 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 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 container precaricate, GKE estende la containerd con plug-in che leggono la classe da dischi di avvio secondari. Le immagini container vengono riutilizzate 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. 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, 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 il sistema operativo ottimizzato per i container con un'immagine del nodo containerd. I nodi Autopilot utilizzano questa immagine del nodo per impostazione predefinita.
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.
Best practice: Automatizza l'immagine del disco in una pipeline CI/CD.
Limitazioni
I dischi di avvio secondari hanno 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 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). 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 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.
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.
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, modificare la specifica del pod in modo che GKE crei i nodi con 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 del pull dell'immagine prevista per l'immagine del container memorizzata nella cache deve essere notevolmente ridotto, 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 a se vuoi precaricare le immagini container o i dati nell'istanza disco di avvio:
Immagini
Per configurare un disco di avvio secondario, utilizza Google Cloud CLI oppure Terraform:
gcloud
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 di GKE da utilizzare. La
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: la zona o le zone di calcolo 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 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 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 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 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
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.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: la zona o le zone di calcolo 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 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 dispone di un disco secondario con dati precaricati. GKE collega e monta il disco di avvio secondario sul nodo.
Facoltativamente, puoi montare l'immagine del disco secondario nei container di 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 di dell'immagine 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 manifest seguente per definire un pod e utilizzare un montaggio del volume hostPath per precaricare il disco dati containers:
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
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: la zona o le zone di calcolo separate da virgole 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 il
numero minimo di nodi per l'intero pool di nodi nelle versioni GKE 1.24 e 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 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
. 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 per creare ed eliminare automaticamente i pool di nodi 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, quindi esegui questo comando:
kubectl apply -f ALLOWLIST_FILE
Sostituisci ALLOWLIST_FILE con il nome del file manifest.
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 del tuo progetto per ospitare l'immagine del 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 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 Migliorare l'efficienza dei carichi di lavoro utilizzando NCCL Fast Socket per scoprire come utilizzare lo standard plug-in Fast Socket NVIDIA Collective Communication Library (NCCL).