Transférer et extraire des images de conteneur à partir d'un cluster

Les artefacts système existent dans Artifact Registry du cluster d'infrastructure de l'organisation. Lorsqu'un administrateur de plate-forme (PA) crée une organisation dans l'appliance Google Distributed Cloud (GDC) isolée, tous les artefacts système sont répliqués à partir du cluster d'infrastructure de l'organisation.

L'opérateur d'infrastructure (IO) doit transférer les nouveaux artefacts système vers le cluster d'infrastructure de l'organisation. L'envoi de nouveaux artefacts système ne se produit que lorsque l'AP demande l'activation de fonctionnalités facultatives ou lorsque le système présente des bugs ou des pannes que vous pouvez corriger en appliquant des correctifs à de nouveaux artefacts.

Avant de commencer

Pour obtenir les autorisations nécessaires pour accéder aux ressources dans les projets Artifact Registry système en tant qu'administrateur, demandez à votre Administrateur de sécurité de vous accorder les rôles suivants en fonction du cluster dans lequel vous souhaitez transférer l'image de conteneur.

Après avoir obtenu les autorisations nécessaires, suivez les étapes ci-dessous avant de transférer une image vers Artifact Registry système du cluster d'infrastructure :

  1. Téléchargez et installez Distributed Cloud CLI en suivant les instructions de l'interface de ligne de commande (CLI) gdcloud.

  2. Installez le composant docker-credential-gdcloud en suivant les instructions de la section Installer des composants :

    gdcloud components install docker-credential-gdcloud
    
  3. Se connecter avec le fournisseur d'identité configuré :

    gdcloud auth login
    
  4. Exportez le fichier kubeconfig :

    gdcloud clusters get-credentials CLUSTER_NAME
    

    Remplacez CLUSTER_NAME par le nom du cluster.

  5. Configurez Docker :

    gdcloud auth configure-docker
    

Télécharger une image de conteneur à partir d'un bucket de stockage

Suivez les instructions de cette section lorsque l'administrateur de parc informatique demande à télécharger l'image à partir d'un bucket de stockage et à l'importer dans le système Artifact Registry. L'administrateur de projet doit fournir des informations telles que les noms du projet et du bucket.

En tant qu'IO, vous avez besoin d'autorisations pour télécharger l'image de conteneur à partir du bucket de stockage :

  • Demandez à votre Administrateur de sécurité de vous attribuer le rôle Lecteur des objets du bucket de projet (project-bucket-object-viewer) dans l'espace de noms du projet.

Pour en savoir plus, consultez le runbook IAM R0005.

Vous bénéficiez d'un accès en lecture seule au bucket du projet et aux objets qu'il contient.

Une fois les autorisations nécessaires obtenues, suivez ces étapes pour télécharger l'image de conteneur à partir du bucket de stockage de l'espace de noms du projet PA :

  1. Demandez à l'assistant personnel le nom secret du bucket. Le nom du secret ressemble à l'exemple suivant :

    object-storage-key-std-user-ID
    

    Le nom du secret inclut une valeur ID unique pour accéder au bucket.

  2. Copiez le nom secret du bucket.

  3. Obtenez les identifiants d'accès au bucket et configurez la CLI gdcloud :

    SECRET_NAME=SECRET_NAME ACCESS_KEY=$(kubectl get secret ${SECRET_NAME} -n object-storage-access-keys -o=jsonpath='{.data.access-key-id}' | base64 -d)
    SECRET_KEY=$(kubectl get secret ${SECRET_NAME} -n object-storage-access-keys -o=jsonpath='{.data.secret-access-key}' | base64 -d)
    S3_ENDPOINT=objectstorage.$(kubectl get configmap dnssuffix -n gpc-system -o jsonpath='{.data.dnsSuffix}')
    
    echo "Access Key: ${ACCESS_KEY}" \
    && echo "Secret Key: ${SECRET_KEY}" \
    && echo "S3 Endpoint: ${S3_ENDPOINT}"
    
    gdcloud config set storage/s3_access_key_id ${ACCESS_KEY}
    gdcloud config set storage/s3_secret_access_key ${SECRET_KEY}
    gdcloud config set storage/s3_endpoint ${S3_ENDPOINT}
    

    Remplacez SECRET_NAME par la valeur que vous avez copiée à l'étape précédente.

  4. Téléchargez l'image de conteneur depuis le bucket de stockage vers votre poste de travail :

    gdcloud cp s3://BUCKET_NAME/g/CONTAINER_IMAGE_NAME
    

    Remplacez les éléments suivants :

    • BUCKET_NAME : nom du bucket de stockage contenant l'image de conteneur. Ce nom est fourni par l'autorité de certification.
    • CONTAINER_IMAGE_NAME : nom du fichier image de conteneur que vous souhaitez télécharger depuis le bucket de stockage.

Transférer l'image vers le registre d'artefacts système

