Utilizzare il flusso di immagini per eseguire il pull delle immagini container


Questa pagina mostra come utilizzare il flusso di immagini in Google Kubernetes Engine (GKE) per estrarre le immagini dei container inviando i dati delle immagini in streaming in base alle esigenze delle tue applicazioni.

I nuovi cluster Autopilot che eseguono GKE versione 1.25.5-gke.1000 e successive utilizzano automaticamente lo streaming di immagini per estrarre le immagini idonee. Le istruzioni riportate in questa pagina si applicano solo ai cluster standard.

Panoramica

Il flusso di immagini è un metodo per eseguire il pull delle immagini dei container in cui GKE invia i flussi di dati da immagini idonee come richiesto dalle tue applicazioni. Puoi utilizzare il flusso di immagini per consentire l'inizializzazione dei carichi di lavoro senza attendere il download dell'intera immagine, migliorando in modo significativo i tempi di inizializzazione. Il tempo di estrazione ridotto offre i seguenti vantaggi:

  • Scalabilità automatica più rapida
  • Latenza ridotta durante il recupero di immagini di grandi dimensioni
  • Avvio più rapido dei pod

Con il flusso di immagini, GKE utilizza un file system remoto come file system di root per tutti i container che utilizzano immagini container idonee. GKE invia i dati delle immagini dal file system remoto in base alle esigenze dei tuoi carichi di lavoro. Senza lo streaming di immagini, GKE scarica l'intera immagine del contenitore su ogni nodo e la utilizza come file system principale per i carichi di lavoro.

Durante lo streaming dei dati delle immagini, GKE scarica l'intera immagine del contenitore sul disco locale in background e la memorizza nella cache. GKE poi gestisce le richieste future di lettura dei dati dall'immagine memorizzata nella cache.

Quando esegui il deployment di carichi di lavoro che devono leggere file specifici nell'immagine del contenitore, il backend di streaming di immagini serve solo i file richiesti.

Requisiti

Per utilizzare lo streaming di immagini nei cluster GKE Autopilot e Standard, devi soddisfare i seguenti requisiti:

  • Devi abilitare l'API Container File System.

    Attivare l'API Container File System

  • I nuovi cluster Autopilot devono eseguire GKE versione 1.25.5-gke.1000 o successive per avere il flusso di immagini abilitato automaticamente. Per le istruzioni, consulta Impostare la versione e il canale di rilascio di un nuovo cluster Autopilot.

  • I cluster GKE Standard nuovi ed esistenti devono eseguire la versione 1.18.6-gke.4801 o successive.

  • Devi utilizzare l'immagine del nodo Container-Optimized OS con Containerd. I nodi Autopilot utilizzano sempre questa immagine del nodo.

  • Le immagini container devono essere archiviate in Artifact Registry.

  • Se attivi i nodi privati sul tuo cluster, devi abilitare l'accesso privato Google sulla subnet affinché i nodi possano accedere al servizio di streaming di immagini.

  • Se Controlli di servizio VPC protegge le immagini dei contenitori e utilizzi lo streaming di immagini, devi includere anche l'API Streaming di immagini (containerfilesystem.googleapis.com) nel perimetro di servizio.

  • Se i nodi GKE nel cluster non utilizzano l'account di servizio predefinito, devi assicurarti che il tuo account di servizio personalizzato disponga del ruolo IAM Consumatore di utilizzo del servizio (roles/serviceusage.serviceUsageConsumer) nel progetto che ospita l'immagine del contenitore.

