Utilizzare i flussi di immagini per il pull delle immagini container


Questa pagina mostra come utilizzare il flusso di immagini in Google Kubernetes Engine (GKE) per eseguire il pull delle immagini container tramite il trasferimento di flussi di dati delle immagini in base alle esigenze delle tue applicazioni.

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

Panoramica

Il flusso di immagini è un metodo per il pull delle immagini container in cui GKE trasmette dati in streaming alle 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, il che porta a miglioramenti significativi nei tempi di inizializzazione. Il tempo di estrazione ridotto offre vantaggi tra cui:

  • Scalabilità automatica più rapida
  • Latenza ridotta per l'estrazione di immagini di grandi dimensioni
  • Avvio più rapido dei pod

Con il flusso di immagini, GKE utilizza un file system remoto come file system principale per tutti i container che utilizzano immagini container idonee. GKE trasmette un flusso di dati di immagine dal file system remoto in base alle esigenze dei tuoi carichi di lavoro. Senza il flusso di immagini, GKE scarica l'intera immagine container su ciascun nodo e la utilizza come file system radice per i carichi di lavoro.

Durante il flusso di dati dell'immagine, GKE scarica l'intera immagine container sul disco locale in background e la memorizza nella cache. GKE gestisce quindi le future richieste di lettura dei dati dall'immagine memorizzata nella cache.

Quando esegui il deployment di carichi di lavoro che devono leggere file specifici nell'immagine container, il backend di inserimento di flussi di immagini pubblica solo i file richiesti.

Requisiti

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

  • Devi abilitare l'API Container File System.

    Abilita l'API Container File System

  • I nuovi cluster Autopilot devono eseguire GKE versione 1.25.5-gke.1000 o successiva per abilitare il flusso di immagini 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 Container-Optimized OS con immagine del nodo containerd. I nodi Autopilot utilizzano sempre questa immagine del nodo.

  • Le immagini container devono essere archiviate in Artifact Registry.

  • Se utilizzi cluster privati, devi abilitare l'accesso privato Google sulla subnet per consentire ai nodi di accedere al servizio di streaming di immagini.

  • Se i Controlli di servizio VPC proteggono le immagini container e utilizzi il flusso di immagini, devi includere anche l'API Image Streaming (containerfilesystem.googleapis.com) nel perimetro di servizio.

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

Limitazioni

  • Non puoi utilizzare un secret per eseguire il pull delle immagini container su versioni GKE precedenti alla 1.23.5-gke.1900.
  • Le immagini container che utilizzano il manifest dell'immagine V2, versione 1 dello schema non sono idonee.
  • Le immagini container criptate con chiavi di crittografia gestite dal cliente (CMEK) sono idonee per il flusso di immagini su GKE versione 1.25.3-gke.1000 o successive. Nelle versioni precedenti, GKE scarica queste immagini senza trasmettere i dati. Puoi comunque utilizzare CMEK per proteggere i dischi permanenti e i dischi di avvio personalizzati collegati nei cluster che utilizzano il flusso di immagini.
  • Le immagini container con livelli duplicati sono idonee solo per i flussi di immagini su GKE 1.28 o versioni successive. Nelle versioni precedenti, GKE scarica queste immagini senza trasmettere i flussi di dati. Controlla se nell'immagine del container sono presenti livelli vuoti o duplicati.
  • Il repository Artifact Registry deve trovarsi nella stessa regione dei nodi GKE o in una più regioni corrispondente alla regione in cui sono in esecuzione i nodi. Ad esempio:
    • Se i nodi si trovano in us-east1, il flusso di immagini è disponibile per i repository nella regione us-east1 o nella regione multiregionale us, poiché sia GKE che Artifact Registry sono in esecuzione in località di data center negli Stati Uniti.
    • Se i nodi si trovano nella regione northamerica-northeast1, significa che sono in esecuzione in Canada. In questo caso, il flusso di immagini è disponibile solo per i repository nella stessa regione.
  • Se i 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 remote.
  • Potresti non notare i vantaggi del flusso di immagini durante il primo pull di un'immagine idonea. Tuttavia, una volta che il flusso di immagini memorizza nella cache l'immagine, l'immagine futura estrae qualsiasi vantaggio del cluster dal flusso di immagini.
  • I cluster GKE Standard utilizzano la configurazione a livello di cluster per determinare se abilitare il flusso di immagini sui nuovi pool di nodi creati utilizzando il provisioning automatico dei nodi. Tuttavia, non puoi utilizzare la separazione dei carichi di lavoro per creare pool di nodi con flusso di immagini abilitato quando il flusso di immagini è disabilitato a livello di cluster.
  • Le funzionalità file di Linux come CAP_NET_RAW sono supportate con i flussi di immagini in GKE 1.22.6-gke.300 e versioni successive. Per le versioni precedenti di GKE, queste funzionalità non sono disponibili quando viene eseguito il flusso del file immagine o quando l'immagine viene salvata sul disco locale. Per evitare potenziali interruzioni, non utilizzare il flusso di immagini per i container con queste funzionalità nelle versioni di GKE precedenti alla 1.22.6-gke.300. Se il container si basa sulle funzionalità file di Linux, potrebbe non avviarsi con errori di autorizzazione negata durante l'esecuzione con il flusso di immagini abilitato.

