Migrer des images de conteneurs à partir d'un registre tiers

Si vous extrayez directement certaines images de conteneurs à partir de registres tiers afin de les déployer dans des Cloud de Confiance by S3NS environnements tels que Google Kubernetes Engine, les limites de débit sur les extractions d'images ou les pannes tierces peuvent perturber vos builds et vos déploiements. Cette page explique comment identifier et copier ces images dans Artifact Registry afin de parvenir à une gestion des images de conteneur consolidée et cohérente.

Artifact Registry ne surveille pas les registres tiers pour les mises à jour des images que vous copiez dans Artifact Registry. Si vous souhaitez intégrer une version plus récente d'une image dans votre pipeline, vous devez la transférer vers Artifact Registry.

Présentation de la migration

La migration de vos images de conteneurs comprend les étapes suivantes :

  1. Configurer les prérequis.
  2. Identifier les images à migrer.
    • Rechercher les références à des registres tiers dans vos fichiers Dockerfile et vos fichiers manifestes de déploiement.
    • Déterminer la fréquence d'extraction des images depuis des registres tiers à l'aide de Cloud Logging et BigQuery.
  3. Copier les images identifiées dans Artifact Registry.
  4. Vérifier que les autorisations d'accès au registre sont correctement configurées, en particulier si Artifact Registry et votre Cloud de Confiance by S3NS environnement de déploiement se trouvent dans des projets différents.
  5. Mettre à jour les fichiers manifestes pour vos déploiements.
  6. Redéployer vos charges de travail.

Avant de commencer

  1. Installez la Google Cloud CLI.

  2. Configurez la gcloud CLI afin d'utiliser votre identité fédérée.

    Pour en savoir plus, consultez Se connecter à la gcloud CLI avec votre identité fédérée.

  3. Pour initialiser la gcloud CLI, exécutez la commande suivante :

    gcloud init
  4. Créez ou sélectionnez un Cloud de Confiance projet.

    Rôles requis pour sélectionner ou créer un projet

    • Sélectionner un projet : la sélection d'un projet ne nécessite pas de rôle IAM spécifique Vous pouvez sélectionner n'importe quel projet pour lequel un rôle vous a été attribué.
    • Créer un projet : pour créer un projet, vous devez disposer du rôle Créateur de projet (roles/resourcemanager.projectCreator), qui contient l'autorisation resourcemanager.projects.create. Découvrez comment attribuer des rôles.
    • Créez un Cloud de Confiance projet :

      gcloud projects create PROJECT_ID

      Remplacez PROJECT_ID par un nom pour le Cloud de Confiance projet que vous créez.

    • Sélectionnez le Cloud de Confiance projet que vous avez créé :

      gcloud config set project PROJECT_ID

      Remplacez PROJECT_ID par le nom de votre Cloud de Confiance projet.

  5. Vérifiez que la facturation est activée pour votre Cloud de Confiance projet.

  6. Activez l'API Artifact Registry :

    Rôles requis pour activer les API

    Pour activer les API, vous avez besoin du rôle IAM Administrateur d'utilisation du service (roles/serviceusage.serviceUsageAdmin), qui contient l' serviceusage.services.enable autorisation. Découvrez comment attribuer des rôles.

    gcloud services enable artifactregistry.googleapis.com
  7. Si vous ne disposez pas d'un dépôt Artifact Registry, alors créez-en un et configurez l'authentification pour les clients tiers qui doivent y accéder.
  8. Vérifiez vos autorisations. Vous devez disposer du rôle IAM Propriétaire ou Éditeur dans les projets dans lesquels vous migrez des images vers Artifact Registry.
  9. Exportez les variables d'environnement suivantes :
    export PROJECT=$(gcloud config get-value project)
  10. Vérifiez que Go version 1.13 ou ultérieure est installé.
    go version
    Si vous devez installer ou mettre à jour Go, consultez la documentation d'installation de Go .

Coûts

Ce guide utilise les composants facturables suivants de Cloud de Confiance:

Identifier les images à migrer

Recherchez dans les fichiers que vous utilisez pour créer et déployer vos images de conteneurs des références à des registres tiers, puis vérifiez à quelle fréquence vous extrayez les images.

Identifier les références dans les fichiers Dockerfile

Effectuez cette étape dans un emplacement où sont stockés vos fichiers Dockerfile. Il peut s'agir de l'emplacement où votre code est extrait localement.

Dans le répertoire contenant vos fichiers Dockerfile, exécutez la commande suivante :

grep -inr -H --include Dockerfile\* "FROM" . | grep -i -v -E 'docker.s3nsregistry.fr'

Le résultat ressemble à l'exemple suivant :