Limitazioni

  • Non puoi utilizzare un segreto per estrarre le immagini dei container nelle versioni di GKE precedenti alla 1.23.5-gke.1900.
  • Le immagini dei container che utilizzano il manifesto dell'immagine V2, versione dello schema 1 non sono idonee.
  • Le immagini container criptate con chiavi di crittografia gestite dal cliente (CMEK) sono idonee per lo streaming di immagini su GKE versione 1.25.3-gke.1000 o successiva. Nelle versioni precedenti, GKE scarica queste immagini senza trasmettere i dati in streaming. Puoi comunque utilizzare CMEK per proteggere i dischi permanenti e i dischi di avvio personalizzati collegati nei cluster che utilizzano lo streaming di immagini.
  • Le immagini dei contenitori con livelli duplicati non sono supportate. GKE scarica queste immagini senza trasmettere i dati in streaming. Controlla l'immagine del contenitore per verificare la presenza di livelli vuoti o duplicati.
  • Il repository Artifact Registry deve trovarsi nella stessa regione dei tuoi nodi GKE o in una regione multipla che corrisponde alla regione in cui sono in esecuzione i tuoi nodi. Ad esempio:
    • Se i tuoi nodi si trovano in us-east1, lo streaming di immagini è disponibile per i repository nella regione us-east1 o nella regione multipla us, poiché sia GKE che Artifact Registry vengono eseguiti in località dei data center all'interno degli Stati Uniti.
    • Se i tuoi nodi si trovano nella regione northamerica-northeast1, vengono eseguiti in Canada. In questo caso, lo streaming di immagini è disponibile solo per i repository nella stessa regione.
  • Se i tuoi carichi di lavoro leggono molti file in un'immagine durante l'inizializzazione, potresti notare un aumento dei tempi di inizializzazione a causa della latenza aggiunta dalle letture dei file remoti.
  • Potresti non notare i vantaggi dello streaming di immagini durante il primo recupero di un'immagine idonea. Tuttavia, dopo che Image Streaming ha memorizzato nella cache l'immagine, le immagini future trarranno vantaggio da Image Streaming in qualsiasi cluster.
  • I cluster GKE Standard utilizzano la configurazione a livello di cluster per determinare se attivare o meno lo streaming di immagini sui nuovi node pool creati utilizzando il provisioning automatico dei nodi. Tuttavia, non puoi utilizzare la separazione dei carichi di lavoro per creare pool di nodi con lo streaming di immagini abilitato quando lo streaming di immagini è disabilitato a livello di cluster.
  • Le funzionalità dei file Linux come CAP_NET_RAW sono supportate con il flusso di immagini in GKE versione 1.22.6-gke.300 e successive. Per le versioni precedenti di GKE, queste funzionalità non sono disponibili quando il file immagine viene riprodotto in streaming o quando l'immagine viene salvata sul disco locale. Per evitare potenziali interruzioni, non utilizzare lo streaming di immagini per i container con queste funzionalità nelle versioni GKE precedenti alla 1.22.6-gke.300. Se il contenitore si basa sulle funzionalità dei file di Linux, potrebbe non riuscire ad avviarsi con errori di autorizzazione negata quando viene eseguito con lo streaming di immagini abilitato.

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.

Attivare il flusso di immagini sui cluster

Puoi attivare lo streaming di immagini su cluster standard nuovi o esistenti utilizzando il flag --enable-image-streaming gcloud CLI o la console Google Cloud. Per impostazione predefinita, i node pool del cluster ereditano l'impostazione di streaming di immagini a livello di cluster. Puoi modificare questo comportamento attivando o disattivando lo streaming di immagini nei pool di nodi nel cluster.

Tutti i nuovi cluster Autopilot che eseguono GKE versione 1.25.5-gke.1000 e successive utilizzano lo streaming di immagini per estrarre le immagini idonee. Per le istruzioni, consulta Impostare la versione e il canale di rilascio di un nuovo cluster Autopilot. Le istruzioni riportate di seguito si applicano solo ai cluster GKE standard.

Su un nuovo cluster

Puoi attivare lo streaming di immagini sui nuovi cluster utilizzando la gcloud CLI o la console Google Cloud.

gcloud

Per creare un nuovo cluster con lo streaming di immagini abilitato, esegui il seguente comando:

