Utiliser le streaming d'images pour extraire des images de conteneur


Cette page vous explique comment utiliser le streaming d'images dans Google Kubernetes Engine (GKE) pour extraire des images de conteneurs en diffusant les données d'image selon les besoins de vos applications.

Aperçu

Le streaming d'images est une méthode d'extraction d'images de conteneurs, dans laquelle GKE diffuse les données à partir des images éligibles, à la demande de vos applications. Vous pouvez utiliser le streaming d'images pour permettre à vos charges de travail de s'initialiser sans attendre le téléchargement de l'image entière, ce qui réduit considérablement les délais d'initialisation. La réduction du délai d'extraction présente les avantages suivants :

  • Autoscaling plus rapide
  • Latence réduite lors de l'extraction d'images volumineuses
  • Démarrage plus rapide des pods

GKE télécharge généralement l'image de conteneur complète sur chaque nœud et l'utilise comme système de fichiers racine pour vos charges de travail. Avec le streaming d'images, GKE utilise un système de fichiers distant comme système de fichiers racine pour tous les conteneurs qui utilisent des images de conteneurs éligibles. GKE diffuse les données d'image du système de fichiers distant en fonction des besoins de vos charges de travail.

Lors du streaming des données d'image, GKE télécharge l'image entière du conteneur en arrière-plan dans le système de fichiers distant, puis la met en cache. GKE diffuse ensuite les futures requêtes de lecture des données à partir de l'image mise en cache.

Lorsque vous déployez des charges de travail qui doivent lire des fichiers spécifiques dans l'image de conteneur, le backend de streaming d'images ne diffuse que les fichiers demandés.

Réservation de mémoire pour le streaming d'images

GKE réserve des ressources mémoire pour le streaming d'images en plus de la mémoire réservée aux composants du système de nœuds à exécuter. GKE ne réserve pas de ressources de processeur supplémentaires pour le streaming d'images.

Pour en savoir plus sur les réservations de mémoire effectuées par GKE pour les composants de nœud, consultez la page Architecture d'un cluster standard.

