Configuration d'un registre d'images

Les clusters Red Hat® OpenShift® on IBM Cloud® incluent un registre interne pour construire, déployer et gérer localement des images de conteneur. Pour qu'un registre privé puisse gérer et contrôler l'accès aux images dans votre entreprise, vous pouvez également configurer votre cluster pour qu'il utilise IBM Cloud® Container Registry.

Choix d'une solution de registre d'images

Vos images de conteneurs doivent être stockées dans un registre de conteneurs accessible à votre cluster afin de pouvoir y déployer des applications. Vous pouvez choisir d'utiliser le registre intégré de votre cluster Red Hat OpenShift, un registre privé avec accès réservé à des utilisateurs sélectionnés ou un registre public. Consultez le tableau suivant afin de choisir la meilleure option pour votre cas d'utilisation.

Registre Red Hat OpenShift Container Registry (OCR) interne

Votre cluster est configuré avec le registre d'images Red Hat OpenShift Container Registry interne pour qu'Red Hat OpenShift puisse générer, déployer et gérer automatiquement le cycle de vie de vos applications depuis le cluster. Les images sont stockées dans une unité de stockage de fichiers IBM Cloud classique qui est mise à disposition lors de la phase de création du cluster. Si vous avez besoin de plus de stockage, vous pouvez redimensionner cette unité. Cas d'utilisation :

  • Flux d'images Red Hat OpenShift natives, génération et déploiement d'application traités par cluster.
  • Partage possible des images entre tous les projets au sein du cluster, avec accès contrôlé via des rôles RBAC.
  • Intégration du registre interne à d'autres produits Red Hat, tels que CloudForms pour obtenir des fonctions étendues, comme par exemple l'analyse de vulnérabilité.
  • Option permettant d'exposer le registre interne avec une route afin que les utilisateurs puissent extraire des images du registre sur le réseau public.
  • Option permettant de configurer le registre interne en vue d'extraire des images d'un registre privé tel qu'IBM Cloud Container Registry ou d'envoyer des images vers ce dernier.

Pour plus d'informations, voir Utilisation du registre interne.

Registre privé

Les registres privés sont un bon choix pour protéger vos images contre les utilisateurs non autorisés. Les registres privés peuvent être configurés par l'administrateur du cluster pour garantir que l'accès, les quotas de stockage, la sécurisation des images et d'autres fonctions fonctionnent comme prévu. Par défaut, votre cluster Red Hat OpenShift est intégré à la propriété IBM Cloud Container Registry privée via des secrets d'extraction d'image dans le projet default. IBM Cloud Container Registry est un registre privé multi-locataires hautement disponible pour stocker vos propres images. Vous pouvez également extraire des images fournies par IBM dans le registre icr.io global, ainsi que des logiciels sous licence depuis le registre habilité. IBM Cloud Container Registry vous permet de gérer des images pour plusieurs clusters grâce à l'intégration à IBM Cloud IAM et à la facturation. Avantages liés à l'utilisation d'IBM Cloud Container Registry avec le registre interne :

  • Mise en cache d'images locales pour des générations plus rapides via le registre interne.
  • Le flux d'images est visible pour les déploiements dans d'autres projets, si bien que vous n'avez pas à copier les secrets d'extraction dans chaque projet.
  • Partage des images entre plusieurs clusters sans avoir à insérer ces images dans plusieurs registres.
  • Analyse automatique de vulnérabilité des images.
  • Contrôle d'accès via des règles IBM Cloud IAM et des registres régionaux distincts.
  • Conservation des images sans nécessiter d'espace de stockage dans votre cluster ou d'unité de stockage associée. Vous pouvez également définir des règles pour gérer la quantité d'images afin d'éviter qu'elles n'occupent trop d'espace.
  • Infrastructure VPC : utilisation du point de terminaison du service de registre privé afin que les clusters qui utilisent uniquement un point de terminaison de service de cloud privé puissent toujours accéder au registre.
  • Définition de quotas de stockage et de trafic d'extraction d'images pour mieux contrôler le stockage, l'utilisation et la facturation des images.
  • Extraction de contenu IBM sous licence à partir du registre autorisé.

Pour commencer, consultez les rubriques suivantes :

Registre public

Les registres publics tels que Docker Hub constituent un moyen de partager des images entre les équipes, les entreprises, les clusters ou les fournisseurs de cloud. Certains registres publics peuvent également offrir un composant de registre privé. Cas d'utilisation :

  • Insertion et extraction d'images sur le réseau public.
  • Test rapide d'un conteneur entre les fournisseurs de cloud.
  • Disparition du besoin de fonctionnalités de niveau entreprise telles que l'évaluation des vulnérabilités ou la gestion des accès.

Pour plus d'informations, consultez la documentation relative aux registres publics, comme Quay ou Docker Hub.

Stockage d'images dans les registres internes

Les clusters Red Hat OpenShift ont par défaut un registre interne. Les images contenues dans le registre interne sont sauvegardées, mais elles varient en fonction du fournisseur d'infrastructure de votre cluster Red Hat OpenShift on IBM Cloud.

Clusters classiques
Votre cluster Red Hat OpenShift est configuré par défaut avec un registre interne qui utilise File Storage for Classic comme stockage sous-jacent. Lorsque vous supprimez le cluster, le registre interne et ses images sont également supprimés. Si vous voulez conserver vos images, pensez à utiliser un registre privé, tel qu'IBM Cloud Container Registry, à sauvegarder vos images dans un stockage persistant, par exemple, Object Storage, ou à créer un cluster OCR (Red Hat OpenShift Container Registry) autonome distinct. Pour plus d'informations, voir la documentationRed Hat OpenShift.
Clusters de VPC
Le registre interne de votre cluster Red Hat OpenShift sauvegarde vos images dans un compartiment créé automatiquement au sein d'une instance IBM Cloud Object Storage de votre compte. Les données stockées dans le compartiment de stockage d'objets sont conservées même si vous supprimez le cluster. Une fois le cluster créé, vous ne pouvez plus supprimer ni dissocier le compartiment « IBM Cloud Object Storage » du cluster. Si vous prévoyez de créer un cluster sans registre interne s'appuyant sur COS, par exemple pour les environnements Financial Services Cloud d' IBM, vous devez omettre l'instance COS lors de la création du cluster. Pour plus d'informations, consultez la section « Création d'un cluster VPC sans compartiment Object Storage ».
Clusters Classic, VPC ou Satellite
Vous pouvez, si vous le souhaitez, configurer le registre interne pour qu’il stocke les données dans le répertoire « emptyDir » du nœud de travail sur lequel s’exécute le pod du registre interne. N'oubliez pas que ces données ne sont pas persistantes et qu'en cas de redémarrage du pod ou du noeud worker, les données stockées sont supprimées et irrécupérables. Vous pouvez stocker les images en local dans emptyDir afin d'améliorer les performances si vous générez régulièrement des conteneurs à partir d'images volumineuses.

Sauvegarder votre registre d'images interne vers IBM Cloud Object Storage

Cloud privé virtuel

Vos images dans votre registre d'images interne Red Hat OpenShift sont automatiquement sauvegardées dans un compartiment IBM Cloud Object Storage. Les données stockées dans le compartiment de stockage d'objets sont conservées même si vous supprimez le cluster.

Toutefois, si la création du compartiment échoue lorsque vous créez votre cluster, vous devez créer manuellement un compartiment et configurer votre cluster pour utiliser le compartiment. Entre-temps, le registre interne utilise un volume Kubernetes emptyDir qui stocke vos images de conteneur sur le disque secondaire de votre noeud worker. Les volumes emptyDir ne sont pas considérés comme des volumes persistants hautement disponibles, et si vous supprimez les pods qui utilisent l'image, celle-ci est automatiquement supprimée.

Pour créer manuellement un compartiment pour votre registre interne, voir Erreur lors de la création de cluster relative au compartiment de stockage d'objets Cloud.

Configuration d'un seau COS pour le registre de votre cluster

Vous pouvez configurer manuellement un seau IBM Cloud Object Storage pour le registre d'images interne de votre cluster. Cette fonction est utile lorsque vous devez configurer ou reconfigurer le backend de stockage du registre.

Avant de commencer