gcloud container clusters create CLUSTER_NAME \
    --zone=COMPUTE_ZONE \
    --image-type="COS_CONTAINERD" \
    --enable-image-streaming

Sostituisci quanto segue:

  • CLUSTER_NAME: il nome del nuovo cluster.
  • COMPUTE_ZONE: la zona Compute Engine per il nuovo cluster. Per i cluster regionali, utilizza invece il flag --region=COMPUTE_REGION. Assicurati che la zona o la regione sia la stessa o che rientri nella regione multipla del repository Artifact Registry che contiene l'immagine.

Console

  1. Vai alla pagina Google Kubernetes Engine nella console Google Cloud.

    Vai a Google Kubernetes Engine

  2. Fai clic su Crea.

  3. Nella sezione GKE Standard, fai clic su Configura.

  4. Nel riquadro di navigazione, in Cluster, fai clic su Funzionalità.

  5. Nella sezione Altro, seleziona la casella di controllo Abilita lo streaming di immagini.

  6. Configura il cluster come necessario, quindi fai clic su Crea.

Su un cluster esistente

Puoi attivare lo streaming di immagini sui cluster esistenti che soddisfano i requisiti utilizzando l'interfaccia alla gcloud CLI o la console Google Cloud.

gcloud

Per aggiornare un cluster esistente in modo che utilizzi lo streaming di immagini, esegui il seguente comando utilizzando gcloud CLI:

gcloud container clusters update CLUSTER_NAME \
    --enable-image-streaming

Console

  1. Vai alla pagina Google Kubernetes Engine nella console Google Cloud.

    Vai a Google Kubernetes Engine

  2. Fai clic sul nome del cluster da modificare.

  3. Nella pagina Cluster, nella sezione Funzionalità, fai clic su accanto a Streaming di immagini.

  4. Nella finestra di dialogo Modifica flusso immagine, seleziona la casella di controllo Abilita flusso immagine.

  5. Fai clic su Salva modifiche.

Dopo aver modificato il cluster, GKE attiva automaticamente lo streaming di immagini sui tuoi pool di nodi esistenti. Se hai attivato o disattivato esplicitamente lo streaming di immagini su singoli pool di nodi, questi non ereditano le modifiche all'impostazione a livello di cluster.

La modifica dell'impostazione di streaming di immagini rispetta la disponibilità per la manutenzione quando viene aggiornata a livello di cluster, ma non a livello di pool di nodi.

Questa modifica richiede la ricreazione dei nodi, il che può causare interruzioni dei carichi di lavoro in esecuzione. Per informazioni dettagliate su questa modifica specifica, individua la riga corrispondente nella tabella Modifiche manuali che ricreano i nodi utilizzando una strategia di upgrade dei nodi e rispettando le norme di manutenzione. Per scoprire di più sugli aggiornamenti dei nodi, consulta Pianificare le interruzioni per gli aggiornamenti dei nodi.

Verificare che lo streaming di immagini sia abilitato su un cluster

Puoi verificare se lo streaming di immagini è abilitato a livello di cluster utilizzando la gcloud CLI o la console Google Cloud.

gcloud

Esegui questo comando:

gcloud container clusters describe CLUSTER_NAME \
    --flatten "nodePoolDefaults.nodeConfigDefaults"

L'impostazione è attivata se l'output è simile al seguente:

gcfsConfig:
  enabled: true
...

L'impostazione è disabilitata se l'output è simile al seguente:

gcfsConfig: {}
...

Console

  1. Vai alla pagina Google Kubernetes Engine nella console Google Cloud.

    Vai a Google Kubernetes Engine

  2. Fai clic sul nome del cluster da controllare.

  3. Nella pagina Cluster, nella sezione Funzionalità, accanto a Streaming di immagini viene indicato se l'impostazione è attivata.

Attivare lo streaming di immagini nei pool di nodi