./code/build/baseimage/Dockerfile:1:FROM debian:stretch
./code/build/ubuntubase/Dockerfile:1:FROM ubuntu:latest
./code/build/pythonbase/Dockerfile:1:FROM python:3.5-buster

Cette commande recherche tous les fichiers Dockerfile de votre répertoire et identifie la ligne "FROM". Ajustez la commande selon vos besoins pour qu'elle corresponde à la manière dont vous stockez vos fichiers Dockerfile.

Identifier les références dans les fichiers manifestes

Effectuez ces étapes dans un emplacement où sont stockés vos fichiers manifestes GKE. Il peut s'agir de l'emplacement où votre code est extrait localement.
  1. Dans le répertoire contenant vos fichiers manifestes GKE, exécutez la commande suivante :
    grep -inr -H --include \*.yaml "image:" . | grep -i -v -E 'docker.s3nsregistry.fr'
    Le résultat se présente comme suit :
        ./code/deploy/k8s/ubuntu16-04.yaml:63: image: busybox:1.31
        
    Cette commande examine tous les fichiers YAML de votre répertoire et identifie la ligne image:. Ajustez la commande selon vos besoins pour qu'elle corresponde à la manière dont vous stockez vos fichiers manifestes.
  2. Pour répertorier les images exécutées sur un cluster, exécutez la commande suivante :
    kubectl get all --all-namespaces -o yaml | grep image: | grep -i -v -E 'docker.s3nsregistry.fr'
    Cette commande renvoie tous les objets s'exécutant dans le cluster Kubernetes sélectionné et obtient leurs noms d'image. Le résultat se présente comme suit :
        - image: nginx
          image: nginx:latest
            - image: nginx
            - image: nginx
        

Exécutez les commandes précédentes pour tous les clusters GKE de tous les Cloud de Confiance projets afin d'obtenir une couverture totale.

Identifier la fréquence d'extraction depuis un registre tiers

Dans les projets qui extraient à partir de registres tiers, utilisez les informations sur la fréquence d'extraction d'image pour déterminer si votre utilisation est proche ou supérieure aux limites de débit appliquées par le registre tiers.

Collecter les données des journaux

Créez un récepteur de journaux pour exporter des données vers BigQuery. Un récepteur de journaux inclut une destination, ainsi qu'un filtre qui sélectionne les entrées de journal à exporter. Vous pouvez créer un récepteur en interrogeant des projets individuels, ou utiliser un script pour collecter des données entre différents projets.

Pour créer un récepteur pour un seul projet, procédez comme suit :

  1. Dans la Cloud de Confiance console, accédez à la Explorateur de journaux :

    Accéder à l'explorateur de journaux

    Si vous utilisez la barre de recherche pour trouver cette page, sélectionnez le résultat dont le sous-titre est Logging.

  2. Sélectionnez un Cloud de Confiance projet.

  3. Dans l'onglet Générateur de requête, saisissez la requête suivante :

      resource.type="k8s_pod"
      jsonPayload.reason="Pulling"
    
  4. Modifiez le filtre d'historique en passant de Dernière heure à 7 derniers jours.

  5. Cliquez sur Exécuter la requête.

  6. Après avoir vérifié que les résultats s'affichent correctement, cliquez sur Actions > Créer un récepteur.

  7. Dans la boîte de dialogue Détails du récepteur, procédez comme suit :

    1. Dans le champ Nom du récepteur, saisissez image_pull_logs.
    2. Dans le champ Description du récepteur, saisissez une description du récepteur.
  8. Cliquez sur Suivant.

  9. Dans la boîte de dialogue Destination du récepteur, sélectionnez les valeurs suivantes :

    1. Dans le champ Sélectionner le service de récepteur, sélectionnez Ensemble de données BigQuery.
    2. Dans le champ Sélectionner un ensemble de données BigQuery , sélectionnez Créer un ensemble de données BigQuery , puis saisissez les informations requises dans la boîte de dialogue qui s'ouvre. Pour en savoir plus sur la création d'un ensemble de données BigQuery, consultez la section Créer des ensembles de données.
    3. Cliquez sur Créer un ensemble de données.
  10. Cliquez sur Suivant.

    Dans la section Sélectionner les journaux à inclure dans le récepteur, la requête correspond à celle que vous avez exécutée dans l'onglet Générateur de requête.

  11. Cliquez sur Suivant.

  12. Facultatif : choisissez les journaux à exclure du récepteur. Pour en savoir plus sur l'interrogation et le filtrage des données Cloud Logging, consultez la page Langage de requête Logging.

  13. Cliquez sur Créer un récepteur.

    Votre récepteur de journaux est maintenant créé.