Configuration du seau COS

  1. Définissez les variables d'environnement pour votre cluster et votre instance Object Storage.

    export CLUSTER_NAME=<cluster_name>
    export COS_INSTANCE_ID=<cos_instance_id>
    export CLUSTER_ID=$(ibmcloud ks cluster get --cluster $CLUSTER_NAME --json | jq -r .id)
    
  2. Vérifier la configuration actuelle de l'opérateur du registre d'images.

    oc get configs.imageregistry.operator.openshift.io/cluster -o yaml
    
  3. Mettre temporairement l'opérateur en mode Removed. Si le registre est déjà actif, désactivez-le pour éviter les conflits.

    oc patch configs.imageregistry.operator.openshift.io/cluster \
    --type=merge -p '{"spec":{"managementState":"Removed"}}'
    
  4. Vérifiez si le registre utilise emptyDir, ce qui signifie qu'aucun godet COS n'est configuré.

    storage:
      emptyDir: {}
      managementState: Managed
    
  5. Créez un seau Object Storage pour votre cluster. Remplacez <region> par la région de votre choix, par exemple us-south ou eu-de.

    RANDOM_SUFFIX=$(LC_ALL=C tr -dc 'a-z0-9' </dev/urandom | head -c 6)
    COS_BUCKET_NAME="roks-${CLUSTER_ID}-${RANDOM_SUFFIX}"
    ibmcloud cos bucket-create \
      --bucket "$COS_BUCKET_NAME" \
      --ibm-service-instance-id "$COS_INSTANCE_ID" \
      --class standard \
      --region <region>
    
  6. Supprimer le champ emptyDir de la configuration du registre.

    oc patch configs.imageregistry.operator.openshift.io/cluster \
      --type=json \
      -p '[{"op": "remove", "path": "/spec/storage/emptyDir"}]'
    
  7. Configurer le registre pour utiliser le stockage S3 ( Object Storage ). Mettez à jour les valeurs region et regionEndpoint pour qu'elles correspondent à la région de votre seau.

    oc patch configs.imageregistry.operator.openshift.io/cluster --type=merge -p "$(cat <<EOF
    {
    "spec": {
      "managementState": "Unmanaged",
        "storage": {
          "s3": {
            "bucket": "$COS_BUCKET_NAME",
            "region": "<region>-standard",
            "regionEndpoint": "https://s3.direct.<region>.cloud-object-storage.appdomain.cloud",
            "trustedCA": {
              "name": ""
            },
            "virtualHostedStyle": false
          }
        }
      }
    }
    EOF
    )"
    

    Par exemple, si votre seau se trouve à l'adresse eu-de, utilisez region: "eu-de-standard" et regionEndpoint: "https://s3.direct.eu-de.cloud-object-storage.appdomain.cloud".

  8. Vérifiez la configuration de l'opérateur du registre d'images.

    oc get configs.imageregistry.operator.openshift.io/cluster -o yaml
    
  9. Créez une clé d'identification de service pour l'instance COS et extrayez les identifiants HMAC.

    ibmcloud resource service-key-create roks-$CLUSTER_ID-key \
    --instance-id "$COS_INSTANCE_ID" \
    -p '{"HMAC": true}' \
    -o json > service-key.json
    # Extract values with jq
    ACCESS_KEY=$(jq -r '.credentials.cos_hmac_keys.access_key_id' service-key.json)
    SECRET_KEY=$(jq -r '.credentials.cos_hmac_keys.secret_access_key' service-key.json)
    # Create credentials file
    cat <<EOF > creds.txt
    [default]
    aws_access_key_id = $ACCESS_KEY
    aws_secret_access_key = $SECRET_KEY
    EOF
    

    Cela crée un fichier creds.txt avec vos informations d'identification Object Storage.

    Exemple de fichier d'identification

    [default]
    aws_access_key_id = f1ab5fcf7XXXXXXXXXb2a14e046
    aws_secret_access_key = 4c78ddfa763XXXXXXX23d1cc9350d1
    
  10. Créez le secret image-registry-private-configuration-user s'il n'existe pas.

    oc create secret generic image-registry-private-configuration-user -n openshift-image-registry
    
  11. Mettez à jour le secret avec les données d'accès.

    oc patch secret image-registry-private-configuration-user \
    -n openshift-image-registry \
    --type merge \
    -p "{
        \"data\": {
        \"REGISTRY_STORAGE_S3_ACCESSKEY\": \"$(echo -n "$ACCESS_KEY" | base64)\",
        \"REGISTRY_STORAGE_S3_SECRETKEY\": \"$(echo -n "$SECRET_KEY" | base64)\"
        }
    }"
    
  12. Créez le secret image-registry-private-configuration s'il n'existe pas.

    oc create secret generic image-registry-private-configuration -n openshift-image-registry
    
  13. Mettre à jour le secret du registre de l'image principale avec le fichier d'informations d'identification complet Object Storage.

    CREDENTIALS_B64=$(base64 -i creds.txt | tr -d '\n')
    oc patch secret image-registry-private-configuration \
    -n openshift-image-registry \
    --type merge \
    -p "{\"data\": {\"credentials\": \"${CREDENTIALS_B64}\"}}"
    
  14. Réglez l'opérateur de registre d'images sur le mode Managed.

    oc patch configs.imageregistry.operator.openshift.io/cluster \
    --type=merge -p '{"spec":{"managementState":"Managed"}}'
    
  15. Redémarrer le déploiement du registre d'images.

    oc rollout restart deployment image-registry -n openshift-image-registry
    
  16. Vérifiez que le registre est sain.

    oc get clusteroperator image-registry
    

Dépannage de la configuration du registre COS

Si vous rencontrez des problèmes avec la configuration du registre de Object Storage, essayez les étapes de dépannage suivantes.

  1. Vérifiez que le pod « image-registry » est en cours d'exécution.

    oc project openshift-image-registry
    oc get pods
    

    Exemple de sortie

    NAME                              READY   STATUS    RESTARTS   AGE
    image-registry-7d8b57c98f-m92t7   1/1     Running   0          3h53m
    node-ca-62p88                     1/1     Running   0          5h12m
    node-ca-6s8vx                     1/1     Running   0          5h17m
    node-ca-b5jwl                     1/1     Running   0          4h56m
    node-ca-chl7k                     1/1     Running   0          5h17m
    node-ca-l6tlb                     1/1     Running   0          4h55m
    node-ca-q4vw8                     1/1     Running   0          4h55m
    
  2. Vérifier l'état de l'opérateur du cluster image-registry.

    oc describe clusteroperator image-registry
    
  3. Si nécessaire, supprimez temporairement la configuration du backend S3 et revenez à emptyDir pour déverrouiller l'opérateur.

    oc patch configs.imageregistry.operator.openshift.io/cluster --type=merge -p '{
    "spec": {
        "managementState": "Managed",
        "storage": {
          "emptyDir": {}
        }
    }
    }'
    
  4. Vérifier les pods dans l'espace de noms openshift-image-registry.

    oc get pods -n openshift-image-registry
    
  5. Vérifiez les variables d'environnement de la configuration déployée.

    oc get pod -n openshift-image-registry -l docker-registry=default -o jsonpath='{.items[0].spec.containers[0].env}' | jq
    

Pour plus d'informations sur la configuration du registre, voir Configuration du registre.

Stockage d'images dans le registre interne dans des clusters classiques

Par défaut, le registre interne de votre cluster « Red Hat OpenShift » utilise un IBM Cloud File Storage for Classic volume pour stocker les images du registre. Vous pouvez vérifier ou mettre à jour la taille par défaut du volume de stockage.

Affichage des détails de volume

Pour afficher les détails du volume, y compris la classe et la taille de stockage, vous pouvez décrire la réservation de volume persistant (PVC).

oc describe pvc -n openshift-image-registry image-registry-storage

Modification des détails du volume

Si votre registre nécessite davantage de gigaoctets de stockage pour vos images, vous pouvez redimensionner le volume de stockage de fichiers. Pour plus d'informations, voir Modification de la taille et du nombre d'opérations d'entrée-sortie par seconde (IOPS) de votre unité de stockage. Lorsque vous redimensionnez le volume dans votre compte d'infrastructure IBM Cloud, la description de PVC associée n'est pas mise à jour. À la place, vous pouvez vous connecter au podopenshift-image-registry qui utilise le PVC registry-backingpour vérifier que le volume est redimensionné.

Stockage d'images dans le répertoire vide de noeud worker

Vous pouvez stocker les images du registre interne en local dans le répertoire emptyDir du noeud worker, par exemple un noeud worker bare metal, pour améliorer les performances si vous générez régulièrement des conteneurs à partir d'images volumineuses.

N'oubliez pas que ces données ne sont pas persistantes et qu'en cas de redémarrage du pod ou du noeud worker, les données stockées sont supprimées et irrécupérables.

  1. Accédez à votre cluster Red Hat OpenShift.

  2. Mettre à jour le configmap de l'opérateur du registre d'images pour que le stockage utilise le site emptyDir du nœud de travail. Notez que la mise à jour de la mappe de configuration pour utiliser emptyDir ne supprime pas la réservation de volume persistant d'origine du registre d'images.

    oc patch configs.imageregistry.operator.openshift.io/cluster --type merge --patch '{"spec":{"storage":{"emptyDir":{}}}}'
    
  3. Si l'état de gestion de l'opérateur du registre d'images est défini sur « Unmanaged » (Récupération en cours), comme c'est le cas dans les clusters « Satellite », mettez à jour l'état de gestion en le définissant sur « Managed » (Récupération terminée). Maintenant, l'opérateur met à jour le pod du registre interne.

    oc patch configs.imageregistry.operator.openshift.io/cluster --type merge -p '{"spec":{"managementState":"Managed"}}'
    
  4. Obtenez les détails du pod du registre interne pour vérifier vos mises à jour.

    1. Vérifiez que le pod image-registry est en cours d'exécution et qu'un pod s'exécute par noeud worker dans le cluster.
        oc get pods -n openshift-image-registry
        ```
        Exemple de sortie
    
        ```sh {: screen}
        NAME                                               READY   STATUS    RESTARTS   AGE
        cluster-image-registry-operator-695bf78ffc-zvkhd   2/2     Running   0          33m
        image-registry-6774598589-65cnx                    1/1     Running   0          112s
        node-ca-gg66r                                      1/1     Running   0          113s
        node-ca-n8jpq                                      1/1     Running   0          113s
        node-ca-p2d7j                                      1/1     Running   0          113s
        ```
    1. Récupérez l'adresse IP publique du **noeud** sur lequel s'exécute le pod `image-registry`.
    
    ```sh {: pre}
        oc describe pod -n openshift-image-registry <image-registry-pod> | grep Node
        ```
        Exemple de sortie
    
        ```sh {: screen}
        Node:               169.xx.xxx.xxx/169.xx.xxx.xxx
        ```
        Si l'adresse IP du poste de travail est privée, exécutez `ibmcloud oc worker ls -c <cluster> | grep <private_IP>` et notez l'adresse IP publique correspondante.
        {: tip}
    
    1. Récupérez l'**UID** du pod `image-registry` dans la section `metadata.uid` du fichier YAML du pod (et non pas l'UID de la réplique défini dans la section `metadata.ownerReferences.uid`).
    
    ```sh {: pre}
        oc get pod -n openshift-image-registry <image-registry-pod> -o yaml
        ```
        Exemple de sortie
    
        ```yaml {: screen}
        apiVersion: v1
        kind: Pod
        metadata:
            uid: e8d7718d-b0bd-47e2-9aaa-05f3a608fd9b
        ...
        ```
    
  5. Vérifiez que le registre interne stocke les données dans le répertoire emptyDir du noeud worker.

    1. Accédez directement au registre depuis le cluster, en utilisant le nœud de travail que vous avez récupéré précédemment. Suivez les étapes d'insertion d'une image de test dans le registre interne.

      Pour exécuter ces étapes de la documentation Red Hat OpenShift, vous avez besoin de l'outil d'interface de ligne de commande podman. Il est possible que vos noeuds worker ne disposent pas par défaut de cet outil d'interface CLI. Consultez le guide Podman d'installation pour connaître les versions RHEL disponibles.

    2. Accédez au dossier de pod du registre interne qui sauvegarde dans le répertoire emptyDir. Pour <pod_uid>, utilisez le pod UID que vous avez extrait précédemment.

        cd var/lib/kubelet/pods/<pod_uid>/volumes/kubernetes.io~empty-dir/registry-storage/docker/registry/v2/repositories/openshift
        ```
    1. Vérifiez que votre image se trouve dans le répertoire du référentiel.
    ```sh {: pre}
        ls
        ```
        Exemple de sortie
        ```sh {: screen}
        <myimage>  nginx  ...
        ```
    
    

Suppression du registre d'images interne

Cloud privé virtuel

Les déploiements d'opérateurs de registre d'images ne sont présents que dans les Red Hat OpenShift on IBM Cloud clusters gérés par Toolkit. HyperShift Les clusters gérés exécutent l'opérateur du registre d'images dans le plan de contrôle.