Suivez ces étapes pour transférer le fichier de l'image de conteneur que vous avez sur votre poste de travail vers le système Artifact Registry sur le serveur de l'API Management :

  1. Ouvrez la console.

  2. Obtenez le chemin d'accès au point de terminaison System Artifact Registry du cluster dans lequel vous souhaitez transférer l'image de conteneur :

    export REGISTRY_ENDPOINT=harbor.$(kubectl get configmap dnssuffix -n gpc-system -o jsonpath='{.data.dnsSuffix}')
    
  3. Chargez, taguez et transférez l'image de conteneur vers le point de terminaison System Artifact Registry du cluster :

    docker load --input CONTAINER_IMAGE_PATH
    
    docker tag CONTAINER_IMAGE_PATH ${REGISTRY_ENDPOINT}/CONTAINER_IMAGE_PATH
    
    docker push ${REGISTRY_ENDPOINT}/CONTAINER_IMAGE_PATH
    

    Remplacez CONTAINER_IMAGE_PATH par le chemin d'accès au fichier image du conteneur dans votre système de fichiers local. Une valeur valide pour ce chemin d'accès est, par exemple, oracle_db.tar.

Extraire un artefact Harbor

Dans la plupart des cas, le système GDC interagit automatiquement avec le registre des artefacts système (SAR) pour extraire le dernier artefact de Harbor. Dans certains cas extrêmes, vous pouvez effectuer cette opération manuellement. Pour extraire manuellement l'image de l'artefact depuis Harbor :

  1. Définissez les détails de l'artefact que vous définissez pour chaque application :

    APP_NAME=APP
    HARBOR_PROJECT=HARBOR_PROJECT_NAME
    REPOSITORY=REPOSITORY
    

    Remplacez les éléments suivants :

    • APP : nom de l'application.
    • HARBOR_PROJECT_NAME : nom du projet Harbor.
    • REPOSITORY : nom du dépôt
  2. Obtenez les informations Harbor :

    HARBOR_URL=$(kubectl --kubeconfig=${ADMIN_KUBECONFIG} get harborcluster harbor -n harbor-system -o=jsonpath='{.spec.externalURL}')
    HARBOR_IP=${HARBOR_URL#https://}
    
  3. Obtenez le tag de l'artefact. Il existe deux méthodes pour récupérer le tag :

    • Méthode 1 : il s'agit de l'option recommandée.

      1. Répertoriez les artefacts dans le bundle local et obtenez le tag correspondant :
      TAG=$(gdcloud artifacts tree ${BUNDLE_SUB_FOLDER:?} | grep ${HARBOR_PROJECT:?}/${REPOSITORY:?} | cut -d ":" -f2 | grep -v '.sig')
      
    • Deuxième méthode : n'utilisez cette méthode que si la première ne fonctionne pas comme prévu :

      1. Répertoriez les tags dans Harbor et sélectionnez le plus récent :

          ADMIN_PASS=$(kubectl --kubeconfig=${ADMIN_KUBECONFIG} -n harbor-system get secret harbor-admin -o jsonpath="{.data.secret}" | base64 -d)
        
          curl -k -X GET \
            --header 'Accept: application/json' \
            --header "authorization: Basic $(echo -n admin:${ADMIN_PASS:?} | base64)" \
          "${HARBOR_URL}/api/v2.0/projects/${HARBOR_PROJECT:?}/repositories/${REPOSITORY:?}/artifacts?with_tag=true" | jq -r '.[] | select(.tags != null) | .tags[] | {tag: .name, updated:.push_time}'
        

        Votre résultat doit ressembler à l'exemple suivant :

        {
          "tag": "<tag1>",
          "updated": "<date1>"
        }
        {
          "tag": "<tag2>",
          "updated": "<date2>"
        }
        
      2. Exportez la valeur du tag avec l'heure de mise à jour la plus récente :

        TAG=MOST_RECENT_TAG
        

        Remplacez MOST_RECENT_TAG par le tag dont l'heure de mise à jour est la plus récente.

  4. Téléchargez les artefacts depuis Harbor :

    gdcloud artifacts pull --single-manifest-repo \
    ${HARBOR_IP:?}/${HARBOR_PROJECT:?}/${REPOSITORY:?}:${TAG:?} \
    ${APP_NAME:?}-${TAG:?}
    

    Si le message d'erreur suivant s'affiche, vous pouvez l'ignorer en toute sécurité :

    tee: '/root/logs/artifacts_pull_--single-manifest-repo_2023.07.13:14.59.24.log': Permission denied
    

Problèmes connus

Plusieurs problèmes connus sont associés à l'extraction de l'artefact Harbor :

  • Vous devrez peut-être ajouter l'argument --kubeconfig ${INFRA_ORG_KUBECONFIG:?}.
  • La commande curl peut afficher le message d'erreur suivant : certificate signed by unknown authority. Pour résoudre cette erreur, utilisez l'une des méthodes suivantes :

    • Solution temporaire : ajoutez l'option --insecure à la commande gdcloud artifacts pull.
    • Solution fiable : faites confiance au CA de l'infrastructure de l'organisation. Pour en savoir plus, consultez Erreur d'extraction d'image.
  • Vous devrez peut-être extraire le contenu :

    gdcloud artifacts extract ${APP_NAME:?}-${TAG:?} ${APP_NAME:?}-${TAG:?}-extracted