Per impostazione predefinita, i pool di nodi ereditano l'impostazione di streaming di immagini a livello di cluster. Puoi attivare o disattivare lo streaming di immagini su pool di nodi specifici utilizzando gcloud CLI.

In un nuovo pool di nodi

Per creare un nuovo pool di nodi con lo streaming di immagini abilitato, esegui il seguente comando:

gcloud container node-pools create NODE_POOL_NAME \
    --cluster=CLUSTER_NAME \
    --zone=COMPUTE_ZONE \
    --image-type="COS_CONTAINERD" \
    --enable-image-streaming

Sostituisci quanto segue:

  • NODE_POOL_NAME: il nome del nuovo pool di nodi.
  • CLUSTER_NAME: il nome del cluster per il pool di nodi.
  • COMPUTE_ZONE: la zona Compute Engine del cluster. Per i cluster regionali, utilizza invece il flag --region=COMPUTE_REGION.

In un pool di nodi esistente

Puoi attivare lo streaming di immagini nei pool di nodi esistenti che soddisfano i requisiti.

Per aggiornare un pool di nodi esistente in modo che utilizzi lo streaming di immagini, esegui il seguente comando:

gcloud container node-pools update POOL_NAME \
    --cluster=CLUSTER_NAME \
    --enable-image-streaming

La modifica dell'impostazione di streaming di immagini rispetta la disponibilità per la manutenzione quando viene aggiornata a livello di cluster, ma non a livello di pool di nodi.

Questa modifica richiede la ricreazione dei nodi, il che può causare interruzioni dei carichi di lavoro in esecuzione. Per informazioni dettagliate su questa modifica specifica, individua la riga corrispondente nella tabella Modifiche manuali che ricreano i nodi utilizzando una strategia di upgrade dei nodi senza rispettare i criteri di manutenzione. Per scoprire di più sugli aggiornamenti dei nodi, consulta Pianificare le interruzioni per gli aggiornamenti dei nodi.

Verificare che lo streaming di immagini sia abilitato in un pool di nodi

Controlla se lo streaming di immagini è abilitato per un pool di nodi:

gcloud container node-pools describe POOL_NAME \
    --cluster=CLUSTER_NAME \

L'impostazione è attivata se l'output è simile al seguente:

gcfsConfig:
  enabled: true
...

L'impostazione è disabilitata se l'output è simile al seguente:

gcfsConfig: {}
...

Pianificare un carico di lavoro utilizzando il flusso di immagini

Dopo aver attivato lo streaming di immagini sul cluster, GKE lo utilizza automaticamente quando estrae le immagini container idonee da Artifact Registry senza richiedere ulteriore configurazione.

GKE aggiunge l'etichetta cloud.google.com/gke-image-streaming: "true" ai nodi nei pool di nodi con lo streaming di immagini abilitato. In GKE Standard, se attivi o disattivi lo streaming di immagini su pool di nodi specifici in modo che il tuo cluster abbia un mix di nodi che utilizzano lo streaming di immagini e nodi che non lo fanno, puoi utilizzare selettori di nodi nei tuoi deployment per controllare se GKE pianifica i tuoi workloads su nodi che utilizzano lo streaming di immagini.