Si vous ne souhaitez pas utiliser le registre d'images interne, vous pouvez effectuer les étapes suivantes pour le supprimer.

  1. Sauvegardez une copie de vos configurations de registre interne.
    oc get configs.imageregistry.operator.openshift.io cluster -o yaml > configs.yaml
    
  2. Exécutez la commande de correctif suivante pour remplacer l'état de gestion du registre d'images par Removed.
    kubectl patch configs.imageregistry.operator.openshift.io cluster -p '{"spec":{"managementState":"Removed"}}' --type='merge'
    
  3. Une fois l'état de gestion modifié, le service de registre d'images et le déploiement sont supprimés de l'espace de nom openshift-image-registry dans votre cluster. Vous pouvez exécuter les commandes suivantes pour vérifier qu'elles ont été supprimées. Notez que seuls le déploiement et le service du registre d'images sont supprimés. Le déploiement et le service de l'opérateur du registre d'images sont conservés.
    oc get deployment -n openshift-image-registry
    
    oc get svc -n openshift-image-registry
    

Configuration d'une route externe sécurisée pour le registre interne

Par défaut, votre cluster Red Hat OpenShift dispose d'un registre interne disponible via un service avec une adresse IP interne. Si vous souhaitez rendre le registre interne disponible sur le réseau public, vous pouvez configurer une route de nouveau chiffrement sécurisée. Par exemple, vous pouvez configurer le registre interne de votre cluster de sorte qu'il agisse en tant que registre public pour les déploiements dans d'autres projets ou clusters.

Avant de commencer :

Pour utiliser le registre interne, configurez une route publique pour accéder au registre. Créez ensuite un secret d'extraction d'image incluant les données d'identification permettant d'accéder au registre de sorte que les déploiements dans d'autres projets puissent extraire des images de ce registre.

  1. A partir du projet openshift-image-registry, assurez-vous que le service image-registry existe pour le registre interne.

    oc get svc -n openshift-image-registry
    

    Exemple de sortie

    NAME                      TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)                      AGE
    image-registry            ClusterIP      172.21.xxx.xxx    <none>          5000/TCP                     36d
    image-registry-operator   ClusterIP      None             <none>          60000/TCP                     36d
    
  2. Créez une route sécurisée pour le service image-registry qui utilise la terminaison TLS reencrypt. Grâce au nouveau chiffrement, le routeur arrête la connexion TLS associée à un certificat, puis chiffre à nouveau la connexion au registre interne avec un autre certificat. Avec cette approche, le chemin complet de la connexion entre l'utilisateur et le registre interne est chiffré. Pour utiliser votre propre nom de domaine personnalisé, activez l'option « --hostname ».

    oc create route reencrypt --service=image-registry -n openshift-image-registry
    
  3. Extrayez le nom d'hôte (HOST/PORT) et le port (PORT) qui ont été affectés à la route image-registry.

    oc get route image-registry -n openshift-image-registry
    

    Exemple de sortie

    NAME              HOST/PORT                                                                                                  PATH      SERVICES          PORT       TERMINATION   WILDCARD
    image-registry   image-registry-openshift-image-registry.<cluster_name>-<ID_string>.<region>.containers.appdomain.cloud             image-registry   5000-tcp   reencrypt     None
    
  4. Modifiez la route afin de définir la stratégie d'équilibrage de charge sur « source » (transfert direct), de sorte que la même adresse IP client soit toujours dirigée vers le même serveur, comme dans une configuration de route de transfert direct. Vous pouvez définir la stratégie en ajoutant une annotation dans la section metadata.annotations : haproxy.router.openshift.io/balance: source. Vous pouvez éditer le fichier de configuration à partir de la console d'application Red Hat OpenShift ou de votre ligne de commande en exécutant la commande suivante :

    oc edit route image-registry -n openshift-image-registry
    

    Add the annotation.

    apiVersion: route.openshift.io/v1
    kind: Route
    metadata:
    annotations:
        haproxy.router.openshift.io/balance: source
    ...
    
  5. Si les règles réseau de l'entreprise empêchent l'accès depuis votre système local à des noeuds finaux publics via des proxys ou des pare-feux, autorisez l'accès au sous-domaine de route que vous créez pour le registre interne dans les étapes ci-après.

  6. Connectez-vous au registre interne en utilisant la route comme nom d'hôte.

    docker login -u $(oc whoami) -p $(oc whoami -t) image-registry-openshift-image-registry.<cluster_name>-<ID_string>.<region>.containers.appdomain.cloud
    
  7. Maintenant que vous êtes connecté, essayez d'envoyer un exemple d'application hello-world au registre interne.

    1. Extrayez l'image hello-world de DockerHub, ou générez une image sur votre machine locale.
        docker pull hello-world
        ```
    1. Attribuez à l'image locale une étiquette comportant le nom d'hôte de votre registre interne, le projet sur lequel vous souhaitez déployer l'image ainsi que le nom et l'étiquette d'image.
    
    ```sh {: pre}
        docker tag hello-world:latest image-registry-openshift-image-registry.<cluster_name>-<ID_string>.<region>.containers.appdomain.cloud/<project>/<image_name>:<tag>
        ```
    1. Envoyez l'image au registre interne de votre cluster.
    
    ```sh {: pre}
        docker push image-registry-openshift-image-registry.<cluster_name>-<ID_string>.<region>.containers.appdomain.cloud/<project>/<image_name>:<tag>
        ```
    4. Vérifiez que l'image est ajoutée au flux d'images Red Hat OpenShift.
    
    ```sh {: pre}
        oc get imagestream
        ```
        Exemple de sortie
    
        ```sh {: screen}
        NAME          DOCKER REPO                                                            TAGS      UPDATED
        hello-world   image-registry-openshift-image-registry.svc:5000/default/hello-world   latest    7 hours ago
        ```
    
  8. Pour permettre aux déploiements de votre projet d'extraire des images du registre interne, créez un secret d'extraction d'image dans votre projet qui détient les données d'identification permettant d'accéder à votre registre interne. Ajoutez ensuite le secret d'extraction d'image au compte de service par défaut pour chaque projet.

    1. Répertoriez les secrets d'extraction d'image utilisés par le compte de service par défaut et notez le secret qui commence par default-dockercfg.
        oc describe sa default
        ```
        Exemple de sortie
    
        ```sh {: screen}
        ...
        Image pull secrets:
        all-icr-io
        default-dockercfg-mpcn4
        ...
        ```
    1. Obtenez les informations sur le secret codé dans la zone `data` du fichier de configuration.
    
    ```sh {: pre}
        oc get secret <default-dockercfg-name> -o yaml
        ```
        Exemple de sortie
    
        ```yaml {: screen}
        apiVersion: v1
        data:
          .dockercfg: ey...=
        ```
    1. Décodez la valeur de la zone `data`.
    
    ```sh {: pre}
        echo "<ey...=>" | base64 -D
        ```
        Exemple de sortie
    
        ```sh {: screen}
        {"172.21.xxx.xxx:5000":{"username":"serviceaccount","password":"eyJ...
        ```
    4. Créez un nouveau secret d'extraction d'image pour le registre interne.
    
        - `secret_name` : donnez un nom à votre secret d'extraction d'image, par exemple `internal-registry`.
        - `--namespace` : entrez le projet dans lequel créer le secret d'extraction d'image, par exemple `default`.
        - `--docker-server`: Au lieu de l'adresse IP du service interne (`172.21.xxx.xxx:5000`), entrez le nom d'hôte de la route `image-registry` avec le port (`image-registry-openshift-image-registry.<cluster_name>-<ID_string>.<region>.containers.appdomain.cloud:5000`).
        - `--docker-username` : copiez la valeur `"username"` à partir du secret d'extraction d'image, par exemple `serviceaccount`.
        - `--docker-password` : copiez la valeur `"password"` à partir du secret d'extraction d'image précédent.
        - `--docker-email` : si vous possédez une adresse e-mail Docker, entrez-la. Dans le cas contraire, entrez une adresse e-mail fictive, telle que `a@b.c`. Cette adresse e-mail est obligatoire pour créer un secret Kubernetes, mais n'est plus utilisée une fois la valeur créée.
    
    ```sh {: pre}
        oc create secret docker-registry internal-registry --namespace default --docker-server image-registry-openshift-image-registry.<cluster_name>-<ID_string>.<region>.containers.appdomain.cloud:5000 --docker-username serviceaccount --docker-password <eyJ...> --docker-email a@b.c
        ```
    5. Ajoutez le secret d'extraction d'image au compte de service par défaut pour votre projet.
    
    ```sh {: pre}
        oc patch -n <namespace_name> serviceaccount/default --type='json' -p='[{"op":"add","path":"/imagePullSecrets/-","value":{"name":"<image_pull_secret_name>"}}]'
        ```
    6. Répétez ces étapes pour chaque projet pour lequel vous souhaitez extraire des images à partir du registre interne.
    
    

Maintenant que vous avez configuré le registre interne avec une route accessible, vous pouvez vous connecter au registre et y insérer ou en extraire des images. Pour plus d'informations, voir la documentationRed Hat OpenShift.

Importation d'images à partir d'IBM Cloud Container Registry dans le flux d'images du registre interne

Par défaut, votre cluster Red Hat OpenShift on IBM Cloud est configuré pour extraire des images des domaines IBM Cloud Container Registry icr.io privés distants dans le projet default. Vous pouvez importer une image depuis IBM Cloud Container Registry dans le registre interne de votre cluster Red Hat OpenShift en associant un tag à cette image en tant que flux d'images. Avec cette configuration, vous pouvez déployer des applications à partir de l'image en utilisant le cache local du registre interne, ce qui permet d'accélérer la génération des déploiements. De plus, les déploiements dans d'autres projets peuvent se référer au flux d'images afin que vous n'ayez pas à créer des données d'identification de secret d'extraction d'image pour IBM Cloud Container Registry dans chaque projet.

Si vous mettez à jour votre image dans IBM Cloud Container Registry, l'image n'est pas automatiquement extraite dans le registre interne de votre cluster Red Hat OpenShift. Vous pouvez également configurer une importation périodique ou répéter ces étapes pour ajouter un tag à l'image. En fonction de la stratégie d'extraction d'image que vous utilisez dans votre déploiement, vous devrez peut-être redémarrer votre déploiement.