Prima di iniziare

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

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

Abilita flusso di immagini sui cluster

Puoi abilitare il flusso di immagini su cluster Standard nuovi o esistenti utilizzando il flag --enable-image-streaming di gcloud CLI o la console Google Cloud. Per impostazione predefinita, i pool di nodi nel cluster ereditano l'impostazione per i flussi di immagini a livello di cluster. Puoi modificare questo comportamento attivando o disattivando il flusso di immagini sui pool di nodi nel cluster.

Tutti i nuovi cluster Autopilot che eseguono GKE versione 1.25.5-gke.1000 e successive utilizzano i flussi di immagini per eseguire il pull delle immagini idonee. Per le istruzioni, consulta Impostare la versione e il canale di rilascio di un nuovo cluster Autopilot. Le istruzioni seguenti si applicano solo ai cluster GKE Standard.

In un nuovo cluster

Puoi abilitare il flusso di immagini su nuovi cluster utilizzando gcloud CLI o la console Google Cloud.

gcloud

Per creare un nuovo cluster con il flusso di immagini abilitato, esegui questo 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 di Compute Engine per il nuovo cluster. Per i cluster a livello di regione, utilizza invece il flag --region=COMPUTE_REGION. Assicurati che la zona o la regione si trovino nella stessa regione o all'interno di più regioni 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 Attiva flusso di immagini.

  6. Configura il cluster in base alle tue esigenze e fai clic su Crea.

In un cluster esistente

Puoi abilitare il flusso di immagini su cluster esistenti che soddisfano i requisiti utilizzando gcloud CLI o la console Google Cloud.

gcloud

Per aggiornare un cluster esistente in modo da utilizzare il flusso di immagini, esegui questo 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 Stream di immagini.

  4. Nella finestra di dialogo Modifica flusso di immagini, seleziona la casella di controllo Attiva flusso di immagini.

  5. Fai clic su Salva modifiche.

Dopo aver modificato il cluster, GKE abilita automaticamente i flussi di immagini sui pool di nodi esistenti per impostazione predefinita. Se hai abilitato o disabilitato esplicitamente i flussi di immagini su singoli pool di nodi, questi pool di nodi non ereditano le modifiche all'impostazione a livello di cluster.

Verifica che il flusso di immagini sia abilitato su un cluster

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

gcloud

Esegui questo comando:

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

L'impostazione è abilitata 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 che vuoi controllare.

  3. Nella pagina Cluster, nella sezione Funzionalità, accanto a Stream di immagini mostrerà se l'impostazione è abilitata.

Abilita flussi di immagini sui pool di nodi

Per impostazione predefinita, i pool di nodi ereditano l'impostazione per i flussi di immagini a livello di cluster. Puoi abilitare o disabilitare il flusso di immagini su pool di nodi specifici utilizzando gcloud CLI.

In un nuovo pool di nodi