Nell'esempio seguente, pianifichi un deployment che utilizza un'immagine del contenitore di grandi dimensioni su un cluster con lo streaming di immagini abilitato. Se vuoi, puoi anche confrontare il rendimento con un estrazione di immagini senza l'attivazione del flusso di immagini.

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

    gcloud container clusters create CLUSTER_NAME \
        --zone=COMPUTE_ZONE \
        --enable-image-streaming \
        --image-type="COS_CONTAINERD"
    
  2. Recupera le credenziali per il cluster:

    gcloud container clusters get-credentials CLUSTER_NAME \
        --zone=COMPUTE_ZONE
    
  3. Salva il seguente manifest come frontend-deployment.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: frontend
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: guestbook
          tier: frontend
      template:
        metadata:
          labels:
            app: guestbook
            tier: frontend
        spec:
          containers:
          - name: php-redis
            image: us-docker.pkg.dev/google-samples/containers/gke/gb-frontend:v5
            env:
            - name: GET_HOSTS_FROM
              value: "dns"
            resources:
              requests:
                cpu: 100m
                memory: 100Mi
            ports:
            - containerPort: 80
    

    L'immagine contenitore gb-frontend ha una dimensione di 327 MB.

  4. Applica il manifest al cluster:

    kubectl apply -f frontend-deployment.yaml
    
  5. Verifica che GKE abbia creato il deployment:

    kubectl get pods -l app=guestbook
    

    L'output è simile al seguente:

    NAMESPACE    NAME                          READY    STATUS       RESTARTS    AGE
    default      frontend-64bcc69c4b-pgzgm     1/1      Completed    0           3s
    
  6. Ottieni il log degli eventi Kubernetes per visualizzare gli eventi di estrazione delle immagini:

    kubectl get events --all-namespaces
    

    L'output è simile al seguente:

    NAMESPACE  LAST SEEN  TYPE    REASON          OBJECT                                                 MESSAGE
    default    11m        Normal  Pulling         pod/frontend-64bcc69c4b-pgzgm                          Pulling image "us-docker.pkg.dev/google-samples/containers/gke/gb-frontend:v5"
    default    11m        Normal  Pulled          pod/frontend-64bcc69c4b-pgzgm                          Successfully pulled image "us-docker.pkg.dev/google-samples/containers/gke/gb-frontend:v5" in 1.536908032s
    default    11m        Normal  ImageStreaming  node/gke-riptide-cluster-default-pool-f1552ec4-0pjv    Image us-docker.pkg.dev/google-samples/containers/gke/gb-frontend:v5 is backed by image streaming.
    ...
    

    In questo output:

    • L'evento Pulled mostra il tempo necessario per il recupero dell'immagine tramite lo streaming di immagini.
    • L'evento ImageStreaming indica che il nodo utilizza il flusso di immagini per caricare l'immagine del contenitore.

Confrontare il rendimento con i tiri delle immagini standard

In questo esempio facoltativo, crei un nuovo cluster con lo streaming di immagini disabilitato e esegui il deployment del frontend deployment per confrontare il rendimento con lo streaming di immagini.

  1. Crea un nuovo cluster con lo streaming di immagini disattivato:

    gcloud container clusters create CLUSTER2_NAME\
        --zone=COMPUTE_ZONE \
        --image-type="COS_CONTAINERD"
    
  2. Recupera le credenziali per il cluster:

    gcloud container clusters get-credentials CLUSTER2_NAME \
        --zone=COMPUTE_ZONE
    
  3. Esegui il deployment di frontend dall'esempio precedente:

    kubectl apply -f frontend-deployment.yaml
    
  4. Recupera il log degli eventi Kubernetes:

    kubectl get events --all-namespaces
    

    L'output è simile al seguente:

     NAMESPACE  LAST SEEN  TYPE    REASON     OBJECT                             MESSAGE
     default    87s        Normal  Pulled     pod/frontend-64bcc69c4b-qwmfp      Successfully pulled image "us-docker.pkg.dev/google-samples/containers/gke/gb-frontend:v5" in 23.929723476s
    

    Nota il tempo impiegato da GKE per estrarre l'intera immagine. In questo esempio di output, GKE ha impiegato quasi 24 secondi. Con lo streaming di immagini attivo, GKE ha impiegato solo 1,5 secondi per recuperare i dati delle immagini necessari per l'avvio del workload.

Esegui la pulizia

Per evitare addebiti, elimina i cluster creati negli esempi precedenti:

gcloud container clusters delete CLUSTER_NAME CLUSTER2_NAME

Disattivare il flusso di immagini

Se utilizzi GKE Autopilot, non puoi disattivare lo streaming di immagini sui singoli cluster. Puoi disattivare l'API Container File System, che disattiva lo streaming di immagini per l'intero progetto.

