Usa il flusso dell'immagine per estrarre le immagini container


Questa pagina mostra come utilizzare lo stream di immagini in Google Kubernetes Engine (GKE) per estrarre le immagini container eseguendo il flusso di dati immagine in base alle esigenze delle applicazioni.

Panoramica

Il flusso di immagini è un metodo per estrarre immagini container in cui GKE trasmette dati in streaming da immagini idonee, come richiesto dalle tue applicazioni. Puoi utilizzare il flusso dell'immagine 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 pull ridotto offre diversi vantaggi, tra cui:

  • Scalabilità automatica più veloce
  • Latenza ridotta durante il pull di immagini di grandi dimensioni
  • Avvio pod più veloce

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

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

Quando esegui il deployment dei carichi di lavoro che devono leggere file specifici nell'immagine container, il backend di streaming di immagini gestisce solo i file richiesti.

Prenotazione memoria per streaming immagine

GKE prenota le risorse di memoria per lo streaming di immagini in aggiunta alla memoria riservata ai componenti del sistema di nodi da eseguire. GKE non prenota risorse CPU aggiuntive per il flusso di immagini.

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

Nei nodi che utilizzano il flusso di immagini, GKE effettua le seguenti prenotazioni aggiuntive per la memoria:

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

Requisiti

Per utilizzare lo streaming di immagini, devi soddisfare i seguenti requisiti:

  • Devi abilitare l'API Container File System.

    Abilita l'API Container File System

  • I pool di nodi e dei cluster devono eseguire GKE 1.18.6-gke.4801 o versioni successive.

  • Devi utilizzare Container-Optimized OS con l'immagine nodo containerizzata.

  • Le immagini container devono essere archiviate in Artifact Registry.

  • Se utilizzi cluster privati, devi attivare 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 dell'immagine, devi includere anche l'API Image Streaming (containerfilesystem.googleapis.com) nel perimetro di servizio.

Limitazioni

  • Non puoi utilizzare un secret per eseguire il pull delle immagini dei container nelle versioni di GKE precedenti alla 1.23.5-gke.1900.
  • Le immagini container che utilizzano il file V2 Image Manifest, schema versione 1 non sono idonee.
  • Le immagini container criptate con chiavi di crittografia gestite dal cliente (CMEK) non sono idonee per il flusso di immagini. GKE scarica queste immagini senza trasmettere i dati in streaming. Puoi comunque utilizzare CMEK per proteggere i dischi permanenti collegati e i dischi di avvio personalizzati nei cluster che utilizzano il flusso di immagini.
  • Le immagini container con livelli vuoti o livelli duplicati non sono idonee per il flusso di immagini. GKE scarica queste immagini senza fluire i dati. Controlla la tua immagine container per verificare la presenza di livelli vuoti o duplicati.
  • Il repository Artifact Registry deve trovarsi nella stessa area geografica dei nodi GKE o in una più aree geografiche che corrisponde all'area geografica 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 nell'area geografica us-east1 o in più aree geografiche us, perché sia GKE che Artifact Registry sono in esecuzione nelle località dei data center negli Stati Uniti.
    • I nodi nell'area geografica northamerica-northeast1 sono in esecuzione in Canada. In questa situazione, il flusso dell'immagine è disponibile solo per i repository nella stessa area geografica.
  • 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 del file remoto.
  • Potresti non notare i vantaggi dello streaming di immagini durante il primo pull di un'immagine idonea. Tuttavia, dopo che lo streaming di immagini è stato memorizzato nella cache, l'immagine futura recupera gli eventuali cluster che presentano vantaggi dal flusso di immagini.
  • GKE utilizza 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 il flusso dell'immagine abilitato quando il flusso dell'immagine è disabilitato a livello di cluster.
  • Le funzionalità dei file Linux, come CAP_NET_RAW, sono supportate con lo streaming 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 inviato 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 di GKE precedenti alla 1.22.6-gke.300. Se il tuo container si basa su funzionalità dei file di Linux, potrebbe non iniziare con errori che non hanno concesso l'autorizzazione durante l'esecuzione con il flusso di immagini abilitato.