Per creare un nuovo pool di nodi con il flusso di immagini abilitato, esegui questo 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 tuo cluster. Per i cluster a livello di regione, utilizza invece il flag --region=COMPUTE_REGION.

In un pool di nodi esistente

Puoi abilitare il flusso di immagini su pool di nodi esistenti che soddisfano i requisiti.

Per aggiornare un pool di nodi esistente in modo da utilizzare i flussi di immagini, esegui questo comando:

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

Verifica che il flusso di immagini sia abilitato su un pool di nodi

Controlla se il flusso di immagini è abilitato per un pool di nodi:

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

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

gcfsConfig:
  enabled: true
...

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

gcfsConfig: {}
...

Pianifica un carico di lavoro utilizzando il flusso di immagini

Dopo aver abilitato i flussi di immagini sul cluster, GKE utilizza automaticamente il flusso di immagini durante il pull di immagini container idonee da Artifact Registry, senza richiedere ulteriori configurazioni.

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

Nell'esempio seguente, pianifichi un deployment che utilizza un'immagine container di grandi dimensioni su un cluster con il flusso di immagini abilitato. In via facoltativa, puoi quindi confrontare le prestazioni con quelle di un'immagine pull senza che il flusso di immagini sia abilitato.

  1. Crea un nuovo cluster con il flusso 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 container gb-frontend ha una dimensione di 327 MB.

  4. Applica il manifest al tuo 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. Recupera il log eventi di Kubernetes per visualizzare gli eventi di pull 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 impiegato dal flusso di immagini per eseguire il pull dell'immagine.
    • L'evento ImageStreaming mostra che il nodo utilizza il flusso di immagini per pubblicare l'immagine container.

Confrontare il rendimento con i pull di immagini standard

In questo esempio facoltativo, creerai un nuovo cluster con il flusso di immagini disabilitato ed eseguirai il deployment del deployment frontend per confrontare le prestazioni con il flusso di immagini.

  1. Crea un nuovo cluster con il flusso di immagini disabilitato:

    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 del deployment frontend dall'esempio precedente:

    kubectl apply -f frontend-deployment.yaml
    
  4. Recupera il log eventi di 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
    

    Osserva il tempo impiegato da GKE per eseguire il pull dell'intera immagine. In questo output di esempio, GKE ha impiegato quasi 24 secondi. Con il flusso di immagini abilitato, GKE ha bisogno di solo 1,5 secondi per eseguire il pull dei dati delle immagini richiesti dal carico di lavoro per avviare.

Esegui la pulizia

Per evitare addebiti, elimina i cluster che hai creato negli esempi precedenti:

gcloud container clusters delete CLUSTER_NAME CLUSTER2_NAME

Disattiva flusso di immagini

Se usi GKE Autopilot, non puoi disabilitare il flusso di immagini su singoli cluster. Puoi disabilitare l'API Container File System, disabilitando in questo modo il flusso di immagini per l'intero progetto.

Se utilizzi cluster GKE Standard, puoi disabilitare il flusso di immagini su singoli cluster o pool di nodi specifici, come descritto nelle sezioni seguenti.

Disabilita il flusso di immagini su un cluster GKE Standard

Puoi disabilitare il flusso di immagini su cluster GKE Standard esistenti utilizzando gcloud CLI o la console Google Cloud.

gcloud

Per disabilitare il flusso di immagini su un cluster esistente, esegui questo 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, in Funzionalità, fai clic su accanto a Stream di immagini.

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

  5. Fai clic su Salva modifiche.

In un nuovo pool di nodi

Per disabilitare il flusso di immagini durante la creazione di un nuovo pool di nodi, specifica il flag --no-enable-image-streaming, come 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 disabilitare il flusso di immagini su un pool di nodi esistente, esegui questo comando:

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

Prenotazione della memoria per il flusso di immagini

GKE prenota risorse di memoria per i flussi di immagini, oltre a quella riservata per l'esecuzione ai componenti del sistema dei nodi. GKE non prenota risorse della CPU aggiuntive per il flusso di immagini. Nei cluster GKE Standard, questa prenotazione modifica le risorse di memoria disponibili per la richiesta nei tuoi pod. In GKE Autopilot, GKE gestisce le allocazioni di sistema, quindi non ha alcun impatto sulla pianificazione dei carichi di lavoro.