Se utilizzi i cluster GKE Standard, puoi disattivare lo streaming di immagini su singoli cluster o node pool specifici, come descritto nelle sezioni seguenti.

Disattivare lo streaming di immagini su un cluster GKE Standard

Puoi disattivare lo streaming di immagini sui cluster GKE Standard esistenti utilizzando la gcloud CLI o la console Google Cloud.

gcloud

Per disattivare lo streaming di immagini su un cluster esistente, esegui il seguente comando:

gcloud container clusters update CLUSTER_NAME \
    --no-enable-image-streaming

Console

  1. Vai alla pagina Google Kubernetes Engine nella console Google Cloud.

    Vai a Google Kubernetes Engine

  2. Fai clic sul nome del cluster da modificare.

  3. Nella pagina Cluster, fai clic su accanto a Streaming di immagini in Funzionalità.

  4. Nella finestra di dialogo Modifica flusso immagine, deseleziona la casella di controllo Attiva flusso immagine.

  5. Fai clic su Salva modifiche.

La modifica dell'impostazione di streaming di immagini rispetta la disponibilità per la manutenzione quando viene aggiornata a livello di cluster, ma non a livello di pool di nodi.

Questa modifica richiede la ricreazione dei nodi, il che può causare interruzioni dei carichi di lavoro in esecuzione. Per informazioni dettagliate su questa modifica specifica, individua la riga corrispondente nella tabella Modifiche manuali che ricreano i nodi utilizzando una strategia di upgrade dei nodi e rispettando le norme di manutenzione. Per scoprire di più sugli aggiornamenti dei nodi, consulta Pianificare le interruzioni per gli aggiornamenti dei nodi.

In un nuovo pool di nodi

Per disattivare lo streaming di immagini durante la creazione di un nuovo pool di nodi, specifica il flag --no-enable-image-streaming, ad esempio nel seguente comando:

gcloud container node-pools create NODE_POOL_NAME \
    --cluster=CLUSTER_NAME \
    --zone=COMPUTE_ZONE \
    --no-enable-image-streaming

In un pool di nodi esistente

Per disattivare lo streaming di immagini in un pool di nodi esistente, esegui il seguente comando:

gcloud container node-pools update NODE_POOL_NAME \
    --cluster=CLUSTER_NAME \
    --no-enable-image-streaming

La modifica dell'impostazione di streaming di immagini rispetta la disponibilità per la manutenzione quando viene aggiornata a livello di cluster, ma non a livello di pool di nodi.

Questa modifica richiede la ricreazione dei nodi, il che può causare interruzioni dei carichi di lavoro in esecuzione. Per informazioni dettagliate su questa modifica specifica, individua la riga corrispondente nella tabella Modifiche manuali che ricreano i nodi utilizzando una strategia di upgrade dei nodi senza rispettare i criteri di manutenzione. Per scoprire di più sugli aggiornamenti dei nodi, consulta Pianificare le interruzioni per gli aggiornamenti dei nodi.

Prenotazione di memoria per lo streaming di immagini

GKE riserva risorse di memoria per lo streaming di immagini oltre alla memoria riservata per l'esecuzione dei componenti di sistema del nodo. GKE non riserva risorse CPU aggiuntive per lo streaming di immagini. Nei cluster GKE Standard, questa prenotazione modifica le risorse di memoria che puoi richiedere nei tuoi pod. In GKE Autopilot, GKE gestisce le allocazioni di sistema, quindi la pianificazione dei carichi di lavoro non è interessata.

Per informazioni dettagliate sulle prenotazioni di memoria effettuate da GKE per i componenti dei nodi, consulta Architettura del cluster standard.