Vous voulez en savoir plus sur la façon dont les générations, les flux d'images et le registre interne fonctionnent conjointement ? Lisez la Red Hat OpenShift documentation ou consultez ce blog sur la gestion des images de conteneurs.

  1. Accédez à votre cluster Red Hat OpenShift.

  2. Passez au projet default pour extraire votre image et l'insérer dans le flux d'images. Le projet default est déjà configuré avec des données d'identification permettant d'accéder aux registres icr.io.

    oc project default
    
  3. Répertoriez les images disponibles dans votre IBM Cloud Container Registry. Notez le référentiel et l'étiquette de l'image que vous souhaitez extraire dans le registre interne de votre cluster Red Hat OpenShift.

    ibmcloud cr images
    
  4. Balisez l'image pour l'extraire de votre espace de noms IBM Cloud Container Registry et l'insérer dans le registre interne en tant que flux d'images. Pour plus d'informations, consultez la documentation de Red Hat OpenShift ou exécutez oc tag --help.

    oc tag <region>.icr.io/<namespace>/<image>:<tag> default/<image>:<tag> --reference-policy=local [--scheduled]
    
    • <region>.icr.io/<namespace>/<image>:<tag>: Utilisez les informations relatives au référentiel et à la balise que vous avez précédemment récupérées pour renseigner les champs « IBM Cloud Container Registry » (région), « namespace » (espace de noms), « image » (image) et « tag name » (nom de la balise) correspondant à l'image que vous souhaitez récupérer.
    • default/<image>:<tag> : Entrez les informations relatives au flux d'images internes que vous créez à partir de l'image marquée IBM Cloud Container Registry. Ce flux d'images est à créer dans le projet default, qui est également le projet dans lequel le flux d'images est créé si vous ne spécifiez aucun projet. Les valeurs de : correspondent généralement à celles que vous avez récupérées précédemment.
    • --reference-policy=local : définissez cette valeur sur local pour qu'une copie de l'image provenant d'IBM Cloud Container Registry soit importée dans le cache local du registre interne et mise à la disposition des projets du cluster en tant que flux d'images. Si vous n'incluez pas cette valeur, le flux d'images se reporte à nouveau à IBM Cloud Container Registry lorsque vous l'utilisez dans vos déploiements et nécessite donc des données d'identification dans le projet.
    • --scheduled: Activez cette option facultative pour configurer l'importation périodique de l'image depuis IBM Cloud Container Registry vers le registre interne. La fréquence par défaut est de 15 minutes. Pour plus d'informations, voir la documentationRed Hat OpenShift.
  5. Vérifiez que votre flux d'images a été créé.

    oc get imagestreams
    
  6. Vérifiez que le flux d'images a réussi à extraire l'image d'IBM Cloud Container Registry. Dans la sortie, vérifiez que l'image de la dernière balise à partir de correspond à votre image * <region>.icr.io/<namespace>/<image>@<digest>.

    oc describe is/<imagestream>
    

    Exemple de sortie

    NAME:            <imagestream>
    Namespace:        default
    Created:        2 days ago
    Labels:            <none>
    Annotations:        openshift.io/image.dockerRepositoryCheck=2020-03-31T09:41:36Z
    Image Repository:    image-registry.openshift-image-registry.svc:5000/default/ant1
    Image Lookup:        local=false
    Unique Images:        1
    Tags:                1
    latest
        tagged from <region>.icr.io/<namespace>/<image>:<tag>
        * <region>.icr.io/<namespace>/<image>@<digest>
            2 days ago
    

Désormais, vos développeurs peuvent utiliser le flux d'images dans un déploiement d'application. L'image est générée à partir de l'image extraite localement dans le registre interne. Il n'est pas nécessaire de définir un secret d'extraction d'image dans le projet sur IBM Cloud Container Registry car le flux d'images est local pour le cluster.

Configuration de générations dans le registre interne pour envoyer des images vers IBM Cloud Container Registry