Per maggiori dettagli sulle prenotazioni di memoria effettuate da GKE per i componenti dei nodi, consulta Architettura standard dei cluster.

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

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

Risoluzione dei problemi

GKE non utilizza il file system di flussi di immagini

Se il log eventi GKE non mostra gli eventi di flusso di immagini, l'immagine non è supportata dal file system remoto. Se GKE ha precedentemente eseguito il pull dell'immagine sul nodo, questo è un comportamento previsto perché GKE utilizza la cache locale dell'immagine per i pull successivi anziché utilizzare il flusso di immagini. Puoi verificarlo cercando Container image IMAGE_NAME already present on machine nel campo Message per l'evento Pulled del pod.

Se non vedi l'evento Flusso di immagini durante il primo pull dell'immagine sul nodo, assicurati di soddisfare i requisiti per il flusso di immagini. Se soddisfi 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 progetto Google Cloud.

PermissionDenied

Se nei log gcfsd viene visualizzato un messaggio di errore simile al seguente, l'ambito API del nodo non è corretto. GKE estrae le immagini container per i carichi di lavoro senza usare 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."

Puoi risolvere il problema concedendo al nodo l'ambito corretto per consentirgli di utilizzare il flusso 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 ricevi un messaggio di errore relativo a code = FailedPrecondition, l'immagine non è stata importata nel file system remoto di streaming immagine.

Potresti notare questo errore se hai provato a utilizzare il flusso di immagini con un pool di nodi esistente. Se un nodo nel pool di nodi dispone già dell'immagine container sul disco, GKE utilizza l'immagine locale anziché il flusso di immagini per ottenerla.

Per risolvere il problema, prova a procedere nel seguente modo:

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

InvalidArgument

Se viene visualizzato un messaggio di errore con code=InvalidArgument, l'immagine container utilizzata dal carico di lavoro non è idonea per il flusso di immagini. Assicurati che l'immagine soddisfi i requisiti. Se l'immagine non è su Artifact Registry, prova a eseguire la migrazione ad Artifact Registry.

backend.FileContent failed

Durante la lettura dei file container 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 di file system del container remoto. Per risolvere il problema, aumenta le quote seguenti:

  • Richieste di contenuti per progetto per regione al minuto per regione
  • Richieste di contenuti per progetto per regione

GKE scarica l'immagine senza trasmettere i flussi di dati

Le immagini container che utilizzano chiavi di crittografia gestite dal cliente (CMEK) sono idonee solo per il flusso di immagini su GKE versione 1.25.3-gke.1000 o successive. Le immagini container con livelli duplicati sono idonee solo per il flusso di immagini su GKE versione 1.28 o successiva. Per saperne di più, consulta le Limitazioni.

Verifica di livelli vuoti o duplicati

Per verificare l'eventuale presenza di livelli vuoti o duplicati nell'immagine container, esegui questo comando:

docker inspect IMAGE_NAME

Sostituisci IMAGE_NAME con il nome dell'immagine container.

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

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

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

Se sono presenti voci duplicate come nell'esempio seguente, l'immagine container ha livelli duplicati e non è idonea per il flusso di immagini.

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

Il comando mv e le chiamate di sistema renameat2 non funzionano sui file di link simbolici

Per i nodi GKE che eseguono la versione 1.25 e successive, quando è abilitato il flusso di immagini, il comando mv e la chiamata di sistema renameat2 potrebbero non riuscire sui file di collegamento simbolico nelle immagini container con il messaggio di errore "Nessun dispositivo o indirizzo simile". Il problema è causato da una regressione sui 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 container, quando un'applicazione è in fase di preparazione per l'esecuzione. Poiché non è possibile testare l'immagine localmente, GKE consiglia di utilizzare i flussi di immagini in ambienti di test per individuare 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 tutti i carichi di lavoro interessati, puoi provare a sostituire il codice che genera la chiamata di sistema renameat2. Se non puoi modificare il codice, devi disabilitare il flusso di immagini nel pool di nodi per ridurre il problema.