Nei nodi che utilizzano lo streaming di immagini, GKE effettua le seguenti prenotazioni di memoria aggiuntive per le nuove prenotazioni:

  • Nessuna memoria aggiuntiva per le macchine con meno di 1 GB di memoria
  • 1% dei primi 4 GB di memoria
  • 0,8% dei successivi 4 GB di memoria (fino a 8 GB)
  • Lo 0,4% dei successivi 8 GB di memoria (fino a 16 GB)
  • 0,24% dei successivi 112 GiB di memoria (fino a 128 GiB)
  • 0,08% di qualsiasi memoria superiore a 128 GB

Risoluzione dei problemi

GKE non utilizza il file system di streaming di immagini

Se il log eventi GKE non mostra gli eventi di streaming di immagini, la tua immagine non è supportata dal file system remoto. Se in precedenza GKE ha recuperato l'immagine sul nodo, si tratta di un comportamento previsto perché GKE utilizza la cache locale dell'immagine per i successivi download anziché utilizzare lo streaming di immagini. Puoi verificare cercando Container image IMAGE_NAME already present on machine nel campo Message per l'evento Pulled del pod.

Se non vedi l'evento di streaming di immagini durante il primo recupero delle immagini sul nodo, assicurati di soddisfare i requisiti per lo streaming di immagini. Sesoddisfai i requisiti, puoi diagnosticare il problema controllando i log del servizio di streaming di immagini (denominato gcfsd):

  1. Vai alla pagina Esplora log nella console Google Cloud:

    Vai a Esplora log

  2. Nel campo Query, specifica la seguente query:

    logName="projects/PROJECT_ID/logs/gcfsd"
    resource.labels.cluster_name="CLUSTER_NAME"
    

    Sostituisci quanto segue:

    • PROJECT_ID: il nome del progetto.
    • CLUSTER_NAME: il nome del cluster.
  3. Fai clic su Esegui query.

Puoi anche controllare i log gcfsd utilizzando Esplora log:

  1. Vai a Esplora log nella console Google Cloud:

    Vai a Esplora log

  2. Nel campo Query, specifica la seguente query:

    logName="projects/PROJECT_ID/logs/gcfsd"
    

    Sostituisci PROJECT_ID con l'ID del tuo progetto Google Cloud.

PermissionDenied

Se i log di gcfsd mostrano un messaggio di errore simile al seguente, il nodo non ha l'ambito API corretto. GKE esegue il pull delle immagini dei container per i carichi di lavoro senza utilizzare il flusso di immagini.

level=fatal msg="Failed to create a Container File System client: rpc error:
code = PermissionDenied desc = failed to probe endpoint: rpc error: code = PermissionDenied
desc = Request had insufficient authentication scopes."

Per risolvere il problema, concedi al nodo l'ambito corretto per consentirgli di utilizzare lo streaming di immagini. Aggiungi l'ambito devstorage.read_only al cluster o al pool di nodi, in modo simile al seguente comando:

gcloud container node-pools create NODE_POOL_NAME \
    --cluster=CLUSTER_NAME \
    --zone=COMPUTE_ZONE \
    --image-type="COS_CONTAINERD" \
    --enable-image-streaming \
    --scope="https://www.googleapis.com/auth/devstorage.read_only"

FailedPrecondition

Se noti un messaggio di errore con code = FailedPrecondition, l'immagine non è stata importata nel file system remoto di streaming di immagini.

Potresti notare questo errore se hai provato a utilizzare Image Streaming con un pool di nodi esistente. Se un nodo nel pool di nodi ha già l'immagine del contenitore sul disco, GKE utilizza l'immagine locale anziché il flusso di immagini per recuperarla.

Per risolvere il problema, prova quanto segue:

  • Attendi qualche minuto e prova a eseguire nuovamente il deployment del tuo carico di lavoro.
  • Aggiungi nuovi nodi o un nuovo pool di nodi e pianifica il workload su questi nodi.

InvalidArgument

Se noti un messaggio di errore con code=InvalidArgument, l'immagine del contenitore impiegata dal tuo carico di lavoro non è idonea per lo streaming di immagini. Assicurati che l'immagine soddisfi i requisiti. Se l'immagine non è in Artifact Registry, prova a eseguire la migrazione ad Artifact Registry.