Lorsque vous créez une build dans votre Red Hat OpenShift on IBM Cloud cluster, vous pouvez configurer le registre interne pour pousser l'image vers votre référentiel externe dans IBM Cloud Container Registry. Par défaut, le secret d'extraction d'image dans le projet default de votre cluster ne dispose que d'un accès en lecture pour extraire des images depuis IBM Cloud Container Registry. Pour envoyer des images, vous devez ajouter un secret doté d'un accès en écriture.

  1. Accédez à votre cluster Red Hat OpenShift.

  2. Passez au projet default.

    oc project default
    
  3. Suivez les étapes de configuration d'une clé d'API IBM Cloud IAM avec les rôles d'accès au service Reader et Writer pour extraire et envoyer des images depuis et vers vos registres icr.io.

    Gardez à l'esprit que tout utilisateur ayant accès au projet peut utiliser ce secret pour envoyer des images vers votre registre privé. Vous souhaiterez peut-être configurer les outils de journalisation et de surveillance afin de pouvoir observer qui effectue quelles actions dans votre cluster.

  4. Répétez l'étape précédente pour chaque région icr.io vers laquelle vous souhaitez envoyer des images.

  5. Ajoutez le secret au compte de service de génération et faites référence aux secrets dans le fichier de configuration de génération. Pour plus d'informations, voir la documentationRed Hat OpenShift.

    1. Ajoutez le secret au compte de service de génération en liant le secret que vous venez de créer au rôle builder qui est utilisé par toutes les générations du cluster.
        oc secrets link builder <secret_name>
        ```
    1. Répertoriez les configurations de génération et notez celles auxquelles vous souhaitez octroyer un accès d'envoi et d'extraction à IBM Cloud Container Registry.
    
    ```sh {: pre}
        oc get bc
        ```
    1. Définissez le secret d'envoi d'image pour que la configuration de génération utilise le secret que vous venez de créer avec l'accès au service `Writer` à IBM Cloud Container Registry.
    
    ```sh {: pre}
        oc set build-secret --push bc/<build_config_name> <secret_name>
        ```
    4. Définissez le secret d'extraction d'image pour que la configuration de génération soit extraite du registre à partir duquel vous souhaitez extraire l'image de génération initiale. Par exemple, vous pouvez utiliser le secret que vous venez de créer avec l'accès au service `Reader` à IBM Cloud Container Registry si l'image source se trouve dans un référentiel IBM Cloud Container Registry.
    
    ```sh {: pre}
        oc set build-secret --pull bc/<build_config_name> <secret_name>
        ```
    
  6. Après avoir mis à jour le compte de service de génération et le fichier de configuration de génération à envoyer à IBM Cloud Container Registry, redémarrez votre génération.

    oc start-build <build_name>
    
  7. Obtenez le nom de votre pod de génération, tel que <build>-2-build.

    oc get pods
    
  8. Consultez les journaux de la génération et notez l'emplacement où l'image a été envoyée.

    oc logs <build_pod>
    

    Exemple de journal lorsqu'un envoi d'image aboutit.

    ...
    Successfully pushed <region>.icr.io/<namespace>/<build_name>@sha256:<hash>
    Push successful
    
  9. Vérifiez vos images dans votre registre privé pour confirmer que l'image a été créée.

    ibmcloud cr image list
    

    Exemple de sortie

    Repository                                Tag       Digest     Namespace     Created         Size     Security status   
    <region>.icr.io/<namespace>/<build_name>  latest    <digest>   <namespace>   2 minutes ago   182 MB   33 Issues  
    

Votre génération Red Hat OpenShift peut désormais extraire et envoyer des images depuis et vers IBM Cloud Container Registry.

Utilisation d'IBM Cloud Container Registry

Par défaut, votre cluster Red Hat OpenShift on IBM Cloud est configuré pour extraire des images des domaines IBM Cloud Container Registry icr.io privés distants dans le projet default. Si vous souhaitez utiliser des images qui sont stockées dans IBM Cloud Container Registry pour d'autres projets, vous pouvez extraire l'image sur le registre interne d'un flux d'images ou créer des secrets d'extraction d'image pour chaque registre global et régional dans chaque projet.

Pour importer des images dans le registre interne, voir Importation d'images à partir d'IBM Cloud Container Registry dans le flux d'images de registre interne.

Pour extraire des images directement à partir d'IBM Cloud Container Registry externe, voir les rubriques ci-après.

Comment autoriser votre cluster à extraire des images d'un registre privé ?

Pour extraire des images d'un registre, votre cluster Red Hat OpenShift on IBM Cloud utilise un type spécial de secret Kubernetes, imagePullSecret. Ce secret d'extraction d'image stocke les données d'identification permettant d'accéder à un registre de conteneur.

Le registre de conteneur peut être :

  • Un espace de noms privé dans votre propre IBM Cloud Container Registry.
  • Un espace de noms privé dans IBM Cloud Container Registry qui appartient à un autre compte IBM Cloud.
  • N'importe quel autre registre privé, tel que Docker.

Toutefois, par défaut, votre cluster est configuré pour extraire des images des espaces de nom de votre compte dans IBM Cloud Container Registryet déployer des conteneurs à partir de ces images vers le projet default Red Hat OpenShift de votre cluster. Si vous devez extraire des images dans d'autres projets du cluster ou à partir d'autres registres de conteneur, vous devez configurer vos propres secrets d'extraction d'image.

Configuration du secret d'extraction d'image par défaut

Généralement, votre cluster Red Hat OpenShift on IBM Cloud est configuré pour exraire des images de tous les domaines IBM Cloud Container Registry icr.io à partir du projet default Red Hat OpenShift uniquement. Consultez la Questions fréquemment posées ci-dessous pour en savoir plus sur la manière de récupérer des images dans d'autres projets ou comptes Red Hat OpenShift, de restreindre l'accès à la récupération d'images, ou pour comprendre pourquoi votre cluster ne dispose peut-être pas des secrets de récupération d'images par défaut.

Comment mon cluster est-il configuré pour récupérer des images à partir du projet default Red Hat OpenShift?
Lorsque vous créez un cluster, il dispose d'un ID de service IBM Cloud IAM associé à une règle de rôle d'accès au service Lecteur IAM dans IBM Cloud Container Registry. Les données d'identification de l'ID de service sont représentées dans une clé d'API qui n'expire jamais et qui est stockée dans des secrets d'extraction d'image dans votre cluster. Ces secrets sont ajoutés dans l'espace de noms Kubernetes default et la liste de ces secrets dans le compte de service default correspondant à ce projet Red Hat OpenShift. En utilisant des secrets d'extraction d'image, vos déploiements peuvent extraire des images (accès en lecture seule) à partir du IBM Cloud Container Registry global et régional pour déployer des conteneurs dans le projet default Red Hat OpenShift.
  • Le registre global stocke de manière sécurisée des images publiques fournies par IBM. Vous pouvez vous référer à ces images publiques dans vos déploiements au lieu d'utiliser des références différentes pour les images stockées dans chaque registre régional.
  • Le registre régional stocke vos propres images Docker privées de manière sécurisée.
Que faire si je ne dispose pas de secrets de récupération d'images dans le projet « default » Red Hat OpenShift?
Vous pouvez rechercher les secrets d'extraction d'image en vous connectant à votre cluster et en exécutant la commande oc get secrets -n default | grep "icr-io". Si aucun secret icr n'est répertorié, la personne qui a créé le cluster n'avait peut-être pas les droits requis sur IBM Cloud Container Registry dans IAM. Voir Mise à jour de clusters existants pour utiliser le secret d'extraction d'image de la clé d'API.
Puis-je limiter l'accès en lecture à un registre régional spécifique?
Oui, vous pouvez éditer la règle IAM existante de l'ID de service qui limite le rôle d'accès au service Lecteur à ce registre régional ou à une ressource de registre, comme par exemple, un espace de noms. Avant de personnaliser des règles IAM de registre, vous devez activer les règles IBM Cloud IAM pour IBM Cloud Container Registry.

Vous souhaitez renforcer la protection de vos données d'identification de registre ? Demandez à l'administrateur de votre cluster d'activer un fournisseur de service de gestion des clés (KMS) dans votre cluster pour chiffrer les secrets Kubernetes qui s'y trouvent, tels que le secret d'extraction d'image qui stocke les données d'identification de votre registre.

Puis-je importer des images dans un projet « Red Hat OpenShift » à partir d’un autre site que default?
Par défaut, non. En utilisant la configuration de cluster par défaut, vous pouvez déployer des conteneurs à partir de n'importe quelle image stockée dans votre espace de nom IBM Cloud Container Registry dans le projet default Red Hat OpenShift de votre cluster. Pour utiliser ces images dans d'autres projets Red Hat OpenShift ou d'autres comptes IBM Cloud, vous pouvez copier ou créer vos propres secrets d'extraction d'image.
Puis-je importer des images depuis un autre compte IBM Cloud?
Oui, créez une clé d'API dans le compte IBM Cloud que vous souhaitez utiliser. Ensuite, dans chaque projet de chaque cluster dont vous souhaitez extraire des images du compte IBM Cloud, créez un secret qui contient la clé d'API. Pour plus d'informations, suivez cet exemple qui utilise une clé d'API d'ID de service autorisé.

Pour utiliser un registre non IBM Cloud, tel que Docker, voir Accès aux images stockées dans d'autres registres privés.

La clé API doit-elle correspondre à un identifiant de service? Que se passe-t-il si j'atteins la limite du nombre d'identifiants de service pour mon compte?
La configuration de cluster par défaut crée un ID de service pour stocker les données d'identification de clé d'API IBM Cloud IAM dans le secret d'extraction d'image. Cependant, vous pouvez également créer une clé d'API pour un utilisateur individuel et stocker ces données d'identification dans un secret d'extraction d'image. Si vous parvenez à la limite IAM pour les ID de service, votre cluster est créé sans l'ID de service et le secret d'extraction de l'image et ne peut pas extraire les images des domaines de registre icr.io par défaut. Vous devez créer votre propre secret d'extraction d'image, mais en utilisant une clé d'API pour un utilisateur individuel, tel qu'un ID fonctionnel, pas un ID de service IBM Cloud IAM.
Je vois les secrets de récupération d'images pour les domaines de registre régionaux et pour tous les domaines de registre. Lequel dois-je utiliser?
Auparavant, Red Hat OpenShift on IBM Cloud créait des secrets d'extraction d'image distincts pour chaque domaine de registre icr.io public régional. A présent, tous les domaines de registre icr.io publics et privés pour toutes les régions sont stockés dans un seul et même secret d'extraction d'image all-icr-io qui est automatiquement créé projet Kubernetes default de votre cluster.

Pour que les charges de travail des autres espaces de noms Kubernetes du cluster puissent extraire des images de conteneur à partir d'un registre privé, vous pouvez désormais copier uniquement le secret d'extraction d'image all-icr-io dans ce projet Kubernetes. Indiquez ensuite le secret all-icr-io dans votre déploiement ou votre compte de service. Vous n'avez plus besoin de copier le secret d'image qui correspond au registre régional de votre image. De plus, notez que vous n'avez pas besoin de secrets d'extraction d'images pour les registres publics qui ne nécessitent pas d'authentification.

Une fois que j'ai copié ou créé un secret « pull » d'image dans un autre projet Red Hat OpenShift, ai-je terminé?
Pas tout à fait. Vos conteneurs doivent être autorisés à extraire des images à l'aide du secret que vous avez créé. Vous pouvez ajouter le secret d'extraction d'image au compte de service pour l'espace de noms ou faire référence au secret dans chaque déploiement. Pour obtenir des instructions, voir Utilisation de secret d'extraction d'image pour déployer des conteneurs.

Connexion de réseau privé à des registres icr.io

Lorsque vous configurez votre compte IBM Cloud pour utiliser des noeuds finaux de service, vous pouvez utiliser une connexion de réseau privé pour envoyer et extraire des images vers et depuis IBM Cloud Container Registry.

Que dois-je faire pour configurer mon cluster afin d'utiliser la connexion privée aux registres d' icr.io ?

  1. Activez une fonction VRF (Virtual Router Function) pour votre compte d'infrastructure IBM Cloud de manière à pouvoir utiliser le noeud final de service cloud privé IBM Cloud Container Registry. Pour activer la fonction VRF, voir Activation de VRF. Pour vérifier si la fonction VRF est déjà activée, utilisez la commande ibmcloud account show.
  2. Activez votre compte IBM Cloud pour utiliser des noeuds finaux de service.

IBM Cloud Container Registry utilise automatiquement le point de terminaison du service de cloud privé. Vous n'avez pas besoin d'activer le nœud final de service de cloud privé pour vos clusters Red Hat OpenShift on IBM Cloud.

Mise à jour de clusters existants pour utiliser le secret d'extraction d'image de la clé d'API

Les nouveaux clusters Red Hat OpenShift on IBM Cloud stockent une clé d'API dans des secrets d'extraction d'image pour autoriser l'accès à IBM Cloud Container Registry. Avec ces secrets d'extraction d'image, vous pouvez déployer des conteneurs à partir d'images stockées dans les domaines de registre icr.io. Vous pouvez ajouter les secrets d'extraction d'image à votre cluster si celui-ci n'a pas été créé avec les secrets.

Avant de commencer

  1. Accédez à votre cluster Red Hat OpenShift.

  2. Vérifiez que vous disposez des droits suivants : rôle d'accès à la plateforme IBM Cloud IAM Opérateur ou Administrateur pour Red Hat OpenShift on IBM Cloud. Le propriétaire de compte peut vous octroyer le rôle en exécutant la commande ci-après.

    ibmcloud iam user-policy-create EMAIL --service-name containers-kubernetes --roles "Administrator,Operator"
    
  3. Rôle d'accès à la plateforme IBM Cloud IAM Administrateur pour IBM Cloud Container Registry, sur toutes les régions et tous les groupes de ressources. La portée de la règle ne peut pas être définie pour une région ou un groupe de ressources particulier. Le propriétaire de compte peut vous octroyer le rôle en exécutant la commande ci-après.

    Vérifiez que la clé secrète a bien été créée

    ibmcloud iam user-policy-create YOUR_USER_EMAIL --service-name container-registry --roles Administrator
    
  4. Si votre compte limite la création d'ID de service, ajoutez le rôle Créateur d'ID de service à la gestion des identités et des accès (IAM) dans la console (iam-identity dans l'API ou l'interface de ligne de commande).

  5. Si votre compte limite la création de clé d'API, ajoutez le rôle Créateur de clé d'API d'utilisateur à la gestion des identités et des accès (IAM) dans la console (iam-identity dans l'API ou l'interface de ligne de commande).

Mise à jour de votre secret d'extraction d'image

Pour mettre à jour le secret d'extraction d'image de votre cluster dans l'espace de noms Kubernetes default Kubernetes.

  1. Obtenez l'ID de votre cluster.

    ibmcloud oc cluster ls
    
  2. Exécutez la commande ci-après afin de créer un ID de service pour le cluster et affecter à l'ID de service un rôle d'accès au service IAM Lecteur pour IBM Cloud Container Registry. La commande permet également de créer une clé d'API pour représenter les données d'identification de l'ID de service et de stocker la clé d'API dans un secret d'extraction d'image Kubernetes dans le cluster. Le secret d'extraction d'image se trouve dans le projet default Red Hat OpenShift.

    ibmcloud oc cluster pull-secret apply --cluster CLUSTER_NAME_OR_ID
    

    Lorsque vous exécutez cette commande, la création de données d'identification IAM et de secrets d'extraction d'image est initiée et peut durer un certain temps. Vous ne pouvez pas déployer de conteneurs qui extraient une image des domaines IBM Cloud Container Registry icr.io jusqu'à ce que les secrets d'extraction d'image soient créés.

  3. Vérifiez que les secrets d'extraction d'image sont créés dans votre cluster.

    oc get secrets | grep icr-io
    

    Exemple de sortie

    all-icr-io           kubernetes.io/dockerconfigjson        1         16d
    
  4. Mettez à jour vos déploiements de conteneur pour extraire des images à partir du nom de domaine icr.io.

  5. Facultatif : si vous disposez d'un pare-feu, assurez-vous d'autoriser le trafic réseau sortant vers les sous-réseaux du registre correspondant aux domaines que vous utilisez.

  6. Effectuez la configuration à l'aide de l'une des options suivantes.

Utilisation d'un secret de récupération d'images pour accéder aux images stockées dans des registres privés externes

Configurez votre propre secret d'extraction d'image dans votre cluster pour déployer des conteneurs dans d'autres projets Red Hat OpenShift que default, utiliser des images stockées dans d'autres comptes IBM Cloud ou dans des registres privés externes. Par ailleurs, vous pouvez créer votre propre secret d'extraction d'image pour appliquer des règles d'accès IAM limitant les droits à des espaces de noms d'image de registre ou des actions (telles que push ou pull) spécifiques.

Une fois que vous avez créé le secret d'extraction d'image, vous conteneurs doivent utiliser le secret pour être autorisés à extraire une image du registre. Vous pouvez ajouter le secret d'extraction d'image au compte de service correspondant au projet ou faire référence au secret dans chaque déploiement. Pour obtenir des instructions, voir Utilisation de secret d'extraction d'image pour déployer des conteneurs.

Les secrets d'extraction d'image sont valides uniquement pour les projets Red Hat OpenShift pour lesquels ils ont été créés. Répétez ces étapes pour chaque espace de noms dans lequel vous désirez déployer des conteneurs.

Avant de commencer :

  1. Configurez un espace de noms dans IBM Cloud Container Registry et envoyez des images dans cet espace de noms.
  2. Créez un cluster.
  3. Accédez à votre cluster Red Hat OpenShift.

Pour utiliser votre propre secret d'extraction d'image, choisissez parmi les options suivantes :

Si vous avez déjà créé un secret d'extraction d'image dans votre projet et que vous voulez utiliser cette valeur dans votre déploiement, voir Déploiement de conteneurs en utilisant le secret imagePullSecret créé.

Copie d'un secret d'extraction d'image

Vous pouvez copier un secret d'extraction d'image, tel que celui qui est automatiquement créé pour le projet defaultRed Hat OpenShift, vers d'autres projets de votre cluster. Si vous souhaitez utiliser d'autres données d'identification de clé d'API IBM Cloud IAM pour ce projet, par exemple, pour limiter l'accès à certains projets ou pour extraire des images d'autres comptes IBM Cloud, créez un secret d'extraction d'image à la place.

  1. Répertoriez les projets Red Hat OpenShift disponibles dans votre cluster ou créez un projet à utiliser.

    oc get projects
    

    Exemple de sortie

    default          Active
    ibm-cert-store   Active
    ibm-system       Active
    kube-public      Active
    kube-system      Active
    

    Pour créer un projet

    oc new-project <project_name>
    
  2. Répertoriez les secrets d'extraction d'image existants dans le projet default Red Hat OpenShift pour IBM Cloud Container Registry.

    oc get secrets -n default | grep icr-io
    

    Exemple de sortie

    all-icr-io          kubernetes.io/dockerconfigjson        1         16d
    
  3. Copiez le secret d'extraction d'image all-icr-io depuis le projet default vers le projet de votre choix. Les nouveaux secrets d'extraction d'image sont nommés <project_name>-icr-<region>-io.

    oc get secret all-icr-io -n default -o yaml | sed 's/default/<new-project>/g' | oc create -n <new-project> -f -   
    
  4. Vérifiez que la création des secrets a abouti.

    oc get secrets -n <project_name> | grep icr-io
    
  5. Pour déployer des conteneurs, ajoutez le secret d'extraction d'image à chaque déploiement ou au compte de service du projet de sorte que n'importe quel déploiement du projet puisse extraire des images du registre.

Création d'un secret d'extraction d'image avec des données d'identification de clé d'API IAM différentes

Vous pouvez affecter des règles d'accès IBM Cloud IAM à des utilisateurs ou à un ID de service pour limiter les droits à des espaces de noms d'images de registre ou des actions (telles que push ou pull) spécifiques. Ensuite, créez une clé d'API et stockez ces données d'identification de registre dans un secret d'extraction d'image pour votre cluster.

Par exemple, pour accéder à des images dans d'autres comptes IBM Cloud, créez une clé d'API qui stocke les données d'identification IBM Cloud Container Registry d'un utilisateur ou d'un ID de service dans ce compte. Ensuite, dans le compte de votre cluster, sauvegardez les données d'identification de la clé d'API dans un secret d'extraction d'image pour chaque cluster et projet de cluster.

La procédure suivante permet de créer une clé d'API qui stocke les données d'identification d'un ID de service IBM Cloud IAM. Au lieu d'utiliser un ID de service, vous envisagerez peut-être de créer une clé d'API pour un ID utilisateur disposant d'une règle d'accès au service IBM Cloud IAM pour IBM Cloud Container Registry. Cependant, assurez-vous que l'utilisateur correspond à un ID fonctionnel ou dispose d'un plan au cas où il partirait, afin que le cluster puisse toujours accéder au registre.

  1. Répertoriez les projets Red Hat OpenShift disponibles dans votre cluster ou créez un projet à utiliser là vous souhaitez déployer des conteneurs à partir de vos images de registre.

    oc get projects
    

    Exemple de sortie

    default          Active
    ibm-cert-store   Active
    ibm-system       Active
    kube-public      Active
    kube-system      Active
    

    Pour créer un projet

    oc new-project <project_name>
    
  2. Créez un ID de service IBM Cloud IAM pour votre cluster qui sera utilisé pour les règles IAM et les données d'identification de clé d'API dans le secret d'extraction d'image. Prenez soin d'indiquer une description pour l'ID de service, qui vous aidera à retrouver cet ID par la suite, par exemple en incluant le nom du cluster et du projet.

    ibmcloud iam service-id-create <cluster_name>-<project>-id --description "Service ID for IBM Cloud Container Registry in Red Hat OpenShift on IBM Cloud cluster <cluster_name> project <project>"
    
  3. Créez une règle IBM Cloud IAM personnalisée pour l'ID de service de votre cluster qui autorise l'accès à IBM Cloud Container Registry.

    ibmcloud iam service-policy-create <cluster_service_ID> --roles <service_access_role> --service-name container-registry [--region <IAM_region>] [--resource-type namespace --resource <registry_namespace>]
    
    cluster_service_ID
    Obligatoire. Remplacez par l'ID service <cluster_name>-<kube_namespace>-id que vous avez créé précédemment pour votre cluster Kubernetes.
    --service-name container-registry
    Obligatoire. Entrez container-registry pour que la règle IAM s'applique à IBM Cloud Container Registry.
    --roles <service_access_role>
    Obligatoire. Entrez le rôle d'accès au service pour IBM Cloud Container Registry auquel vous souhaitez définir la portée d'accès de l'ID de service. Les valeurs possibles sont Reader, Writer et Manager.
    --region <IAM_region>
    Optionnel. Pour définir la portée de la règle d'accès à certaines régions IAM, entrez les régions dans une liste en les séparant par des virgules. Les valeurs possibles sont global et les régions de registre local.
    --resource-type namespace --resource <registry_namespace>
    Optionnel. Si vous souhaitez limiter l'accès aux seules images dans certains espaces de nom IBM Cloud Container Registry, entrez namespace pour le type de ressource et indiquez <registry_namespace>. Pour répertorier les espaces de noms du registre, exécutez la commande ibmcloud cr namespaces.
  4. Créez une clé d'API pour l'ID de service. Nommez la clé de l'API similaire à votre ID de service et incluez l'ID de service que vous avez créé précédemment,<cluster_name>-<kube_namespace>-id. Veillez à indiquer une description pour la clé d'API pour vous aider à la retrouver par la suite.

    ibmcloud iam service-api-key-create <cluster_name>-<project>-key <cluster_name>-<project>-id --description "API key for service ID <service_id> in Red Hat OpenShift on IBM Cloud cluster <cluster_name> project <project>"
    
  5. Récupérez la valeur de votre clé d'API dans la sortie de la commande précédente.

    Please preserve the API key! It can't be retrieved after it's created.
    Name          <cluster_name>-<kube_namespace>-key   
    Description   key_for_registry_for_serviceid_for_kubernetes_cluster_multizone_namespace_test   
    Bound To      crn:v1:bluemix:public:iam-identity::a/1bb222bb2b33333ddd3d3333ee4ee444::serviceid:ServiceId-ff55555f-5fff-6666-g6g6-777777h7h7hh   
    Created At    2019-02-01T19:06+0000   
    API Key       i-8i88ii8jjjj9jjj99kkkkkkkkk_k9-llllll11mmm1   
    Locked        false   
    UUID          ApiKey-222nn2n2-o3o3-3o3o-4p44-oo444o44o4o4   
    
  6. Créez un secret d'extraction d'image pour stocker les données d'identification de la clé d'API dans le projet du cluster. Répétez cette étape pour chaque projet de chaque cluster pour chaque domaine icr.io dont vous souhaitez extraire des images.

    oc --namespace <project> create secret docker-registry <secret_name> --docker-server=<registry_URL> --docker-username=iamapikey --docker-password=<api_key_value> --docker-email=<docker_email>
    
    --namespace <project>
    Obligatoire. Spécifiez le projet Red Hat OpenShift de votre cluster que vous avez utilisé pour le nom d'ID de service.
    <secret_name>
    Obligatoire. Entrez le nom de votre secret d'extraction d'image.
    --docker-server <registry_URL>
    Obligatoire. Définissez l'URL d'accès au registre d'images dans lequel est configuré votre espace de noms de registre. Pour les domaines disponibles, voir Régions locales.
    --docker-username iamapikey
    Obligatoire. Entrez le nom d'utilisateur pour vous connecter à votre registre privé. Si vous utilisez IBM Cloud Container Registry, entrez iamapikey.
    --docker-password <token_value>
    Obligatoire. Entrez la valeur de votre API Key que vous avez récupérée précédemment.
    --docker-email <docker-email>
    Obligatoire. Si vous en avez une, entrez votre adresse e-mail Docker. Dans le cas contraire, entrez une adresse e-mail fictive, telle que a@b.c. Cette adresse e-mail est obligatoire pour créer un secret Kubernetes, mais n'est plus utilisée une fois la valeur créée.
  7. Vérifiez que la création du secret a abouti. Remplacez<project> par le fichierproject où vous avez créé le secret d'extraction de l'image.

    oc get secrets --namespace <project>
    
  8. Ajoutez le secret d'extraction d'image à un compte de service Kubernetes de sorte que n'importe quel pod du projet puisse utiliser ce secret lorsque vous déployez un conteneur.

Accès aux images stockées dans d'autres registres privés

Si vous disposez déjà d'un registre privé, vous devez stocker les données d'identification du registre dans un secret d'extraction d'image Kubernetes et référencez ce secret dans votre fichier de configuration.

Avant de commencer :

  1. Créez un cluster.
  2. Accédez à votre cluster Red Hat OpenShift.

Pour créer un secret d'extraction d'image :

  1. Créez le secret Kubernetes pour stocker vos données d'identification de registre privé.

    oc --namespace <project> create secret docker-registry <secret_name>  --docker-server=<registry_URL> --docker-username=<docker_username> --docker-password=<docker_password> --docker-email=<docker_email>
    
    --namespace <project>
    Obligatoire. Projet Red Hat OpenShift de votre cluster dans lequel vous désirez utiliser le secret et déployer des conteneurs. Pour afficher la liste des projets disponibles dans votre cluster, exécutez la commande oc get projects.
    <secret_name>
    Obligatoire. Nom que vous désirez utiliser comme secret d'extraction d'image.
    --docker-server <registry_URL>
    Obligatoire. URL du registre dans lequel sont stockées vos images privées.
    --docker-username <docker_username>
    Obligatoire. Nom d'utilisateur pour vous connecter à votre registre privé.
    --docker-password <token_value>
    Obligatoire. Mot de passe pour vous connecter à votre registre privé, par exemple, une valeur de jeton.
    --docker-email <docker-email>
    Obligatoire. Si vous en avez une, entrez votre adresse e-mail Docker. Si vous n'en avez pas, entrez une adresse e-mail fictive, telle que a@b.c. Cette adresse e-mail est obligatoire pour créer un secret Kubernetes, mais n'est plus utilisée une fois la valeur créée.
  2. Vérifiez que la création du secret a abouti. Remplacez <project> par le nom du projet dans lequel vous avez créé le secret d'extraction d'image.

    oc get secrets --namespace <project>
    
  3. Créez un pod faisant référence au secret d'extraction d'image.

Utilisation de secret d'extraction d'image pour déployer des conteneurs

Vous pouvez définir une image de retrait d'image dans votre déploiement de pod ou stocker le secret d'extraction d'image dans votre compte de service Kubernetes de sorte qu'il soit disponible pour tous les déploiements qui ne spécifient pas de compte de service Kubernetes dans le projet.

Pour planifier l'utilisation des secrets d'extraction d'image dans votre cluster, choisissez l'une des options suivantes :

  • En vous référant au secret d'extraction de l'image dans votre déploiement de pod : utilisez cette option si vous ne souhaitez pas accorder l'accès à votre registre pour tous les pods de votre projet par défaut. Les développeurs peuvent inclure le secret d'extraction d'image dans chaque déploiement de pod qui doit accéder à votre registre.
  • Stocker le secret d'extraction d'image dans le compte de service Kubernetes : utilisez cette option pour octroyer l'accès aux images de votre registre pour tous les déploiements dans les projets Red Hat OpenShift sélectionnés. Pour stocker un secret d'extraction d'image dans le compte de service Kubernetes, suivez les étapes décrites ci-après.

Stockage du secret d'extraction d'image dans le compte de service Kubernetes pour le projet sélectionné

Tous les projets Red Hat OpenShift ont un compte de service Kubernetes nommé default. Dans le projet, vous pouvez ajouter le secret d'extraction d'image à ce compte de service pour octroyer l'accès aux pods afin d'extraire des images de votre registre. Les déploiements qui n'indiquent pas de compte de service utilisent automatiquement le compte de service default pour ce projet Red Hat OpenShift.

  1. Vérifiez s'il existe déjà un secret d'extraction d'image pour le compte de service default.

    oc describe serviceaccount default -n <project_name>
    

    Lorsque <none> est affiché dans l'entrée des secrets d'extraction d'image, aucun secret d'extraction d'image n'existe.

  2. Ajoutez le secret d'extraction d'image dans le compte de service default.

    • Exemple de commande permettant d'ajouter le secret d'extraction d'image lorsqu'aucun secret d'extraction d'image n'est défini.
        oc patch -n <project_name> serviceaccount/default -p '{"imagePullSecrets":[{"name": "<image_pull_secret_name>"}]}'
        ```
    - Exemple de commande permettant d'ajouter le secret d'extraction d'image lorsqu'un secret d'extraction d'image est déjà défini.
    
    ```sh {: pre}
        oc patch -n <project_name> serviceaccount/default --type='json' -p='[{"op":"add","path":"/imagePullSecrets/-","value":{"name":"<image_pull_secret_name>"}}]'
        ```
    
  3. Assurez-vous que le secret d'extraction d'image a été ajouté dans le compte de service default.

    oc describe serviceaccount default -n <project_name>
    

    Exemple de sortie

    Name:                default
    Namespace:           <namespace_name>
    Labels:              <none>
    Annotations:         <none>
    Image pull secrets:  <image_pull_secret_name>
    Mountable secrets:   default-token-sh2dx
    Tokens:              default-token-sh2dx
    Events:              <none>
    

    Si les secrets d'extraction d'image disent <secret> (not found), vérifiez que le secret d'extraction d'image existe dans le même projet que votre compte de service en exécutant oc get secrets -n project.

  4. Créez un fichier de configuration de pod nommé mypod.yaml pour déployer un conteneur à partir d'une image dans votre registre.

    apiVersion: v1
    kind: Pod
    metadata:
      name: mypod
    spec:
      containers:
        - name: mypod-container
          image: <region>.icr.io/<project>/<image>:<tag>
    
  5. Créez le pod dans le cluster en appliquant le fichier de configuration mypod.yaml.

    oc apply -f mypod.yaml
    