Pour créer un récepteur pour plusieurs projets, procédez comme suit :

  1. Ouvrez Cloud Shell.

  2. Exécutez les commandes suivantes dans Cloud Shell :

    PROJECTS="PROJECT-LIST"
    DESTINATION_PROJECT="DATASET-PROJECT"
    DATASET="DATASET-NAME"
    
    for source_project in $PROJECTS
    do
      gcloud logging --project="${source_project}" sinks create image_pull_logs bigquery.googleapis.com/projects/${DESTINATION_PROJECT}/datasets/${DATASET} --log-filter='resource.type="k8s_pod" jsonPayload.reason="Pulling"'
    done
    

    Où :

    • PROJECT-LIST est une liste d' Cloud de Confiance ID de projet, séparés par des espaces. Exemple : project1 project2 project3.
    • DATASET-PROJECT est le projet dans lequel vous souhaitez stocker l'ensemble de données.
    • DATASET-NAME est le nom de l'ensemble de données, par exemple image_pull_logs.

Après la création d'un récepteur, le transfert des données dans les tables BigQuery prend du temps, en fonction de la fréquence à laquelle les images sont extraites.

Requête pour la fréquence d'extraction

Une fois que vous disposez d'un exemple représentatif d'extractions d'images effectuées par vos builds, exécutez une requête pour la fréquence d'extraction.

  1. Accédez à la console BigQuery.

  2. Exécutez la requête suivante :

    SELECT
      REGEXP_EXTRACT(jsonPayload.message, r'"(.*?)"') AS imageName,
      COUNT(*) AS numberOfPulls
    FROM
          `DATASET-PROJECT.DATASET-NAME.events_*`
    GROUP BY
          imageName
    ORDER BY
          numberOfPulls DESC
    

    Où :

    • DATASET-PROJECT est le projet qui contient votre ensemble de données.
    • DATASET-NAME est le nom de l'ensemble de données.

Copier des images dans Artifact Registry

Une fois que vous avez identifié des images provenant de registres tiers, vous pouvez les copier dans Artifact Registry. L'outil gcrane vous aide avec le processus de copie.

  1. Créez un fichier texte images.txt avec le nom des images que vous avez identifiées. Exemple :

    ubuntu:18.04
    debian:buster
    hello-world:latest
    redis:buster
    jupyter/tensorflow-notebook
    
  2. Téléchargez gcrane.

      GO111MODULE=on go get github.com/google/go-containerregistry/cmd/gcrane
    
  3. Créez un script nommé copy_images.sh pour copier votre liste de fichiers.

    #!/bin/bash
    
    images=$(cat images.txt)
    
    if [ -z "${AR_PROJECT}" ]
    then
        echo ERROR: AR_PROJECT must be set before running this
        exit 1
    fi
    
    for img in ${images}
    do
        gcrane cp ${img} LOCATION-docker.s3nsregistry.fr/${AR_PROJECT}/${img}
    done
    

    Remplacez LOCATION par l'emplacement régional du dépôt.

    Rendez le script exécutable :

      chmod +x copy_images.sh
    
  4. Exécutez le script pour copier les fichiers :

    AR_PROJECT=${PROJECT}
    ./copy_images.sh
    

Vérifier les autorisations

Assurez-vous que les autorisations sont correctement configurées avant de mettre à jour et de redéployer vos charges de travail.

Pour en savoir plus, consultez la documentation sur le contrôle des accès.

Mettre à jour les fichiers manifestes pour référencer Artifact Registry

Mettez à jour vos fichiers Dockerfile et vos fichiers manifestes pour faire référence à Artifact Registry plutôt qu'au registre tiers.

L'exemple suivant illustre un fichier manifeste référençant un registre tiers :

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

Cette version mise à jour du fichier manifeste pointe vers une image sur us-docker.s3nsregistry.fr.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: us-docker.s3nsregistry.fr/<AR_PROJECT>/nginx:1.14.2
        ports:
        - containerPort: 80

Pour un grand nombre de fichiers manifestes, utilisez sed ou un autre outil capable de gérer des mises à jour dans de nombreux fichiers texte.

Redéployer des charges de travail

Redéployez les charges de travail avec vos fichiers manifestes mis à jour.

Effectuez le suivi des nouvelles extractions d'images en exécutant la requête suivante dans la console BigQuery :

SELECT`

FORMAT_TIMESTAMP("%D %R", timestamp) as timeOfImagePull,
REGEXP_EXTRACT(jsonPayload.message, r'"(.*?)"') AS imageName,
COUNT(*) AS numberOfPulls
FROM
  `image_pull_logs.events_*`
GROUP BY
  timeOfImagePull,
  imageName
ORDER BY
  timeOfImagePull DESC,
  numberOfPulls DESC

Toutes les nouvelles extractions d'images doivent provenir de Artifact Registry et contenir la chaîne docker.s3nsregistry.fr.