Prima di iniziare

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

  • Assicurati di aver abilitato l'API Google Kubernetes Engine.
  • Abilita l'API Google Kubernetes Engine
  • Assicurati di aver installato l'interfaccia a riga di comando di Google Cloud.
  • Configura le impostazioni dell'interfaccia a riga di comando di Google Cloud predefinite per il tuo progetto utilizzando uno dei seguenti metodi:
    • Utilizza gcloud init se vuoi avere istruzioni dettagliate sull'impostazione delle impostazioni predefinite del progetto.
    • Utilizza gcloud config per impostare singolarmente l'ID, la zona e l'area geografica del progetto.

    gcloud init

    1. Esegui gcloud init e segui le istruzioni:

      gcloud init

      Se utilizzi SSH su un server remoto, usa il flag --console-only per impedire l'avvio del comando da parte di un browser:

      gcloud init --console-only
    2. Segui le istruzioni per autorizzare l'interfaccia a riga di comando gcloud a utilizzare il tuo account Google Cloud.
    3. Crea una nuova configurazione o selezionane una esistente.
    4. Scegli un progetto Google Cloud.
    5. Scegli una zona Compute Engine predefinita.
    6. Scegli un'area geografica di Compute Engine predefinita.

    gcloud config

    1. Imposta l'ID progetto predefinito:
      gcloud config set project PROJECT_ID
    2. Imposta l'area geografica di Compute Engine predefinita (ad esempio us-central1):
      gcloud config set compute/region COMPUTE_REGION
    3. Imposta la zona Compute Engine predefinita (ad esempio us-central1-c):
      gcloud config set compute/zone COMPUTE_ZONE
    4. Aggiorna gcloud alla versione più recente:
      gcloud components update

    Impostando le posizioni predefinite puoi evitare errori nell'interfaccia a riga di comando gcloud come One of [--zone, --region] must be supplied: Please specify location:

Abilita flusso immagine su cluster

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

In un nuovo cluster

Puoi abilitare il flusso di immagini per i nuovi cluster utilizzando l'interfaccia a riga di comando gcloud o Cloud Console.

gcloud

Per creare un nuovo cluster con Streaming immagine 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 area geografica, utilizza invece il flag --region=COMPUTE_REGION. Assicurati che la zona o l'area geografica si trovi nella stessa area geografica o che rientri all'interno di più aree geografiche del repository Artifact Registry che contiene l'immagine.

Console

  1. Vai alla pagina Google Kubernetes Engine in Cloud Console.

    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 Funzioni.

  5. Nella sezione Altro, seleziona la casella di controllo Abilita flusso immagine.

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

Su un cluster esistente

Puoi abilitare il flusso di immagini sui cluster esistenti che soddisfano i requisiti utilizzando l'interfaccia a riga di comando gcloud o Cloud Console.

gcloud

Per aggiornare un cluster esistente per utilizzare lo streaming di immagini, esegui il comando seguente utilizzando l'interfaccia a riga di comando gcloud:

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

Console

  1. Vai alla pagina Google Kubernetes Engine in Cloud Console.

    Vai a Google Kubernetes Engine

  2. Fai clic sul nome del cluster che vuoi modificare.

  3. Nella sezione Funzionalità della pagina Cluster, fai clic su accanto a Stream immagine.

  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 abilita automaticamente il flusso di immagini sui pool di nodi esistenti per impostazione predefinita. Se hai abilitato o disabilitato esplicitamente lo streaming di immagini su singoli pool di nodi, questi pool di nodi non ereditano le modifiche all'impostazione a livello di cluster.

Abilita flusso di immagini sui pool di nodi

Per impostazione predefinita, i pool di nodi ereditano l'impostazione di inserimento di flussi di immagini a livello di cluster. Puoi abilitare o disabilitare il flusso di immagine per pool di nodi specifici utilizzando l'interfaccia a riga di comando gcloud.

Su un nuovo pool di nodi

Per creare un nuovo pool di nodi con Streaming 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 di Compute Engine del tuo cluster. Per i cluster a livello di area geografica, utilizza invece il flag --region=COMPUTE_REGION.

Su un pool di nodi esistente

Puoi attivare il flusso di immagini per i pool di nodi esistenti che soddisfano i requisiti.

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

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

Pianifica un carico di lavoro utilizzando Streaming immagini

Dopo aver abilitato il flusso di immagini sul tuo cluster, GKE utilizza automaticamente il flusso di immagini durante il pull di immagini container idonee da Artifact Registry senza richiedere alcuna configurazione aggiuntiva.

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

Nell'esempio seguente, pianifichi un deployment che utilizza un'immagine container di grandi dimensioni su un cluster con inserimento di flussi di immagini abilitato. In via facoltativa, puoi confrontare le prestazioni con un pull dell'immagine senza inserimento di Streaming immagine.

  1. Crea un nuovo cluster con Streaming delle 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. Ottieni il log eventi Kubernetes per vedere 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 per lo streaming di immagini per estrarre l'immagine.
    • L'evento ImageStreaming mostra che il nodo utilizza Streaming delle immagini per pubblicare l'immagine container.

Confrontare il rendimento con i pull delle immagini standard