Configuration d'un cluster pour extraire un logiciel autorisé

Vous pouvez configurer votre cluster Red Hat OpenShift on IBM Cloud pour extraire un logiciel autorisé, collection d'images de conteneur protégées mises en package dans des chartes Helm qu'IBM vous autorise à utiliser au moyen d'une licence. Le logiciel autorisé est stocké dans un domaine IBM Cloud Container Registry spécial, nommé cp.icr.io. Pour accéder à ce domaine, vous devez créer un secret d'extraction d'image avec une clé d'autorisation pour votre cluster et ajouter ce secret au compte de service Kubernetes de chaque projet dans lequel vous souhaitez déployer ce logiciel autorisé.

Avant de commencer : accédez à votre cluster Red Hat OpenShift.

  1. Procurez-vous la clé d'autorisation pour votre bibliothèque de logiciels autorisés.

    1. Connectez-vous à MyIBM.com et faites défiler la page jusqu'à la section « Bibliothèque de logiciels pour conteneurs ». Cliquez sur Afficher la bibliothèque.
    2. Sur la page « Accéder à votre logiciel de conteneurs > Clés d'autorisation », cliquez sur « Copier la clé ». Cette clé autorise l'accès à tous les logiciels autorisés de votre bibliothèque de logiciels de conteneur.
  2. Dans le projet où vous souhaitez déployer vos conteneurs autorisés, créez un secret d'extraction d'image afin de pouvoir accéder au registre autorisé cp.icr.io. Utilisez la clé d'autorisation que vous avez précédemment extraite comme valeur --docker-password. Pour plus d'informations, voir Accès aux images stockées dans d'autres registres privés.

    oc create secret docker-registry entitled-cp-icr-io --docker-server=cp.icr.io --docker-username=cp --docker-password=<entitlement_key> --docker-email=<docker_email> -n <project>
    
  3. Ajoutez le secret d'extraction d'image au compte de service de l'espace de noms de sorte que tous les conteneurs du projet puissent utiliser la clé d'autorisation afin d'extraire les images autorisées. Pour plus d'informations, voir Utilisation du secret d'extraction d'image pour déployer des conteneurs.

    oc patch -n <project> serviceaccount/default --type='json' -p='[{"op":"add","path":"/imagePullSecrets/-","value":{"name":"entitled-cp-icr-io"}}]'
    
  4. Créez un pod dans le projet qui génère un conteneur à partir d'une image dans le registre autorisé.

    oc run <pod_name> --image=cp.icr.io/<image_name> -n <project> --generator=run-pod/v1
    
  5. Vérifiez que votre conteneur a pu être correctement généré à partir de l'image autorisée en vérifiant que le pod est à l'état En cours d'exécution (Running).

    oc get pod <pod_name> -n <project>
    