backend.FileContent failed

Quando leggi i file del contenitore con lo streaming di immagini abilitato, potrebbe essere visualizzato il seguente errore:

level=error msg="backend.FileContent failed" error="rpc error: code = ResourceExhausted desc = Quota exceeded for quota metric 'Content requests per project per region' and limit 'Content requests per project per region per minute per region' of service 'containerfilesystem.googleapis.com' for consumer 'project_number:PROJECT_NUMBER'." layer_id="sha256:1234567890" module=gcfs_backend offset=0 path=etc/passwd size=4096

Questo errore indica che il progetto ha superato la quota richiesta per leggere i file dal servizio del file system del contenitore remoto. Per risolvere il problema, aumenta le seguenti quote:

  • Richieste di contenuti per progetto, per regione e per minuto
  • Richieste relative ai contenuti per progetto per regione

GKE scarica l'immagine senza trasmettere i dati

Le immagini dei container che utilizzano chiavi di crittografia gestite dal cliente (CMEK) sono idonee per il flusso di immagini solo su GKE versione 1.25.3-gke.1000 o successive. Le immagini container con livelli duplicati non sono idonee per lo streaming di immagini. Per ulteriori informazioni, consulta la sezione Limitazioni.

Verificare la presenza di livelli vuoti o duplicati

Per verificare se l'immagine del contenitore contiene livelli vuoti o duplicati, esegui il seguente comando:

docker inspect IMAGE_NAME

Sostituisci IMAGE_NAME con il nome dell'immagine del contenitore.

Nell'output del comando, controlla le voci in "Layers".

Se una delle voci corrisponde esattamente al seguente"sha256" output, l'immagine contenitore ha un livello vuoto e non è idonea per lo streaming di immagini.

"Layers": [
  ...
  "sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4",
  ...
]

Se sono presenti voci duplicate, come nell'esempio seguente, l'immagine del contenitore ha livelli duplicati e non è idonea per lo streaming di immagini.

"Layers": [
  "sha256:28699c71935fe3ffa56533db44ad93e5a30322639f7be70d5d614e06a1ae6d9b",
  ...
  "sha256:28699c71935fe3ffa56533db44ad93e5a30322639f7be70d5d614e06a1ae6d9b",
  ...
]

I comandi mv e le chiamate di sistema renameat2 non vanno a buon fine sui file symlink

Per i nodi GKE che eseguono la versione 1.25 e successive, quando è attivato lo streaming di immagini, il comando mv e la chiamata di sistema renameat2 potrebbero non riuscire sui file symlink nelle immagini dei container con il messaggio di errore "Nessun dispositivo o indirizzo di questo tipo". Il problema è causato da una regressione nei kernel Linux recenti.

Queste chiamate di sistema non sono comuni, pertanto la maggior parte delle immagini non è interessata da questo problema. Il problema si verifica in genere nelle fasi di inizializzazione del contenitore quando un'applicazione viene preparata per l'esecuzione e lo spostamento dei file. Non è possibile testare l'immagine localmente, pertanto GKE consiglia di utilizzare lo streaming di immagini negli ambienti di test per trovare il problema prima che l'immagine venga utilizzata in produzione.

La correzione è disponibile nelle seguenti versioni delle patch GKE:

  • 1.25: 1.25.14-gke.1351000 e versioni successive
  • 1.26: 1.26.9-gke.1345000 e versioni successive
  • 1.27: 1.27.6-gke.100 e versioni successive
  • 1.28: 1.28.1-gke.1157000 e versioni successive

In alternativa, per ridurre il problema per i carichi di lavoro interessati, puoi provare a sostituire il codice che porta alla chiamata di sistema renameat2. Se non puoi modificare il codice, devi disattivare lo streaming di immagini nel pool di nodi per attenuare il problema.