Dans les nœuds qui utilisent le streaming d'images, GKE effectue les réservations de mémoire supplémentaires suivantes :

  • Aucune mémoire supplémentaire pour les machines dotées de moins de 1 Gio de mémoire
  • 10 % des 4 premiers Gio de mémoire
  • 8 % des 112 Gio suivants de mémoire (jusqu'à 128 Gio)
  • 4 % des 112 Gio suivants de mémoire (jusqu'à 128 Gio)
  • 2,4 % des 112 Gio suivants de mémoire (jusqu'à 128 Gio)
  • 0,8 % de toute la mémoire au-delà de 128 Gio

Exigences

Vous devez répondre aux exigences suivantes pour utiliser le streaming d'images :

  • Vous devez activer l'API Container File System.

    Activer l'API Container File System

  • Votre cluster et vos pools de nœuds doivent exécuter GKE version 1.18.6-gke.4801 ou ultérieure.

  • Vous devez utiliser Container-Optimized OS avec une image de nœud containerd.

  • Vos images de conteneurs doivent être stockées dans Artifact Registry.

  • Si vous utilisez des clusters privés, vous devez activer l'accès privé à Google sur le sous-réseau pour que vos nœuds puissent accéder au service de streaming d'images.

Limites

  • Vous ne pouvez pas utiliser un secret pour extraire des images de conteneur.
  • Les images de conteneurs qui utilisent le fichier manifeste d'image V2, schéma version 1 ne sont pas éligibles.
  • Les images de conteneurs chiffrées à l'aide de clés de chiffrement gérées par le client ne sont pas éligibles au streaming d'images. GKE télécharge ces images sans diffuser les données. Vous pouvez toujours utiliser CMEK pour protéger les disques persistants et les disques de démarrage personnalisés associés dans les clusters utilisant le streaming d'images.
  • Vos nœuds GKE doivent se trouver dans la même région en tant que dépôt Artifact Registry contenant l'image, ou dans une région membre du dépôt multirégional Artifact Registry.
  • Si vos charges de travail lisent de nombreux fichiers dans une image lors de l'initialisation, vous remarquerez peut-être des délais d'initialisation plus élevés en raison de la latence qu'ajoutent les lectures de fichiers distants.
  • Vous ne remarquerez peut-être pas les avantages du streaming d'images lors de la première extraction d'une image éligible. Cependant, une fois que le streaming d'images a mis en cache l'image, les futures extractions d'images sur n'importe quel cluster bénéficieront des avantages du streaming d'images.
  • GKE utilise la configuration au niveau du cluster pour déterminer s'il convient d'activer le streaming d'images sur les pools de nœuds créés à l'aide du provisionnement automatique des nœuds. Toutefois, vous ne pouvez pas utiliser la séparation de charge de travail pour créer des pools de nœuds avec le streaming d'images activé lorsque le streaming d'images est désactivé au niveau du cluster.
  • Les images de conteneurs protégées par VPC Service Controls ne sont pas éligibles au streaming d'images. GKE télécharge ces images sans diffuser les données.
  • Les fonctionnalités de fichiers Linux ne sont pas compatibles avec le streaming d'images. Si l'un de vos fichiers de conteneur se voit attribuer des fonctionnalités telles que CAP_NET_RAW, ces fonctionnalités ne sont pas disponibles lors de la diffusion du fichier image ni de l'enregistrement de l'image sur le disque local. Pour éviter toute interruption potentielle, n'utilisez pas le streaming d'images pour les conteneurs auxquels ces fonctionnalités sont attribuées.

Avant de commencer

Avant de commencer, effectuez les tâches suivantes :

  • Assurez-vous d'avoir activé l'API Google Kubernetes Engine.
  • Activer l'API Google Kubernetes Engine
  • Assurez-vous d'avoir installé le SDK Cloud.
  • Configurez les paramètres de l'outil de ligne de commande gcloud par défaut pour votre projet en utilisant l'une des méthodes suivantes:
    • Utilisez gcloud init si vous souhaitez suivre les étapes de définition des paramètres par défaut du projet.
    • Utilisez gcloud config pour définir individuellement l'ID, la zone et la région de votre projet.

    gcloud init

    1. Exécutez gcloud init et suivez les instructions :

      gcloud init

      Si vous utilisez SSH sur un serveur distant, utilisez l'option --console-only pour empêcher la commande d'ouvrir un navigateur :

      gcloud init --console-only
    2. Suivez les instructions pour autoriser l'outil gcloud à utiliser votre compte Google Cloud.
    3. Créez ou sélectionnez une configuration.
    4. Choisissez un projet Google Cloud.
    5. Choisissez une zone Compute Engine par défaut.
    6. Choisissez une région Compute Engine par défaut.

    gcloud config

    1. Définissez votre ID de projet par défaut :
      gcloud config set project PROJECT_ID
    2. Définissez votre région Compute Engine par défaut (par exemple, us-central1):
      gcloud config set compute/region COMPUTE_REGION
    3. Définissez votre zone Compute Engine par défaut (par exemple, us-central1-c):
      gcloud config set compute/zone COMPUTE_ZONE
    4. Mettez à jour gcloud vers la dernière version :
      gcloud components update

    En définissant des emplacements par défaut, vous pouvez éviter les erreurs dans l'outil gcloud, telles que les suivantes: One of [--zone, --region] must be supplied: Please specify location.

Activer le streaming d'images sur les clusters

Vous pouvez activer le streaming d'images sur des clusters nouveaux ou existants à l'aide de l'option gcloud de l'outil --enable-image-streaming ou à l'aide de Google Cloud Console. Par défaut, les pools de nœuds du cluster héritent du paramètre de streaming d'images au niveau du cluster. Vous pouvez modifier ce comportement en activant ou en désactivant le streaming d'images sur les pools de nœuds du cluster.

Sur un nouveau cluster

Vous pouvez activer le streaming d'images sur de nouveaux clusters à l'aide de l'outil gcloud ou de Cloud Console.

gcloud

Pour créer un cluster avec le streaming d'images activé, exécutez la commande suivante :

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

Remplacez les éléments suivants :

  • CLUSTER_NAME : nom de votre nouveau cluster
  • COMPUTE_ZONE : zone Compute Engine de votre nouveau cluster. Pour les clusters régionaux, utilisez plutôt l'option --region=COMPUTE_REGION. Assurez-vous que la zone ou la région est la même ou qu'elle se trouve dans l'emplacement multirégional du dépôt Artifact Registry contenant l'image.

Console

  1. Accédez à la page Google Kubernetes Engine dans Cloud Console.

    Accéder à Google Kubernetes Engine

  2. Cliquez sur Créer.

  3. Dans la section GKE Standard, cliquez sur Configurer.

  4. Dans le volet de navigation, sous Cluster, cliquez sur Fonctionnalités.

  5. Dans la section Autre, cochez la case Activer le streaming d'images.

  6. Configurez le cluster selon vos besoins, puis cliquez sur Créer.

Sur un cluster existant

Vous pouvez activer le streaming d'images sur des clusters existants qui répondent aux exigences à l'aide de l'outil gcloud ou de Cloud Console.

gcloud

Pour mettre à jour un cluster existant de sorte qu'il utilise le streaming d'images, exécutez la commande suivante à l'aide de l'outil gcloud :

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

Console

  1. Accédez à la page Google Kubernetes Engine dans Cloud Console.

    Accéder à Google Kubernetes Engine

  2. Cliquez sur le nom du cluster que vous souhaitez modifier.

  3. Dans la section Fonctionnalités de la page Clusters, cliquez sur à côté de Streaming d'images.

  4. Dans la boîte de dialogue Modifier le streaming d'images, décochez la case Activer le streaming d'images.

  5. Cliquez sur Enregistrer les modifications.

Une fois le cluster modifié, GKE active automatiquement le streaming d'images sur vos pools de nœuds existants. Si vous avez explicitement activé ou désactivé le streaming d'images sur des pools de nœuds individuels, ces pools n'héritent pas des modifications apportées au paramètre au niveau du cluster.

Activer le streaming d'images sur des pools de nœuds

Par défaut, les pools de nœuds héritent du paramètre de streaming d'images au niveau du cluster. Vous pouvez activer ou désactiver le streaming d'images sur des pools de nœuds spécifiques à l'aide de l'outil gcloud.

Sur un nouveau pool de nœuds

Pour créer un pool de nœuds avec le streaming d'images activé, exécutez la commande suivante :

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

Remplacez les éléments suivants :

  • NODE_POOL_NAME : nom de votre nouveau pool de nœuds.
  • CLUSTER_NAME : nom du cluster pour le pool de nœuds.
  • COMPUTE_ZONE : zone Compute Engine de votre cluster. Pour les clusters régionaux, utilisez plutôt l'option --region=COMPUTE_REGION.

Sur un pool de nœuds existant

Vous pouvez activer le streaming d'images sur les pools de nœuds existants qui répondent aux exigences.

Pour mettre à jour un pool de nœuds existant afin d'utiliser le streaming d'images, exécutez la commande suivante :

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

Planifier une charge de travail à l'aide du streaming d'images

Une fois activé sur votre cluster, le streaming d'images est automatiquement utilisé par GKE lors de l'extraction d'images de conteneurs éligibles à partir d'Artifact Registry sans nécessiter de configuration supplémentaire.

GKE ajoute le libellé cloud.google.com/gke-image-streaming: "true" aux nœuds des pools de nœuds avec le streaming d'images activé. Si vous activez ou désactivez le streaming d'images sur des pools de nœuds spécifiques afin que votre cluster contienne un mélange de nœuds qui utilisent le streaming d'images et d'autres qui ne l'utilisent pas, vous pouvez utiliser des sélecteurs de nœuds dans vos déploiements pour contrôler si GKE planifie vos charges de travail sur des nœuds qui utilisent le streaming d'images.

Dans l'exemple suivant, vous planifiez un déploiement qui utilise une image de conteneur volumineuse sur un cluster avec le streaming d'images activé. Vous pouvez ensuite comparer les performances avec une extraction d'images sans le streaming d'images activé.

  1. Créez un cluster avec le streaming d'images activé :

    gcloud container clusters create CLUSTER_NAME \
        --zone=COMPUTE_ZONE \
        --enable-image-streaming \
        --image-type="COS_CONTAINERD"
    
  2. Obtenez les identifiants du cluster :

    gcloud container clusters get-credentials CLUSTER_NAME \
        --zone=COMPUTE_ZONE
    
  3. Enregistrez le manifeste suivant sous le nom 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
    

    La taille de l'image de conteneur gb-frontend est de 327 Mo.

  4. Appliquez le fichier manifeste à votre cluster :

    kubectl apply -f frontend-deployment.yaml
    
  5. Vérifiez que GKE a créé le déploiement :

    kubectl get pods -l app=guestbook
    

    Le résultat ressemble à ce qui suit :

    NAMESPACE    NAME                          READY    STATUS       RESTARTS    AGE
    default      frontend-64bcc69c4b-pgzgm     1/1      Completed    0           3s
    
  6. Obtenez le journal des événements Kubernetes pour afficher les événements d'extraction d'images :

    kubectl get events --all-namespaces
    

    Le résultat ressemble à ce qui suit :

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

    Dans ce résultat :

    • L'événement Pulled indique le temps nécessaire au streaming d'images pour l'extraction.
    • L'événement ImageStreaming montre que le nœud utilise le streaming d'images pour diffuser l'image de conteneur.

Comparer les performances avec des extractions d'images standards

Dans cet exemple facultatif, vous créez un cluster avec le streaming d'images désactivé et vous déployez frontend pour comparer les performances avec le streaming d'images.

  1. Créez un cluster avec le streaming d'images désactivé :

    gcloud container clusters create CLUSTER2_NAME\
        --zone=COMPUTE_ZONE \
        --image-type="COS_CONTAINERD"
    
  2. Obtenez les identifiants du cluster :

    gcloud container clusters get-credentials CLUSTER2_NAME \
        --zone=COMPUTE_ZONE
    
  3. Déployez le frontend de l'exemple précédent :

    kubectl apply -f frontend-deployment.yaml
    
  4. Obtenez le journal des événements Kubernetes :

    kubectl get events --all-namespaces
    

    Le résultat ressemble à ce qui suit :

     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
    

    Notez le temps nécessaire à GKE pour extraire l'image entière. Dans cet exemple de résultat, GKE a besoin de près de 24 secondes. Lorsque le streaming d'images est activé, GKE n'a besoin que de 1,5 seconde pour extraire les données d'image dont la charge de travail a besoin pour démarrer.

Effectuer un nettoyage

Pour éviter des frais, supprimez les clusters que vous avez créés dans les exemples précédents :

gcloud container clusters delete CLUSTER_NAME CLUSTER2_NAME

Utiliser le streaming d'images avec l'autoscaler de cluster

L'autoscaler de cluster utilise le streaming d'images pour améliorer les performances de l'autoscaling. Les nouveaux nœuds créés lors d'événements de scaling à la hausse utilisent les images importées par streaming d'images au lieu de télécharger des images à partir du dépôt. L'autoscaler de cluster active le streaming d'images sur les nouveaux pools de nœuds créés dans les clusters sur lesquels le streaming d'images est activé.

Désactiver le streaming d'images

Par défaut, GKE n'active pas le streaming d'images sur les nouveaux clusters. Vous pouvez désactiver le streaming d'images sur des clusters existants et sur des pools de nœuds nouveaux et existants.

Sur un cluster existant

Vous pouvez désactiver le streaming d'images sur des clusters existants à l'aide de l'outil gcloud ou de Cloud Console.

gcloud

Pour désactiver le streaming d'images sur un cluster existant, exécutez la commande suivante :

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

Console

  1. Accédez à la page Google Kubernetes Engine dans Cloud Console.

    Accéder à Google Kubernetes Engine

  2. Cliquez sur le nom du cluster que vous souhaitez modifier.

  3. Sur la page Clusters, sous Fonctionnalités, cliquez sur à côté de Streaming d'images.

  4. Dans la boîte de dialogue Modifier le streaming d'images, décochez la case Activer le streaming d'images.

  5. Cliquez sur Enregistrer les modifications.

Sur un nouveau pool de nœuds

Pour désactiver le streaming d'images lors de la création d'un pool de nœuds, spécifiez l'option --no-enable-image-streaming, comme dans la commande suivante :

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

Sur un pool de nœuds existant

Pour désactiver le streaming d'images sur un pool de nœuds existant, exécutez la commande suivante :

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

Dépannage

GKE n'utilise pas le système de fichiers du streaming d'images

Si le journal des événements GKE n'affiche pas les événements de streaming d'images, l'image n'est pas sauvegardée par le système de fichiers distant. Si GKE a déjà extrait l'image du nœud, ce comportement est normal, car il utilise le cache local de l'image pour les extractions suivantes au lieu d'utiliser le streaming d'images. Vous pouvez le vérifier en recherchant Container image IMAGE_NAME already present on machine dans le champ Message de l'événement Pulled du pod.

Si vous ne voyez pas l'événement de streaming d'images lors de la première extraction de l'image sur le nœud, assurez-vous de remplir les conditions requises pour le streaming d'images. Si vous remplissez les conditions requises, vous pouvez diagnostiquer le problème en vous connectant au nœud concerné et en vérifiant les journaux du service de streaming d'images (nommé gcfsd) :

journalctl -u gcfsd

Vous pouvez également vérifier les journaux à l'aide de l'explorateur de journaux pour filtrer les journaux gcfsd avec logName="projects/PROJECT_ID/logs/gcfsd".

Essayez l'une des solutions suivantes en fonction du message d'erreur affiché.

PermissionDenied

Si les journaux gcfsd affichent un message d'erreur semblable à celui-ci, le nœud ne dispose pas du champ d'application d'API approprié. GKE extrait des images de conteneurs pour des charges de travail sans utiliser le streaming d'images.

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

Pour résoudre ce problème, attribuez le champ d'application approprié au nœud afin de lui permettre d'utiliser le streaming d'images. Ajoutez le champ d'application devstorage.read_only au cluster ou au pool de nœuds, comme décrit ci-dessous :

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

Si le message d'erreur affiche code = FailedPrecondition, l'image n'a pas été importée dans le système de fichiers distant du streaming d'images.

Cette erreur peut se produire si vous essayez d'utiliser le streaming d'images avec un pool de nœuds existant. Si un nœud du pool de nœuds dispose déjà de l'image de conteneur sur le disque, GKE utilise l'image locale au lieu du streaming d'images pour obtenir l'image.

Pour résoudre ce problème, procédez comme suit :

  • Attendez quelques minutes, puis réessayez de déployer votre charge de travail.
  • Ajoutez des nœuds ou un pool de nœuds, et planifiez la charge de travail sur ces nœuds.

InvalidArgument

Si le message d'erreur affiche code=InvalidArgument, l'image de conteneur utilisée par votre charge de travail n'est pas compatible avec le streaming d'images. Vérifiez que l'image répond aux exigences. Si votre image ne se trouve pas dans Artifact Registry, essayez de migrer vers Artifact Registry.