Que faire ensuite ? Vous pouvez configurer le référentiel de chartes Helm entitled, où sont stockées les chartes Helm qui intègrent les logiciels autorisés. Si Helm est déjà installé dans votre cluster, exécutez helm repo add entitled https://raw.githubusercontent.com/IBM/charts/master/repo/entitled.

Ajout d'un registre privé au secret d'extraction global

Nœuds de travail RHEL

Dans les clusters qui utilisent exclusivement des nœuds de travail RHEL, vous pouvez configurer un secret global de récupération d'images que chaque nœud de travail du cluster peut utiliser pour récupérer des images depuis un registre privé.

Par défaut, votre cluster Red Hat OpenShift on IBM Cloud comporte un secret d'extraction d'image global pour les registres suivants, de sorte que les composants Red Hat OpenShift par défaut puissent être déployés :

  • cloud.openshift.com
  • quay.io
  • registry.connect.redhat.com
  • registry.redhat.io

Ne remplacez pas le secret d'extraction global par un secret d'extraction qui ne possède pas de données d'identification permettant d'accéder aux registres Red Hat par défaut. Si vous le faites, les composants Red Hat OpenShift par défaut qui sont installés dans votre cluster, tel que OperatorHub, peuvent échouer car ils ne peuvent pas extraire des images de ces registres.

Avant de commencer :