In questo esempio facoltativo, crei un nuovo cluster con lo streaming di immagini disabilitato e sottoponi a deployment il deployment frontend per confrontare le prestazioni con lo streaming di immagini.

  1. Crea un nuovo cluster con Streaming delle 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. Ottenere il log 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
    

    Osserva il tempo impiegato da GKE per estrarre l'intera immagine. In questo output di esempio, GKE ha richiesto quasi 24 secondi. Con il flusso dell'immagine abilitato, GKE richiede solo 1,5 secondi per estrarre i dati immagine necessari per l'avvio del carico di lavoro.

esegui la pulizia

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

gcloud container clusters delete CLUSTER_NAME CLUSTER2_NAME

Utilizzo di Flusso immagine con gestore della scalabilità automatica dei cluster

Il scalatore automatico del cluster utilizza lo streaming di immagini per migliorare le prestazioni della scalabilità automatica. I nuovi nodi creati durante gli eventi di scale up utilizzano le immagini importate da Streaming di immagini, anziché scaricare le immagini dal repository. Il gestore della scalabilità automatica dei cluster consente il flusso di immagini per i nuovi pool di nodi creati nei cluster in cui è abilitato Streaming delle immagini.

Disattiva flusso immagine

Per impostazione predefinita, GKE non abilita il flusso di immagini per i nuovi cluster. Puoi disabilitare il flusso di immagini sui cluster esistenti e sui pool di nodi nuovi ed esistenti.

Su un cluster esistente

Puoi disabilitare il flusso di immagini per i cluster esistenti utilizzando l'interfaccia a riga di comando gcloud o Cloud Console.

gcloud

Per disabilitare il flusso di immagine su un cluster esistente, esegui il comando seguente:

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

Console

  1. Vai alla pagina Google Kubernetes Engine in Cloud Console.

    Vai a Google Kubernetes Engine

  2. Fai clic sul nome del cluster che vuoi modificare.

  3. Nella pagina Cluster, in Funzionalità, fai clic su accanto a Stream immagine.

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

  5. Fai clic su Salva modifiche.

Su 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, ad esempio nel seguente comando:

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

Su un pool di nodi esistente

Per disabilitare lo streaming di immagini su un pool di nodi esistente, esegui il comando seguente:

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

Risolvere i problemi

GKE non utilizza il file system di streaming delle immagini

Se il log eventi di GKE non mostra gli eventi di flusso di immagine, l'immagine non è supportata dal file system remoto. Se GKE ha precedentemente eseguito il pull dell'immagine sul nodo, questo è il comportamento previsto perché GKE usa la cache locale dell'immagine per i pull successivi anziché utilizzare il flusso dell'immagine. 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 di streaming di immagini durante il primo pull dell'immagine, assicurati di soddisfare i requisiti per il flusso di immagini. Se soddisfi i requisiti, puoi diagnosticare il problema connettendoti al nodo interessato e controllando i log del servizio di streaming di immagini (denominato gcfsd):

journalctl -u gcfsd

In alternativa, puoi controllare i log utilizzando Esplora log per filtrare i log di gcfsd con logName="projects/PROJECT_ID/logs/gcfsd".

Prova una delle seguenti soluzioni in base al messaggio di errore visualizzato.

Autorizzazione negata

Se i log di gcfsd mostrano un messaggio di errore simile al seguente, il nodo non ha l'ambito API corretto. GKE estrae le immagini dei container per 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."

Puoi risolvere il problema concedendo l'ambito corretto al nodo per consentire l'utilizzo del flusso dell'immagine. 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" \

Errore di condizione preliminare

Se viene visualizzato un messaggio di errore con code = FailedPrecondition, significa che l'immagine non è stata importata nel file system remoto per lo streaming di immagini.

Potresti visualizzare questo errore se hai provato a utilizzare il flusso dell'immagine con un pool di nodi esistente. Se un nodo nel pool di nodi ha già l'immagine del container sul disco, GKE utilizza l'immagine locale invece di utilizzare il flusso dell'immagine per recuperarla.

Per risolvere il problema, prova quanto segue:

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

Argomento non valido

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

GKE scarica l'immagine senza trasmettere i dati in streaming

Le immagini container che utilizzano chiavi di crittografia gestite dal cliente (CMEK), oppure le immagini container con livelli vuoti o duplicati, non sono idonee per il flusso di immagini. Per ulteriori informazioni, consulta le Limitazioni.

Controllo dei livelli vuoti o dei livelli duplicati

Per verificare la presenza di livelli vuoti o livelli duplicati nell'immagine container, esegui il comando seguente:

docker inspect IMAGE_NAME

Sostituisci IMAGE_NAME con il nome dell'immagine container.

Nell'output del comando, esamina le voci alla voce "Layers".

Se una delle voci corrisponde esattamente al seguente output"sha256", l'immagine container 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 container ha livelli duplicati e non è idonea per lo streaming di immagini.

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