Pour ajouter des registre privés, éditez l'élément pull-secret global dans le projet openshift-config.

  1. Créez une valeur de secret qui contient les données d'identification permettant d'accéder à votre registre privé et de stocker la valeur de secret décodée dans un fichier JSON. Lorsque vous créez la valeur de secret, les données d'identification sont automatiquement codées en base64. Si vous utilisez --dry-run, seule la valeur de secret est créée et aucun objet secret n'est créé dans votre cluster. La valeur de secret décodée est ensuite stockée dans un fichier JSON afin d'être utilisée ultérieurement dans votre secret d'extraction global.

    oc create secret docker-registry <secret_name> --docker-server=<registry_URL> --docker-username=<docker_username> --docker-password=<docker_password> --docker-email=<docker_email> --dry-run=true --output="jsonpath={.data.\.dockerconfigjson}" | base64 --decode > myregistryconfigjson
    
    --namespace <project>
    Obligatoire. Projet Red Hat OpenShift de votre cluster dans lequel vous désirez utiliser le secret et déployer des conteneurs. Pour afficher la liste des projets disponibles dans votre cluster, exécutez la commande oc get ns.
    <secret_name>
    Obligatoire. Nom que vous désirez utiliser comme secret d'extraction d'image.
    --docker-server <registry_URL>
    Obligatoire. URL du registre dans lequel sont stockées vos images privées.
    --docker-username <docker_username>
    Obligatoire. Nom d'utilisateur pour vous connecter à votre registre privé.
    --docker-password <token_value>
    Obligatoire. Mot de passe pour vous connecter à votre registre privé, par exemple, une valeur de jeton.
    --docker-email <docker-email>
    Obligatoire. Si vous en avez une, entrez votre adresse e-mail Docker. Si vous n'en avez pas, entrez une adresse e-mail fictive, telle que a@b.c. Cette adresse e-mail est obligatoire pour créer un secret Kubernetes, mais n'est plus utilisée une fois la valeur créée.
    --dry-run=true
    Sélectionnez cette option pour créer uniquement la valeur du secret, sans créer ni stocker l'objet secret dans votre cluster.
    --output="jsonpath={.data.\.dockerconfigjson}"
    Obtenez uniquement la valeur .dockerconfigjson à partir de la section data du secret Kubernetes.
    | base64 --decode > myregistryconfigjson
    Téléchargez les données de secret décodées dans un fichier myregistryconfigjson local.
  2. Extrayez la valeur de secret décodée du secret d'extraction global par défaut et stockez la valeur dans un fichier dockerconfigjson.

    oc get secret pull-secret -n openshift-config --output="jsonpath={.data.\.dockerconfigjson}" | base64 --decode > dockerconfigjson
    
  3. Combinez le fichier myregistryconfigjson du secret d'extraction de registre privé téléchargé au fichier dockerconfigjson du secret d'extraction global par défaut.

    jq -s '.[0] * .[1]' dockerconfigjson myregistryconfigjson > dockerconfigjson-merged
    
  4. Mettez à jour le secret d'extraction global avec le fichier dockerconfigjson-merged combiné.

    oc set data secret/pull-secret -n openshift-config --from-file=.dockerconfigjson=dockerconfigjson-merged
    
  5. Vérifiez que le secret d'extraction global a été mis à jour. Assurez-vous que votre registre privé et chacun des registres Red Hat par défaut figurent dans la sortie de la commande ci-après.

    oc get secret pull-secret -n openshift-config --output="jsonpath={.data.\.dockerconfigjson}" | base64 --decode
    

    Exemple de sortie

    {
        "auths": {
            "cloud.openshift.com": {
                "auth": "<encoded_string>",
                "email": "email@example.com"
            },
            "quay.io": {
                "auth": "<encoded_string>",
                "email": "email@example.com"
            },
            "registry.connect.redhat.com": {
                "auth": "<encoded_string>",
                "email": "email@example.com"
            },
            "registry.redhat.io": {
                "auth": "<encoded_string>",
                "email": "email@example.com"
            },
            "<private_registry>": {
                "username": "iamapikey",
                "password": "<encoded_string>",
                "email": "email@example.com",
                "auth": "<encoded_string>"
            }
        }
    }
    
  6. Pour sélectionner les modifications de configuration globales, rechargez tous les nœuds worker de votre cluster.

    1. Notez l'ID des noeuds worker de votre cluster.
        ibmcloud oc worker ls -c <cluster_name_or_ID>
        ```
    1. **Pour les clusters classiques** Rechargez chaque noeud worker. Vous pouvez recharger plusieurs nœuds de travail en spécifiant plusieurs options « `-w` », mais veillez à laisser suffisamment de nœuds de travail en cours d'exécution simultanément pour vos applications afin d'éviter toute interruption de service.
    
    ```sh {: pre}
        ibmcloud oc worker reload -c <cluster_name_or_ID> -w <workerID_1> -w <workerID_2>
        ```
    1. **Pour les clusters de VPC** Remplacez chaque noeud worker. Avant de commencer, vérifiez votre cluster dispose de suffisamment d'autres noeuds worker pour que vos pods puissent être replanifiés et continuent à s'exécuter.
    
    ```sh {: pre}
        ibmcloud oc worker replace --cluster <cluster_name_or_ID> --worker <worker_node_ID>
        ```
    
    
  7. Une fois les noeuds worker de nouveau à un état sain, vérifiez que le secret d'extraction global est mis à jour sur un noeud worker.

    1. Démarrez un pod de débogage pour vous connecter à un noeud worker. Utilisez l'IP privée que vous avez extrait précédemment pour <node_name>.
        oc debug node/<node_name>
        ```
    1. Remplacez le répertoire racine par l'hôte de manière à pouvoir visualiser les fichiers du noeud worker.
    
    ```sh {: pre}
        chroot /host
        ```
    1. Vérifiez que le fichier de configuration Docker comporte les données d'identification de registre correspondant au secret d'extraction global que vous avez défini.
    
    ```sh {: pre}
        vi /.docker/config.json
        ```
    

Mise à jour du secret global de récupération

Nœuds de travail RHCOS Nœuds de travail RHEL

Dans les clusters qui utilisent des travailleurs RHCOS ou une combinaison de travailleurs RHCOS et RHEL, vous pouvez suivre les étapes suivantes pour mettre à jour le secret d'extraction global dans votre cluster Red Hat OpenShift on IBM Cloud.

Par défaut, votre cluster Red Hat OpenShift on IBM Cloud comporte un secret d'extraction d'image global pour les registres suivants, de sorte que les composants Red Hat OpenShift par défaut puissent être déployés :

  • cloud.openshift.com
  • quay.io
  • registry.connect.redhat.com
  • registry.redhat.io

Ne remplacez pas le secret d'extraction global par un secret d'extraction qui ne possède pas de données d'identification permettant d'accéder aux registres Red Hat par défaut. Si vous le faites, les composants Red Hat OpenShift par défaut qui sont installés dans votre cluster, tel que OperatorHub, peuvent échouer car ils ne peuvent pas extraire des images de ces registres.

  1. Créez un secret contenant les informations d'identification du registre que vous souhaitez utiliser.
    oc create secret docker-registry docker-auth-secret \
    --docker-server=REGISTRY \
    --docker-username=USERNAME \
    --docker-password=PASSWORD \
    --namespace kube-system
    
  2. Créez un DaemonSet pour appliquer le secret à tous les nœuds de travail.
    ocp_release_pull_secret_image=$(oc get ds -n openshift-dns node-resolver -o jsonpath='{.spec.template.spec.containers[0].image}')
    cat << EOF | oc create -f -
    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: update-docker-config
      namespace: kube-system
      labels:
        app: update-docker-config
    spec:
      selector:
        matchLabels:
          name: update-docker-config
      template:
        metadata:
          labels:
            name: update-docker-config
        spec:
          initContainers:
            - command: ["/bin/sh", "-c"]
              args:
                - >
                  echo "Checking if RHEL or RHCOS host";
                  [[ -s /docker-config/.docker/config.json  ]] && CONFIG_PATH=/docker-config/.docker || CONFIG_PATH=/docker-config/root/.docker;
                  echo "Backing up or restoring config.json";
                  [[ -s \$CONFIG_PATH/config.json ]] && cp \$CONFIG_PATH/config.json \$CONFIG_PATH/config.json.bak || cp \$CONFIG_PATH/config.json.bak \$CONFIG_PATH/config.json;
                  echo "Merging secret with config.json";
                  /host/usr/bin/jq -s '.[0] * .[1]' \$CONFIG_PATH/config.json /auth/.dockerconfigjson > \$CONFIG_PATH/config.tmp;
                  mv \$CONFIG_PATH/config.tmp \$CONFIG_PATH/config.json;
                  echo "Sending signal to reload crio config";
                  pidof crio;
                  kill -1 \$(pidof crio)
              image: ${ocp_release_pull_secret_image}
              imagePullPolicy: IfNotPresent
              name: updater
              resources: {}
              securityContext:
                privileged: true
              volumeMounts:
                - name: docker-auth-secret
                  mountPath: /auth
                - name: docker
                  mountPath: /docker-config
                - name: bin
                  mountPath: /host/usr/bin
                - name: lib64
                  mountPath: /lib64
          containers:
            - resources:
                requests:
                  cpu: 0.01
              image: ${ocp_release_pull_secret_image}
              name: sleepforever
              command: ["/bin/sh", "-c"]
              args:
                - >
                  while true; do
                    sleep 100000;
                  done
          hostPID: true
          volumes:
            - name: docker-auth-secret
              secret:
                secretName: docker-auth-secret
            - name: docker
              hostPath:
                path: /
            - name: bin
              hostPath:
                path: /usr/bin
            - name: lib64
              hostPath:
                path: /lib64
                hostPathType: Directory
    EOF
    
  3. Vérifiez que les pods sont en cours d'exécution.
    oc get daemonset -n kube-system update-docker-config
    

Mise à jour d'une configuration de registre personnalisé containeurisé IBM Cloud Kubernetes Service

Avec Kubernetes version 1.22 ou ultérieure, vous pouvez utiliser des fichiers de configuration conteneurisé sur les nœuds worker pour configurer le retrait à partir d'un registre de conteneur. Vous pouvez utiliser une définition de démon pour mettre à jour les configurations sur tous les nœuds d'un cluster, ce qui empêche les configurations d'être supprimées lorsque des nœuds worker rechargent ou lorsque de nouveaux travailleurs sont ajoutés.

Exemple de définition de démon pour mettre à jour une configuration de registre personnalisé conteneurisée

Utilisez l'exemple de fichier YAML pour définir une définition de démon qui s'exécute sur tous les nœuds worker pour définir ou mettre à jour une configuration d'hôte de registre conteneurisée et monter sur le chemin de registre conteneurisé correspondant.

L'exemple définit la configuration d'hôte de registre suivante pour dockerhub. Cette configuration d'hôte de registre est déjà fournie et configurée automatiquement lors de la phase d'application des accès des nœuds worker. Le conteneur « init » initialise « hosts.toml » sur chaque nœud de travail après le déploiement, ainsi qu’après le rechargement ou le redémarrage des nœuds de travail.

server = "https://docker.io"
[host."https://registry-1.docker.io"]
capabilities = ["pull", "resolve"]

Exemple de fichier YAML:

apiVersion: apps/v1
kind: DaemonSet
metadata:
labels:
    name: containerd-dockerhub-registry-config
name: containerd-dockerhub-registry-config
namespace: kube-system
spec:
selector:
    matchLabels:
    name: containerd-dockerhub-registry-config
template:
    metadata:
    labels:
        name: containerd-dockerhub-registry-config
    spec:
    initContainers:
    - image: alpine:3.13.6
        name: containerd-dockerhub-registry-config
        command:
        - /bin/sh
        - -c
        - |
            #!/bin/sh
            set -uo pipefail
            cat << EOF > /etc/containerd/certs.d/docker.io/hosts.toml
            server = "https://docker.io"
            [host."https://registry-1.docker.io"]
            capabilities = ["pull", "resolve"]
            EOF
        volumeMounts:
        - mountPath: /etc/containerd/certs.d/docker.io/
        name: dockerhub-registry-config
    containers:
    - name: pause
        image: "us.icr.io/armada-master/pause:3.5"
        imagePullPolicy: IfNotPresent
    volumes:
    - name: dockerhub-registry-config
        hostPath:
        path: /etc/containerd/certs.d/docker.io/

Pour plus d'informations sur la mise à jour d'une configuration d'hôte de registre containerd, voir la documentation containerd.