IBM Cloud Docs
Configuración de un registro de imágenes

Configuración de un registro de imágenes

Los clústeres de Red Hat® OpenShift® on IBM Cloud® incluyen un registro interno para crear, desplegar y gestionar las imágenes de contenedor de forma local. Para que un registro privado gestione y controle el acceso a las imágenes de la empresa, también puede configurar el clúster de modo que utilice IBM Cloud® Container Registry.

Selección de una solución de registro de imágenes

Sus imágenes de contenedor deben almacenarse en un registro de contenedores al que su clúster pueda acceder para desplegar aplicaciones en su clúster. Puede elegir utilizar el registro incorporado del clúster de Red Hat OpenShift, un registro privado con acceso restringido a usuarios seleccionados o un registro público. Revise la tabla siguiente para elegir la mejor opción para su caso de uso.

Red Hat OpenShift Container Registry (OCR) interno

El clúster se configura con el Red Hat OpenShift Container Registry interno para que Red Hat OpenShift pueda crear, desplegar y gestionar automáticamente el ciclo de vida de la aplicación desde dentro del clúster. Las imágenes se almacenan en un dispositivo de almacenamiento de archivos de IBM Cloud clásico de copia de seguridad que se suministra cuando se crea el clúster. Si necesita más almacenamiento, puede cambiar el tamaño del dispositivo. Casos de uso:

  • Secuencia de imágenes nativas de Red Hat OpenShift, compilación y proceso de despliegue de apps individual para cada clúster.
  • Las imágenes se pueden compartir en todos los proyectos del clúster, con acceso controlado mediante roles de RBAC.
  • Integración del registro interno con otros productos de Red Hat como CloudForms para características ampliadas como por ejemplo la exploración de vulnerabilidades.
  • Opción para exponer el registro interno con una ruta de forma que los usuarios puedan extraer imágenes del registro a través de la red pública.
  • Opción de configurar un registro interno para extraer imágenes de, o enviar imágenes a, un registro privado como IBM Cloud Container Registry.

Para obtener más información, consulte Utilización del registro interno.

Registro privado

Los registros privados son una buena opción para proteger las imágenes frente a usuarios no autorizados. El administrador del clúster debe configurar los registros privados para asegurarse de que el acceso, las cuotas de almacenamiento, la fiabilidad de las imágenes y otras prestaciones funcionan según lo esperado. De forma predeterminada, los clústeres de Red Hat OpenShift se integran con el IBM Cloud Container Registry privado con secretos de extracción de imágenes en el proyecto default. IBM Cloud Container Registry es un registro privado altamente disponible y de varios arrendatarios para almacenar sus propias imágenes. También puede extraer imágenes proporcionadas por IBM del registro icr.io global y software con licencia del registro autorizado. En IBM Cloud Container Registry, se pueden gestionar las imágenes de varios clústeres con integración con IAM y facturación de IBM Cloud. Ventajas de utilizar IBM Cloud Container Registry con el registro interno:

  • Almacenamiento en memoria caché de imágenes local para compilaciones más rápidas mediante el registro interno.
  • Los despliegues en otros proyectos pueden ver la secuencia de imágenes para que no sea necesario copiar los secretos de extracción en cada proyecto.
  • Compartición de imágenes en varios clústeres sin necesidad de enviar imágenes a varios registros.
  • Exploración automática de vulnerabilidades de imágenes.
  • Control del acceso mediante políticas de IAM de IBM Cloud y registros regionales separados.
  • Retención de imágenes sin requerir espacio de almacenamiento en el clúster o un dispositivo de almacenamiento conectado. También puede establecer políticas para gestionar la cantidad de imágenes para evitar que ocupen demasiado espacio.
  • Infraestructura VPC: Uso del punto final del servicio de registro privado para que los clústeres que solo utilizan un punto final de servicio de nube privada puedan seguir accediendo al registro.
  • Establecimiento de cuotas de tráfico de extracción de imágenes y almacenamiento para controlar mejor el almacenamiento de imágenes, el uso y la facturación.
  • Extracción de contenido de IBM con licencia del registro con titularidad.

Para empezar, consulte los temas siguientes:

Registro público

Los registros públicos tales como Docker Hub son una forma de compartir imágenes entre equipos, empresas, clústeres o proveedores de nube. Algunos registros públicos también ofrecen un componente de registro privado. Casos de uso:

  • Envío u obtención de imágenes en la red pública.
  • Pruebas rápidas de un contenedor en proveedores de nube.
  • No se necesitan características de nivel empresarial tales como rastreos de vulnerabilidades ni gestión de accesos.

Para más información, consulte la documentación del registro público, como Quay o Docker Hub.

Almacenamiento de imágenes en los registros internos

Red Hat OpenShift clusters have an internal registry by default. Se hace copia de seguridad de las imágenes en el registro interno, pero varían dependiendo del proveedor de infraestructura del clúster de Red Hat OpenShift on IBM Cloud.

Clústeres clásicos
Su clúster Red Hat OpenShift está configurado por defecto con un registro interno que utiliza File Storage for Classic como almacenamiento de respaldo. Al suprimir el clúster, el registro interno y sus imágenes también se suprimen. Si desea persistir las imágenes, considere utilizar un registro privado como por ejemplo IBM Cloud Container Registry, hacer copia de seguridad de las imágenes en almacenamiento persistente como por ejemplo Object Storage o crear un clúster de registro de contenedor de Red Hat OpenShift (OCR) autónomo independiente. Para obtener más información, consulte la documentación deRed Hat OpenShift.
Clústeres de VPC
El registro interno de su clúster Red Hat OpenShift realiza copias de seguridad de sus imágenes en un bucket que se crea automáticamente en una instancia IBM Cloud Object Storage de su cuenta. Los datos almacenados en el grupo de almacenamiento de objetos se mantiene incluso si se suprime el clúster.
Clústeres clásicos, de VPC o Satellite
Opcionalmente, puede configurar el registro interno para que almacene los datos en emptyDir del nodo trabajador donde se ejecuta el pod de registro interno. Tenga en cuenta que estos datos no son persistentes, y si se reinicia el nodo de pod o trabajador, los datos almacenados se suprimen y son irrecuperables. Podría almacenar las imágenes localmente en emptyDir para mejorar el rendimiento si crea regularmente contenedores a partir de imágenes grandes.

Copia de seguridad del registro interno de imágenes en IBM Cloud Object Storage

Nube privada virtual

Se hace automáticamente copia de seguridad de las imágenes en el registro interno del clúster de Red Hat OpenShift en un grupo de IBM Cloud Object Storage. Los datos almacenados en el grupo de almacenamiento de objetos se mantiene incluso si se suprime el clúster.

Sin embargo, si el grupo no se puede crear al crear el clúster, debe crear manualmente un grupo y configurar el clúster para utilizar el grupo. Entretanto, el registro interno utiliza un volumen de Kubernetes emptyDir que almacena las imágenes de contenedor en el disco secundario del nodo trabajador. Los volúmenes emptyDir no se consideran almacenamiento disponible persistente con alta disponibilidad y, si suprime los pods que utilizan la imagen, la imagen se suprime automáticamente.

Para crear manualmente un grupo para el registro interno, consulte Error de creación de clúster sobre el grupo de almacenamiento de objetos.

Almacenamiento de imágenes en el registro interno en clústeres clásicos

Por defecto, el registro interno de su clúster Red Hat OpenShift utiliza un volumen IBM Cloud File Storage for Classic para almacenar las imágenes del registro. Puede revisar el tamaño predeterminado del volumen de almacenamiento o actualizar el tamaño del volumen.

Visualización de detalles del volumen

Para ver los detalles del volumen, incluidos la clase y el tamaño del almacenamiento, puede describir la reclamación de volumen persistente.

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

Cambio de los detalles de un volumen

Si el registro necesita más gigabytes de almacenamiento para las imágenes, puede cambiar el tamaño del volumen de almacenamiento de archivos. Para obtener más información, consulte Cambio del tamaño e IOPS del dispositivo de almacenamiento existente. Al redimensionar el volumen en la cuenta de infraestructura de IBM Cloud, la descripción de PVC adjunta no se actualiza. En su lugar, puede iniciar sesión en el pod de openshift-image-registry que utiliza el PVC de registry-backing para verificar que se ha cambiado el tamaño del volumen.

Almacenamiento de imágenes en el directorio vacío de nodo trabajador

Puede almacenar las imágenes de registro interno localmente en emptyDir del nodo trabajador, por ejemplo en un nodo trabajador nativo, para aumentar el rendimiento si crea contenedores a partir de imágenes grandes con regularidad.

Tenga en cuenta que estos datos no son persistentes, y si se reinicia el nodo de pod o trabajador, los datos almacenados se suprimen y son irrecuperables.

  1. Acceda al clúster de Red Hat OpenShift.
  2. Actualice el configmap del operador de registro de imágenes para que el almacenamiento utilice la dirección emptyDir del nodo trabajador. Tenga en cuenta que la actualización del mapa de configuración para utilizar emptyDir no elimina la PVC original del registro de imágenes.
    oc patch configs.imageregistry.operator.openshift.io/cluster --type merge --patch '{"spec":{"storage":{"emptyDir":{}}}}'
    
  3. Si el estado de administración del operador de registro de imágenes está configurado en Unmanaged, como en los clústeres Satellite, actualice el estado de administración a Managed. Ahora el operador actualiza el pod del registro interno.
    oc patch configs.imageregistry.operator.openshift.io/cluster --type merge -p '{"spec":{"managementState":"Managed"}}'
    
  4. Obtenga los detalles del pod del registro interno para que pueda verificar sus actualizaciones.
    1. Compruebe que el pod image-registry esté en ejecución y que se ejecuta un pod por nodo trabajador en el clúster.

      oc get pods -n openshift-image-registry
      

      Salida de ejemplo

      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
      
    2. Obtenga la dirección IP pública del Nodo en el que se ejecuta el pod image-registry.

      oc describe pod -n openshift-image-registry <image-registry-pod> | grep Node
      

      Salida de ejemplo

      Node:               169.xx.xxx.xxx/169.xx.xxx.xxx
      

      Si la dirección IP del nodo de trabajador es privada, ejecute ibmcloud oc worker ls -c <cluster> | grep <private_IP> y anote la dirección IP pública correspondiente.

    3. Obtenga el UID del pod image-registry en la sección metadata.uid del archivo YAML del pod (no el UID del conjunto de réplicas en la sección metadata.ownerReferences.uid ).

      oc get pod -n openshift-image-registry <image-registry-pod> -o yaml
      

      Salida de ejemplo

      apiVersion: v1
      kind: Pod
      metadata:
          uid: e8d7718d-b0bd-47e2-9aaa-05f3a608fd9b
      ...
      
  5. Compruebe que el registro interno almacena datos en el emptyDir del nodo trabajador.
    1. Acceda al registro directamente desde el clúster, utilizando el nodo trabajador que recuperó anteriormente. Siga los pasos para enviar una imagen de prueba al registro interno.

      Para completar estos pasos en la documentación de Red Hat OpenShift, necesita la herramienta de CLI podman. Es posible que los nodos trabajadores no tengan esta herramienta de CLI de forma predeterminada. Consulte la Guía de instalación dePodman para ver las versiones de RHEL disponibles.

    2. Vaya a la carpeta del pod del registro interno que se guarda en emptyDir. Para <pod_uid>, utilice el UID del pod que ha recuperado anteriormente.

      cd var/lib/kubelet/pods/<pod_uid>/volumes/kubernetes.io~empty-dir/registry-storage/docker/registry/v2/repositories/openshift
      
    3. Verifique que su imagen esté en el directorio del repositorio.

      ls
      

      Salida de ejemplo

      <myimage>  nginx  ...
      

Eliminación del registro de imágenes interno

Nube privada virtual

Los despliegues del operador de registro de imágenes sólo están presentes en un Red Hat OpenShift on IBM Cloud Toolkit. Los clusters gestionados HyperShift ejecutan el operador de registro de imágenes en el plano de control.

Si no desea utilizar el registro de imágenes interno, puede completar los pasos siguientes para eliminarlo.

  1. Guarde una copia de las configuraciones de registro interno.
    oc get configs.imageregistry.operator.openshift.io cluster -o yaml > configs.yaml
    
  2. Ejecute el siguiente mandato de parche para cambiar el estado de gestión del registro de imágenes a Removed.
    kubectl patch configs.imageregistry.operator.openshift.io cluster -p '{"spec":{"managementState":"Removed"}}' --type='merge'
    
  3. Después de cambiar el estado de gestión, el servicio de registro de imágenes y el despliegue se eliminan del espacio de nombres de openshift-image-registry en el clúster. Puede ejecutar los mandatos siguientes para verificar que se han eliminado. Tenga en cuenta que sólo se eliminan el despliegue y el servicio del registro de imágenes. El despliegue y el servicio del operador del registro de imágenes permanecen.
    oc get deployment -n openshift-image-registry
    
    oc get svc -n openshift-image-registry
    

Configuración de una ruta externa segura para el registro interno

De forma predeterminada, el clúster de Red Hat OpenShift tiene un registro interno que está disponible mediante un servicio con una dirección IP interna. Si desea que el registro interno esté disponible en la red pública, puede configurar una ruta de recifrado segura. Por ejemplo, podría configurar el registro interno del clúster para actuar como registro público para despliegues en otros proyectos o clústeres.

Antes de empezar:

Para utilizar el registro interno, configure una ruta pública para acceder al registro. A continuación, cree un secreto de extracción de imágenes que incluya las credenciales para acceder al registro de forma que los despliegues en otros proyectos puedan extraer imágenes de este registro.

  1. En el proyecto openshift-image-registry, asegúrese de que existe el servicio image-registry para el registro interno.

    oc get svc -n openshift-image-registry
    

    Salida de ejemplo

    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. Cree una ruta protegida para el servicio image-registry que utiliza el reencrypt de terminación TLS. Con el recifrado, el direccionador termina la conexión TLS con un certificado y, a continuación, vuelve a cifrar la conexión al registro interno con un certificado distinto. Con este enfoque se cifra la vía de acceso completa de la conexión entre el usuario y el registro interno. Para proporcionar su propio nombre de dominio personalizado, incluya la opción --hostname.

    oc create route reencrypt --service=image-registry -n openshift-image-registry
    
  3. Recupere el nombre de host (HOST/PORT) y el valor de PORT asociados a la ruta image-registry.

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

    Salida de ejemplo

    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. Edite la ruta para establecer la estrategia de equilibrio de carga en source para que la misma dirección IP de cliente llegue al mismo servidor, como en una configuración de ruta passthrough. Puede establecer la estrategia añadiendo una anotación en la sección metadata.annotations: haproxy.router.openshift.io/balance: source. Puede editar el archivo de configuración desde la consola de la aplicación de Red Hat OpenShift o en la línea de mandatos con el mandato siguiente.

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

    Añada la anotación.

    apiVersion: route.openshift.io/v1
    kind: Route
    metadata:
    annotations:
        haproxy.router.openshift.io/balance: source
    ...
    
  5. Si las políticas de red corporativas impiden el acceso desde el sistema local a puntos finales públicos mediante proxies o cortafuegos, permite el acceso al subdominio de ruta que crea para el registro interno en los pasos siguientes.

  6. Inicie una sesión en el registro interno utilizando la ruta como nombre de host.

    docker login -u $(oc whoami) -p $(oc whoami -t) image-registry-openshift-image-registry.<cluster_name>-<ID_string>.<region>.containers.appdomain.cloud
    
  7. Ahora que ha iniciado la sesión, intente enviar una app hello-world de ejemplo al registro interno.

    1. Extraiga la imagen hello-world de DockerHub o bien cree una imagen en la máquina local.

      docker pull hello-world
      
    2. Etiquete la imagen local con el nombre de host del registro interno, el proyecto en el que desea desplegar la imagen y el nombre y la etiqueta de la imagen.

      docker tag hello-world:latest image-registry-openshift-image-registry.<cluster_name>-<ID_string>.<region>.containers.appdomain.cloud/<project>/<image_name>:<tag>
      
    3. Envíe la imagen al registro interno del clúster.

      docker push image-registry-openshift-image-registry.<cluster_name>-<ID_string>.<region>.containers.appdomain.cloud/<project>/<image_name>:<tag>
      
    4. Verifique que la imagen se haya añadido a la secuencia de imágenes de Red Hat OpenShift.

      oc get imagestream
      

      Salida de ejemplo

      NAME          DOCKER REPO                                                            TAGS      UPDATED
      hello-world   image-registry-openshift-image-registry.svc:5000/default/hello-world   latest    7 hours ago
      
  8. Para habilitar despliegues en el proyecto para extraer imágenes del registro interno, cree un secreto de extracción de imágenes en el proyecto que contiene las credenciales para acceder al registro interno. Añada el secreto de extracción de imágenes a la cuenta de servicio predeterminada de cada proyecto.

    1. Obtenga una lista de los secretos de extracción de imágenes que utiliza la cuenta de servicio predeterminada y anote el secreto que comienza por default-dockercfg.

      oc describe sa default
      

      Salida de ejemplo

      ...
      Image pull secrets:
      all-icr-io
      default-dockercfg-mpcn4
      ...
      
    2. Obtenga la información secreta codificada del campo data del archivo de configuración.

      oc get secret <default-dockercfg-name> -o yaml
      

      Salida de ejemplo

      apiVersion: v1
      data:
        .dockercfg: ey...=
      
    3. Descodifique el valor del campo data.

      echo "<ey...=>" | base64 -D
      

      Salida de ejemplo

      {"172.21.xxx.xxx:5000":{"username":"serviceaccount","password":"eyJ...
      
    4. Cree un nuevo secreto de extracción de imágenes para el registro interno.

      • secret_name: asigne un nombre al secreto de extracción de imágenes, como por ejemplo internal-registry.
      • --namespace: especifique el proyecto en el que se va a crear el secreto de extracción de imágenes, como por ejemplo default.
      • --docker-server: en lugar de la dirección IP de servicio interno (172.21.xxx.xxx:5000), especifique el nombre de host de la ruta image-registry con el puerto (image-registry-openshift-image-registry.<cluster_name>-<ID_string>.<region>.containers.appdomain.cloud:5000).
      • --docker-username: copie el valor de "username" del secreto de extracción de imágenes anterior, como por ejemplo serviceaccount.
      • --docker-password: copie el valor de "password" del secreto de extracción de imágenes anterior.
      • --docker-email: si la tiene, escriba la dirección de correo electrónico de Docker. Si no, especifique una dirección de correo ficticia como, por ejemplo, a@b.c. Este correo electrónico es necesario para crear un secreto de Kubernetes, pero no se utiliza después de la creación.
      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. Añada el secreto de extracción de imágenes a la cuenta de servicio predeterminada del proyecto.

      oc patch -n <namespace_name> serviceaccount/default --type='json' -p='[{"op":"add","path":"/imagePullSecrets/-","value":{"name":"<image_pull_secret_name>"}}]'
      
    6. Repita estos pasos para cada proyecto del que desee extraer imágenes del registro interno.

Ahora puede configurar el registro interno con una ruta accesible, puede iniciar sesión, enviar y extraer imágenes en el registro. Para obtener más información, consulte la documentación deRed Hat OpenShift.

Importación de imágenes de IBM Cloud Container Registry en la secuencia de imágenes del registro interno.

De forma predeterminada, el clúster de Red Hat OpenShift on IBM Cloud está configurado para extraer imágenes de los dominios de IBM Cloud Container Registry icr.io privados remotos en el proyecto default. Puede importar una imagen desde IBM Cloud Container Registry al registro interno de su cluster Red Hat OpenShift etiquetando la imagen como un flujo de imágenes. Con esta configuración, puede desplegar apps desde la imagen utilizando la memoria caché local del registro interno, que puede crear más rápidamente los despliegues de apps. Asimismo, los despliegues en otros proyectos pueden hacer referencia a la secuencia de imágenes para que no sea necesario crear credenciales de extracción de imágenes a IBM Cloud Container Registry en cada proyecto.

Si actualiza la imagen en IBM Cloud Container Registry, la imagen no se extrae automáticamente en el registro interno del clúster de Red Hat OpenShift. En su lugar, configure la importación periódica o repita estos pasos para etiquetar la imagen. En función de la política de extracción de imágenes que utilice en el despliegue, es posible que necesite reiniciar el despliegue.

¿Desea saber más sobre cómo las compilaciones, las secuencias de imágenes y el registro interno funcionan juntos? Lea la documentación deRed Hat OpenShifto consulte este blog sobre la gestión de imágenes de contenedor.

  1. Acceda al clúster de Red Hat OpenShift.

  2. Cambie al proyecto default para extraer la imagen en la secuencia de imágenes. El proyecto default ya está configurado con credenciales para acceder a los registros icr.io.

    oc project default
    
  3. Liste las imágenes disponibles en su IBM Cloud Container Registry. Anote el Repositorio y la Etiqueta de la imagen que desea extraer en el registro interno de su clúster de Red Hat OpenShift.

    ibmcloud cr images
    
  4. Etiquete la imagen para extraerla del espacio de nombres de IBM Cloud Container Registry y colocarla en el registro interno como una secuencia de imágenes. Para más información, consulte la documentación de Red Hat OpenShift o ejecute oc tag --help.

    oc tag <region>.icr.io/<namespace>/<image>:<tag> default/<image>:<tag> --reference-policy=local [--scheduled]
    
    • <region>.icr.io/<namespace>/<image>:<tag>: Utilice la información de Repositorio y Etiqueta que recuperó anteriormente para completar la región IBM Cloud Container Registry, el espacio de nombres, la imagen y el nombre de etiqueta de la imagen que desea extraer.
    • default/<image>:<tag>: especifique la información para la secuencia de imágenes interna que crea a partir de la imagen etiquetada de IBM Cloud Container Registry. Esta secuencia de imágenes se crea en el proyecto default, que también es el proyecto donde se crea la secuencia de imágenes cuando no se especifica ningún proyecto. Los valores de <image>:<tag> normalmente coinciden con los valores que ha recuperado anteriormente.
    • --reference-policy=local: establezca este valor a local para que se importe una copia de la imagen de IBM Cloud Container Registry en la caché local del registro interno y se ponga a disposición de los proyectos del clúster como una secuencia de imágenes. Si no se incluye este valor, la secuencia de imágenes volverá a hacer referencia a IBM Cloud Container Registry cuando se use en los despliegues y, por tanto, requerirá credenciales en el proyecto.
    • --scheduled: Establezca esta opción opcional para configurar la importación periódica de la imagen desde IBM Cloud Container Registry al registro interno. La frecuencia predeterminada es de 15 minutos. Para obtener más información, consulte la documentación deRed Hat OpenShift.
  5. Verifique que se ha creado la secuencia de imágenes.

    oc get imagestreams
    
  6. Verifique que la secuencia de imágenes haya extraído correctamente la imagen de IBM Cloud Container Registry. En la salida, compruebe que la imagen latest tagged from coincida con su imagen de * <region>.icr.io/<namespace>/<image>@<digest>.

    oc describe is/<imagestream>
    

    Salida de ejemplo

    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
    

Ahora los desarrolladores pueden utilizar la secuencia de imágenes en un despliegue de app. La imagen se compila correctamente a partir de la imagen extraída localmente en el registro interno. No es necesario definir un secreto de extracción de imágenes en el proyecto a IBM Cloud Container Registry, porque la secuencia de imágenes es local al clúster.

Configuración de compilaciones en el registro interno para enviar imágenes a IBM Cloud Container Registry

Cuando cree una compilación en su clúster Red Hat OpenShift on IBM Cloud, puede configurar el registro interno para enviar la imagen a su repositorio externo en IBM Cloud Container Registry. De forma predeterminada, el secreto de extracción de imágenes en el proyecto default del clúster solo tiene acceso de lectura para extraer imágenes de IBM Cloud Container Registry. Para enviar imágenes, debe añadir un secreto con acceso de escritura.

  1. Acceda al clúster de Red Hat OpenShift.

  2. Vaya al proyecto default.

    oc project default
    
  3. Siga los pasos para configurar una clave de API de IBM Cloud IAM con los roles de acceso al servicio de Reader y de Writer para extraer y enviar imágenes a los registros icr.io.

    Tenga en cuenta que cualquier usuario con acceso al proyecto puede utilizar este secreto para enviar imágenes a su registro privado. Es posible que desee configurar herramientas de registro y supervisión para poder observar quién hace qué acciones en el clúster.

  4. Repita el paso anterior para cada región icr.io a la que desee enviar imágenes.

  5. Añada el secreto a la cuenta de servicio de compilación y haga referencia a los secretos en el archivo de configuración de compilación. Para obtener más información, consulte la documentación deRed Hat OpenShift.

    1. Añada el secreto a la cuenta de servicio de compilación enlazando el secreto que acaba de crear con el rol de builder que utilizan todas las compilaciones del clúster.

      oc secrets link builder <secret_name>
      
    2. Obtenga una lista de las configuraciones de compilación y anote las que desea otorgar acceso de envío y de extracción sobre IBM Cloud Container Registry.

      oc get bc
      
    3. Establezca el secreto de envío de imágenes para la configuración de compilación de modo que utilice el secreto que acaba de crear con el acceso de servicio de Writer sobre IBM Cloud Container Registry.

      oc set build-secret --push bc/<build_config_name> <secret_name>
      
    4. Establezca el secreto de extracción de imágenes para la configuración de compilación para extraer del registro del que desea extraer la imagen de compilación inicial. Por ejemplo, puede utilizar el secreto que acaba de crear con el acceso de servicio de Reader sobre IBM Cloud Container Registry si la imagen de origen se encuentra en un repositorio de IBM Cloud Container Registry.

      oc set build-secret --pull bc/<build_config_name> <secret_name>
      
  6. Después de actualizar la cuenta de servicio de compilación y el archivo de configuración de compilación de modo que envíen a IBM Cloud Container Registry, reinicie la compilación.

    oc start-build <build_name>
    
  7. Obtenga el nombre del pod de compilación, por ejemplo, <build>-2-build.

    oc get pods
    
  8. Compruebe los registros de la compilación y anote dónde se ha enviado la imagen.

    oc logs <build_pod>
    

    Ejemplo de registro de un envío de imagen satisfactorio.

    ...
    Successfully pushed <region>.icr.io/<namespace>/<build_name>@sha256:<hash>
    Push successful
    
  9. Compruebe las imágenes en el registro privado para confirmar que se ha creado la imagen.

    ibmcloud cr image list
    

    Salida de ejemplo

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

La compilación de Red Hat OpenShift ahora extrae imágenes de, y envía imágenes a, IBM Cloud Container Registry.

Utilización de IBM Cloud Container Registry

De forma predeterminada, el clúster de Red Hat OpenShift on IBM Cloud está configurado para extraer imágenes de los dominios de IBM Cloud Container Registry icr.io privados remotos en el proyecto default. Si desea utilizar imágenes almacenadas en IBM Cloud Container Registry para otros proyectos, puede extraer la imagen en el registro interno en una secuencia de imágenes, o bien crear secretos de extracción de imágenes para cada registro global y regional en cada proyecto.

Para importar imágenes en el registro interno: consulte Importación de imágenes de IBM Cloud Container Registry en la secuencia de imágenes del registro interno.

Para extraer imágenes directamente desde el IBM Cloud Container Registry externo: consulte los temas siguientes.

Cómo autorizar al clúster para que pueda extraer imágenes de un registro privado

Para extraer imágenes de un registro, su clúster de Red Hat OpenShift on IBM Cloud utiliza un tipo especial de Kubernetes, un imagePullSecret. Este secreto de extracción de imágenes almacena las credenciales para acceder a un registro de contenedores.

El registro de contenedores puede ser:

  • Un espacio de nombres privado en su propio IBM Cloud Container Registry.
  • Un espacio de nombres privado en IBM Cloud Container Registry que pertenezca a otra cuenta de IBM Cloud.
  • Cualquier otro registro privado, como por ejemplo Docker.

Sin embargo, de forma predeterminada, el clúster se configura para extraer imágenes solo de los espacios de nombres de su cuenta en IBM Cloud Container Registry y para desplegar contenedores de estas imágenes en el proyecto default de Red Hat OpenShift. Si tiene que extraer imágenes en otros proyectos del clúster o de otros registros de contenedor, debe configurar sus propios secretos de extracción de imágenes.

Configuración del secreto predeterminado de extracción de imágenes

Generalmente, el clúster de Red Hat OpenShift on IBM Cloud se configura para extraer imágenes de todos los dominios de IBM Cloud Container Registry icr.io solo del proyecto default de Red Hat OpenShift. Revise las siguientes preguntas frecuentes para obtener más información sobre cómo extraer imágenes en otros proyectos o cuentas de Red Hat OpenShift, restringir el acceso de extracción o por qué su clúster podría no tener los secretos de extracción de imágenes predeterminados.

¿Cómo está configurado mi clúster para extraer imágenes del proyecto default Red Hat OpenShift?
Cuando se crea un clúster, este tiene un ID de servicio de IBM Cloud IAM al que se otorga a una política de rol de acceso al servicio de IAM de Lector sobre IBM Cloud Container Registry. Las credenciales de ID de servicio se copian en una clave de API que no caduca y que se guarda en secretos de extracción de imágenes en el clúster. Los secretos de extracción de imágenes se añaden al espacio de nombres default de Kubernetes y la lista de secretos en la cuenta de servicio default para este proyecto de Red Hat OpenShift. Mediante el uso de secretos de extracción de imágenes, los despliegues pueden extraer imágenes (acceso de solo lectura) de global y regional IBM Cloud Container Registry para desplegar contenedores en el proyecto default de Red Hat OpenShift.
  • El registro global almacena de forma segura imágenes públicas proporcionadas por IBM. Puede hacer referencia a estas imágenes públicas en todos los despliegues en lugar de tener referencias diferentes para las imágenes almacenadas en cada registro regional.
  • El registro regional almacena de forma segura sus imágenes de Docker privadas.
¿Qué pasa si no tengo secretos de extracción de imágenes en el proyecto default Red Hat OpenShift?
Puede comprobar los secretos de extracción de imágenes iniciando una sesión en el clúster y ejecutando oc get secrets -n default | grep "icr-io". Si no se muestra ningún secreto de icr, es posible que la persona que ha creado el clúster no tuviera los permisos necesarios para IBM Cloud Container Registry en IAM. Consulte Actualización de clústeres existentes para que utilicen el secreto de obtención de imágenes de clave de API.
¿Puedo restringir el acceso de pull a un determinado registro regional?
Sí, puede editar la política IAM del ID de servicio existente que restringe el rol de acceso al servicio Lector a dicho registro regional o a un recurso de registro como, por ejemplo, un espacio de nombres. Para poder personalizar las políticas IAM de registro, hay que habilitar IBM Cloudlas políticas IAM para IBM Cloud Container Registry.

Si desea proteger aún más las credenciales del registro, solicite al administrador del clúster que habilite un proveedor de servicio de gestión de claves en el clúster para cifrar los secretos de Kubernetes del clúster como, por ejemplo, el secreto de extracción de imágenes que almacena las credenciales del registro.

¿Puedo extraer imágenes de un proyecto de Red Hat OpenShift que no sea default?
No de forma predeterminada. Utilizando la configuración de clúster predeterminada, puede desplegar contenedores desde cualquier imagen almacenada en su espacio de nombres de IBM Cloud Container Registry en el proyecto default de Red Hat OpenShift del clúster. Para utilizar estas imágenes en cualquier otro proyecto de Red Hat OpenShift o en otras cuentas de IBM Cloud, tiene la opción de copiar o crear sus propios secretos de extracción de imágenes.
¿Puedo extraer imágenes de otra cuenta de IBM Cloud?
Sí, cree una clave de API en la cuenta de IBM Cloud que desea utilizar. A continuación, en cada proyecto de cada clúster del que desee extraer imágenes de la cuenta de IBM Cloud, cree un secreto que contenga la clave de API. Para obtener más información, siga con este ejemplo en el que se utiliza una clave de API de ID de servicio autorizada.

Para utilizar un registro que no sea de IBM Cloud, como por ejemplo Docker, consulte Acceso a imágenes almacenadas en otros registros privados.

¿Es necesario que la clave API corresponda a un ID de servicio? ¿Qué ocurre si llego al límite de ID de servicio de mi cuenta?
La configuración de clúster predeterminada crea un ID de servicio para almacenar las credenciales de clave de API de IBM Cloud IAM en el secreto de extracción de imágenes. No obstante, también puede crear una clave de API para un usuario individual y almacenar esas credenciales en un secreto de extracción de imágenes. Si llega al límite de ID de servicio de IAM, el clúster se crea sin ID de servicio ni secreto de extracción de imágenes y no puede extraer imágenes de los dominios de registro de icr.io de forma predeterminada. Debe crear su propio secreto de extracción de imágenes, pero utilizando una clave de API para un usuario individual como, por ejemplo, un ID funcional, no un ID de servicio de IBM Cloud IAM.
Veo los secretos de extracción de imágenes para los dominios del registro regional y para todos los dominios del registro. ¿Cuál utilizo?
Anteriormente, Red Hat OpenShift on IBM Cloud creaba secretos de extracción de imágenes independientes para cada dominio de registro icr.io público regional. Ahora, todos los dominios de registro icr.io públicos y privados para todas las regiones se almacenan en un único secreto de extracción de imágenes all-icr-io que se crea automáticamente en el proyecto default de Kubernetes del clúster.

Para que las cargas de trabajo en otros espacios de nombres de Kubernetes del clúster puedan extraer imágenes de contenedor de un registro privado, ahora puede copiar solo el secreto de extracción de imágenes all-icr-io para dicho proyecto de Kubernetes. A continuación, especifique el secreto all-icr-io en la cuenta de servicio o en el despliegue. Ya no es necesario copiar el secreto de extracción de imágenes que corresponde al registro regional de la imagen. Además, recuerde que no necesita secretos de extracción de de imágenes para los registros públicos, que no requieren autenticación.

Después de copiar o crear una imagen pull secret en otro proyecto de Red Hat OpenShift, ¿he terminado?
No del todo. Los contenedores deben tener autorización para extraer imágenes utilizando el secreto que ha creado. Puede añadir el secreto de extracción de imágenes a la cuenta de servicio para el espacio de nombres, o bien puede hacer referencia al secreto en cada despliegue. Para obtener instrucciones, consulte Utilización del secreto de extracción de imágenes para desplegar contenedores.

Conexión de red privada con los registros icr.io

Cuando configure la cuenta de IBM Cloud de modo que utilice puntos finales de servicio, puede utilizar una conexión de red privada para enviar imágenes a IBM Cloud Container Registry y para extraer imágenes del mismo.

¿Qué debo hacer para configurar mi clúster de modo que utilice la conexión privada con los registros de icr.io ?

  1. Habilite una función de direccionador virtual (VRF) para la cuenta de infraestructura de IBM Cloud para poder utilizar el punto final de servicio en la nube privado de IBM Cloud Container Registry. Para habilitar VRF, consulte Habilitación de VRF. Para comprobar si un VRF ya está habilitado, utilice el mandato ibmcloud account show.
  2. Habilite la cuenta de IBM Cloud para que utilice puntos finales de servicio.

IBM Cloud Container Registry utiliza automáticamente el punto final del servicio de nube privada. No es necesario habilitar el punto final de servicio de nube privada para los clústeres de Red Hat OpenShift on IBM Cloud.

Actualización de clústeres existentes para que utilicen el secreto de obtención de imágenes de clave de API

Los nuevos clústeres de Red Hat OpenShift on IBM Cloud almacenan una clave de API en un secreto de extracción de imágenes para autorizar el acceso a IBM Cloud Container Registry. Con estos secretos de extracción de imágenes, puede desplegar contenedores desde imágenes almacenadas en los dominios de registro icr.io. Puede añadir los secretos de extracción de la imagen al clúster si el clúster no se ha creado con los secretos.

Antes de empezar

  1. Acceda al clúster de Red Hat OpenShift.

  2. Asegúrese de tener los siguientes permisos: rol de acceso a plataforma IBM Cloud IAM Operador o Administrador de Red Hat OpenShift on IBM Cloud. El propietario de la cuenta podrá asignarle el rol ejecutando el siguiente comando.

    ibmcloud iam user-policy-create EMAIL --service-name containers-kubernetes --roles "Administrator,Operator"
    
  3. Rol de acceso a la plataforma Administrador de IBM Cloud IAM para IBM Cloud Container Registry, en todas las regiones y grupos de recursos. La política no se puede circunscribir a una región o grupo de recursos en particular. El propietario de la cuenta podrá asignarle el rol ejecutando el siguiente comando.

    Compruebe que el secreto se ha creado correctamente

    ibmcloud iam user-policy-create <your_user_email> --service-name container-registry --roles Administrator
    
  4. Si su cuenta restringe la creación del ID de servicio, añada el rol de Creador de ID de servicio a Identity and Access Management en la consola (iam-identity en la API o CLI).

  5. Si su cuenta restringe la creación de claves de API, añada el rol de Creador de claves de API de usuario a Identity and Access Management en la consola (iam-identity en la API o CLI).

Actualización del secreto de extracción de imágenes

Para actualizar el secreto de extracción de imágenes en el espacio de nombres Kubernetes default:

  1. Obtenga el ID del clúster.

    ibmcloud oc cluster ls
    
  2. Ejecute el mandato siguiente para crear un ID de servicio para el clúster y asigne al ID de servicio el rol de acceso al servicio de IAM de Lector sobre IBM Cloud Container Registry. El mandato también crea una clave de API para suplantar las credenciales de ID de servicio y almacena la clave de API en un secreto de extracción de imágenes de Kubernetes en el clúster. El secreto de extracción de imágenes está en el proyecto default de Red Hat OpenShift.

    ibmcloud oc cluster pull-secret apply --cluster <cluster_name_or_ID>
    

    Cuando ejecuta este mandato, se inicia la creación de credenciales de IAM y de secretos de extracción de imágenes, que puede tardar un rato en finalizar. No puede desplegar contenedores que extraigan una imagen de los dominios de IBM Cloud Container Registry icr.io hasta que se creen los secretos de extracción de imágenes.

  3. Verifique que los secretos de extracción de imágenes se han creado en el clúster.

    oc get secrets | grep icr-io
    

    Salida de ejemplo

    all-icr-io           kubernetes.io/dockerconfigjson        1         16d
    
  4. Actualice los despliegues de contenedor para que extraigan imágenes del nombre de dominio icr.io.

  5. Opcional: Si tiene un cortafuegos, asegúrese de que permite el tráfico de red de salida a las subredes de registro para los dominios que utiliza.

  6. Complete la configuración utilizando una de las opciones siguientes.

Uso de un secreto de extracción de imágenes para acceder a imágenes en registros privados externos

Configure su propio secreto de extracción de imágenes en su clúster para desplegar contenedores en proyectos de Red Hat OpenShift que no sean default, para utilizar imágenes almacenadas en otras cuentas de IBM Cloud o para utilizar imágenes almacenadas en registros privados externos. Además, puede crear su propio secreto de extracción de imágenes para aplicar políticas de acceso de IAM que restrinjan los permisos a determinados espacios de nombres de imágenes de registro o acciones (como por ejemplo push o pull).

Después de crear el secreto de extracción de imágenes, los contenedores deben utilizar el secreto para que reciban autorización para extraer una imagen del registro. Puede añadir el secreto de extracción de imágenes a la cuenta de servicio para el proyecto, o bien puede hacer referencia al secreto en cada despliegue. Para obtener instrucciones, consulte Utilización del secreto de extracción de imágenes para desplegar contenedores.

Los secretos de extracción de imágenes solo son válidos para los proyectos de Red Hat OpenShift para los que fueron creados. Repita estos pasos para cada espacio de nombres en el que desee desplegar contenedores.

Antes de empezar:

  1. Configure un espacio de nombres en IBM Cloud Container Registry y envíe imágenes a este espacio de nombres.
  2. Cree un clúster.
  3. Acceda al clúster de Red Hat OpenShift.

Para utilizar su propio secreto de extracción de imágenes, elija una de las opciones siguientes:

Si ya ha creado un secreto de extracción de imágenes en el proyecto que desea utilizar en el despliegue, consulte Despliegue de contenedores mediante el imagePullSecret creado.

Copiar un secreto de extracción de imágenes existente

Puede copiar un secreto de extracción de imágenes, como el que se crea automáticamente para el proyecto default de Red Hat OpenShift a otros proyectos en el clúster. Pero si desea utilizar diferentes credenciales de clave de API de IBM Cloud IAM para este proyecto, como por ejemplo para restringir el acceso a proyectos específicos o para extraer imágenes de otras cuentas de IBM Cloud, se recomienda que cree un secreto de extracción de imágenes.

  1. Obtenga una lista de los proyectos de Red Hat OpenShift disponibles en el clúster, o cree un proyecto para utilizar.

    oc get projects
    

    Salida de ejemplo

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

    Para crear un proyecto:

    oc new-project <project_name>
    
  2. Obtenga una lista de los secretos de extracción de imágenes existentes en el proyecto default de Red Hat OpenShift para IBM Cloud Container Registry.

    oc get secrets -n default | grep icr-io
    

    Salida de ejemplo

    all-icr-io          kubernetes.io/dockerconfigjson        1         16d
    
  3. Copie el secreto de extracción de imágenes all-icr-io del proyecto default en el proyecto que elija. Los nuevos secretos de extracción de imágenes se denominan <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. Verifique que los secretos se han creado correctamente.

    oc get secrets -n <project_name> | grep icr-io
    
  5. Para desplegar contenedores, añada el secreto de extracción de imágenes a cada despliegue o a la cuenta de servicio del proyecto de forma que cualquier despliegue del proyecto pueda extraer imágenes del registro.

Creación de un secreto de extracción de imágenes con distintas credenciales de clave de API de IAM

Puede asignar políticas de acceso de IBM Cloud IAM a usuarios o a un ID de servicio para restringir los permisos a determinados espacios de nombres de imágenes de registro o acciones (como por ejemplo push o pull). A continuación, cree una clave de API y almacene estas credenciales de registro en un secreto de extracción de imágenes para el clúster.

Por ejemplo, para acceder a las imágenes de otras cuentas de IBM Cloud, cree una clave de API que almacene las credenciales de IBM Cloud Container Registry de un usuario o un ID de servicio en dicha cuenta. A continuación, en la cuenta de su clúster, guarde las credenciales de clave de API en un secreto de extracción de imágenes para cada clúster y cada proyecto de clúster.

En los pasos siguientes se crea una clave de API que almacena las credenciales de un ID de servicio de IBM Cloud IAM. En lugar de utilizar un ID de servicio, es posible que desee crear una clave de API para un ID de usuario que tenga una política de acceso al servicio de IBM Cloud IAM sobre IBM Cloud Container Registry. Sin embargo, asegúrese de que el usuario sea un ID funcional o tenga un plan para que el clúster pueda acceder al registro en el caso de que el usuario se vaya.

  1. Obtenga una lista de los proyectos de Red Hat OpenShift disponibles en el clúster, o cree un proyecto para utilizar donde desea desplegar los contenedores desde las imágenes de registro.

    oc get projects
    

    Salida de ejemplo

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

    Para crear un proyecto:

    oc new-project <project_name>
    
  2. Cree un ID de servicio de IBM Cloud IAM para el clúster que se utiliza para las políticas de IAM y las credenciales de clave de API en el secreto de extracción de imágenes. Asegúrese de proporcionar al ID de servicio una descripción que le ayude a recuperar el ID de servicio posteriormente; por ejemplo, puede incluir el nombre del clúster y el del proyecto.

    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. Cree una política de IBM Cloud IAM personalizada para el ID de servicio del clúster que otorgue acceso a 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
    Obligatorio. Sustitúyalo por el ID de servicio de <cluster_name>-<kube_namespace>-id que ha creado anteriormente para el clúster de Kubernetes.
    --service-name container-registry
    Obligatorio. Especifique container-registry para que la política de IAM se aplique a IBM Cloud Container Registry.
    --roles <service_access_role>
    Obligatorio. Especifique el rol de acceso al servicio de IBM Cloud Container Registry del acceso del ID de servicio. Los valores posibles son Reader, Writer y Manager.
    --region <IAM_region>
    Opcional. Si desea limitar la política de acceso a determinadas regiones de IAM, especifique las regiones en una lista separada por comas. Los valores posibles son global y las regiones de registro local.
    --resource-type namespace --resource <registry_namespace>
    Opcional. Si desea limitar el acceso sólo a imágenes de determinados espacios de nombres de IBM Cloud Container Registry, especifique namespace para el tipo de recurso y especifique <registry_namespace>. Para ver una lista de los espacios de nombres, ejecute ibmcloud cr namespaces.
  4. Cree una clave de API para el ID de servicio. Asigne a la clave API un nombre similar al de su ID de servicio e incluya el ID de servicio que creó anteriormente, <cluster_name>-<kube_namespace>-id. Asegúrese de especificar para la clave de API una descripción que le ayude a recuperar la clave posteriormente.

    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. Retrieve your API Key value from the output of the previous command.

    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. Cree un secreto de extracción de imágenes para almacenar las credenciales de clave de API en el proyecto del clúster. Repita este paso para cada proyecto de cada clúster de cada dominio icr.io del que desea extraer de imágenes.

    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>
    Obligatorio. Especifique el proyecto de Red Hat OpenShift del clúster que ha utilizado para el nombre de ID de servicio.
    <secret_name>
    Obligatorio. Especifique un nombre para el secreto de extracción de imágenes.
    --docker-server <registry_URL>
    Obligatorio. Establezca el URL en el registro de imágenes en el que se ha configurado el espacio de nombres de registro. Para los dominios disponibles, consulte Regiones locales.
    --docker-username iamapikey
    Obligatorio. Especifique el nombre de usuario para iniciar una sesión en su registro privado. Si utiliza IBM Cloud Container Registry, especifique iamapikey.
    --docker-password <token_value>
    Obligatorio. Especifique el valor de API Key que ha recuperado anteriormente.
    --docker-email <docker-email>
    Obligatorio. Si tiene una, especifique la dirección de correo electrónico de Docker. Si no, especifique una dirección de correo ficticia como, por ejemplo, a@b.c. Este correo electrónico es necesario para crear un secreto de Kubernetes, pero no se utiliza después de la creación.
  7. Verifique que el secreto se haya creado correctamente. Sustituya <project> por el project donde ha creado el secreto de extracción de imagen.

    oc get secrets --namespace <project>
    
  8. Añada el secreto de extracción de imágenes a una cuenta de servicio de Kubernetes para que cualquier pod del proyecto pueda utilizar el secreto de extracción de imágenes cuando despliegue un contenedor.

Acceso a imágenes almacenadas en otros registros privados

Si ya tiene un registro privado, debe almacenar las credenciales del registro en un secreto de extracción de imágenes de Kubernetes y hacer referencia a dicho secreto en su archivo de configuración.

Antes de empezar:

  1. Cree un clúster.
  2. Acceda al clúster de Red Hat OpenShift.

Para crear un secreto de extracción de imágenes:

  1. Cree el secreto de Kubernetes para almacenar las credenciales del registro privado.

    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>
    Obligatorio. El proyecto de Red Hat OpenShift del clúster en el que desea utilizar el secreto y desplegar los contenedores. Para obtener una lista de los proyectos disponibles del clúster, ejecute el mandato oc get projects.
    <secret_name>
    Obligatorio. El nombre que desea utilizar para su secreto de extracción de imágenes.
    --docker-server <registry_URL>
    Obligatorio. El URL al registro en el que se están almacenadas sus imágenes privadas.
    --docker-username <docker_username>
    Obligatorio. El nombre de usuario para iniciar sesión en el registro privado.
    --docker-password <token_value>
    Obligatorio. La contraseña para iniciar una sesión en su registro privado, como por ejemplo un valor de clave.
    --docker-email <docker-email>
    Obligatorio. Si tiene una, especifique la dirección de correo electrónico de Docker. Si no tiene ninguna, escriba una dirección de correo electrónico ficticia, como por ejemplo a@b.c. Este correo electrónico es necesario para crear un secreto de Kubernetes, pero no se utiliza después de la creación.
  2. Verifique que el secreto se haya creado correctamente. Sustituya <project> por el nombre del proyecto donde ha creado el secreto de extracción de imágenes.

    oc get secrets --namespace <project>
    
  3. Cree un pod que haga referencia al secreto de extracción de imágenes.

Utilización del secreto de extracción de imágenes para desplegar contenedores

Puede definir un secreto de extracción de imágenes en el despliegue del pod o almacenar el secreto de extracción de imágenes en su cuenta de servicio de Kubernetes, para que esté disponible para todos los despliegues que no especifiquen una cuenta de servicio de Kubernetes en el proyecto.

Para planificar cómo se usan los secretos de extracción en el clúster, elija una de las opciones siguientes.

  • En referencia al secreto de extracción de imágenes en el despliegue del pod: utilice esta opción si no desea otorgar acceso a su registro para todos los pods del proyecto de forma predeterminada. Los desarrolladores pueden incluir el secreto de extracción de imágenes en cada despliegue de pod que deba acceder al registro.
  • Almacenar el secreto de extracción de imágenes en la cuenta de servicio de Kubernetes: utilice esta opción para otorgar acceso a las imágenes en su registro para todos los despliegues en los proyectos de Red Hat OpenShift seleccionados. Para almacenar un secreto de extracción de imágenes en la cuenta de servicio de Kubernetes, siga los pasos siguientes.

Almacenamiento del secreto de extracción de imágenes en la cuenta de servicio de Kubernetes para el proyecto seleccionado

Cada proyecto de Red Hat OpenShift tiene una cuenta de servicio de Kubernetes que se denomina default. Dentro del proyecto, puede añadir el secreto de extracción de imágenes a esta cuenta de servicio para otorgar acceso a los pods para extraer imágenes del registro. Los despliegues que no especifican una cuenta de servicio utilizan automáticamente la cuenta de servicio de default para este proyecto de Red Hat OpenShift.

  1. Compruebe si ya existe un secreto de extracción de imágenes para la cuenta de servicio predeterminada.

    oc describe serviceaccount default -n <project_name>
    

    Cuando se visualiza <none> en la entrada secretos de extracción de imágenes, no existe ningún secreto de extracción de imágenes.

  2. Añada el secreto de extracción de imágenes a su cuenta de servicio predeterminada.

    • Ejemplo de comando de adición de un secreto de extracción de imágenes cuando no hay definido ningún secreto de extracción de imágenes.

      oc patch -n <project_name> serviceaccount/default -p '{"imagePullSecrets":[{"name": "<image_pull_secret_name>"}]}'
      
    • Ejemplo de comando de adición de un secreto de extracción de imágenes cuando ya hay definido un secreto de extracción de imágenes.

      oc patch -n <project_name> serviceaccount/default --type='json' -p='[{"op":"add","path":"/imagePullSecrets/-","value":{"name":"<image_pull_secret_name>"}}]'
      
  3. Verifique que su secreto de extracción de imágenes se ha añadido a la cuenta de servicio predeterminada.

    oc describe serviceaccount default -n <project_name>
    

    Salida de ejemplo

    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 Secretos de extracción de imágenes indica <secret> (not found), ejecute oc get secrets -n project para verificar que el secreto de extracción de imágenes exista en el mismo proyecto que la cuenta de servicio.

  4. Cree un archivo de configuración de pod denominado mypod.yaml para desplegar un contenedor a partir de una imagen del registro.

    apiVersion: v1
    kind: Pod
    metadata:
      name: mypod
    spec:
      containers:
        - name: mypod-container
          image: <region>.icr.io/<project>/<image>:<tag>
    
  5. Cree el pod en el clúster aplicando el archivo de configuración mypod.yaml.

    oc apply -f mypod.yaml
    

Configuración de un clúster para extraer software autorizado

Puede configurar su clúster de Red Hat OpenShift on IBM Cloud de modo que extraiga software autorizado, que es una colección de imágenes de contenedor protegidas empaquetadas en diagramas de Helm y cuya licencia de uso proporciona IBM. El software autorizado se almacena en un dominio cp.icr.io de IBM Cloud Container Registry especial. Para acceder a este dominio, debe crear un secreto de extracción de imágenes con una clave de titularidad para el clúster y añadir este secreto de extracción de imágenes a la cuenta de servicio de Kubernetes de cada proyecto en el que desee desplegar este software autorizado.

Antes de empezar: acceda al clúster de Red Hat OpenShift.

  1. Obtenga la clave de autorización para la biblioteca de software autorizado.

    1. Inicie sesión en MyIBM.com y desplácese hasta la sección Biblioteca de software de contenedores. Pulse Ver biblioteca.
    2. En la página Acceder al software de contenedor > Claves de titularidad, pulse Copiar clave. Esta clave autoriza el acceso a todo el software autorizado de la biblioteca de software del contenedor.
  2. En el proyecto en el que desea desplegar los contenedores autorizados, cree un secreto de extracción de imágenes para poder acceder al registro de titularidad cp.icr.io. Utilice la clave de titularidad que ha recuperado anteriormente como el valor de --docker-password. Para obtener más información, consulte Acceso a imágenes almacenadas en otros registros privados.

    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. Añada el secreto de extracción de imágenes a la cuenta de servicio del proyecto para que cualquier contenedor del espacio de nombres pueda utilizar la clave de titularidad para extraer imágenes autorizadas. Para obtener más información, consulte Utilización del secreto de extracción de imágenes para desplegar contenedores.

    oc patch -n <project> serviceaccount/default --type='json' -p='[{"op":"add","path":"/imagePullSecrets/-","value":{"name":"entitled-cp-icr-io"}}]'
    
  4. Cree un pod en el proyecto que cree un contenedor a partir de una imagen del registro autorizado.

    oc run <pod_name> --image=cp.icr.io/<image_name> -n <project> --generator=run-pod/v1
    
  5. Compruebe que el contenedor ha podido crear correctamente desde la imagen autorizada verificando que el pod se encuentra en el estado Running.

    oc get pod <pod_name> -n <project>
    

¿Se pregunta qué hacer a continuación? Puede configurar el repositorio de diagramas de Helm entitled, donde se guardan los diagramas de Helm que incorporan software autorizado. Si ya tiene Helm instalado en el clúster, ejecute helm repo add entitled https://raw.githubusercontent.com/IBM/charts/master/repo/entitled.

Adición de un registro privado al secreto de extracción global

Nodos trabajadores RHEL

En los clústeres que sólo utilizan nodos trabajadores RHEL, puede configurar un secreto de extracción de imágenes global que cada nodo trabajador del clúster puede utilizar para extraer imágenes de un registro privado.

De forma predeterminada, el clúster de Red Hat OpenShift on IBM Cloud tiene un secreto de extracción de imágenes global para los siguientes registros, de modo que se puedan desplegar los componentes predeterminados de Red Hat OpenShift.

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

No sustituya el secreto de extracción global por un secreto de extracción que no tenga credenciales en los registros de Red Hat predeterminados. Si lo hace, los componentes de Red Hat OpenShift predeterminados que están instalados en el clúster como, por ejemplo, OperatorHub, pueden fallar porque no pueden extraer imágenes de estos registros.

Antes de empezar:

Para añadir registros privados, edite el pull-secret global en el proyecto openshift-config.

  1. Cree un valor de secreto que tenga las credenciales para acceder al registro privado y almacene el valor de secreto decodificado en un archivo JSON. Cuando se crea el valor de secreto, las credenciales se codifican automáticamente en base64. Mediante la opción --dry-run, solo se crea el valor de secreto y no se crea ningún objeto secreto en el clúster. A continuación, el valor de secreto decodificado se almacena en un archivo JSON para utilizarlo más adelante en el secreto de extracción 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>
    Obligatorio. El proyecto de Red Hat OpenShift del clúster en el que desea utilizar el secreto y desplegar los contenedores. Para obtener una lista de los proyectos disponibles del clúster, ejecute el mandato oc get ns.
    <secret_name>
    Obligatorio. El nombre que desea utilizar para su secreto de extracción de imágenes.
    --docker-server <registry_URL>
    Obligatorio. El URL al registro en el que se están almacenadas sus imágenes privadas.
    --docker-username <docker_username>
    Obligatorio. El nombre de usuario para iniciar sesión en el registro privado.
    --docker-password <token_value>
    Obligatorio. La contraseña para iniciar una sesión en su registro privado, como por ejemplo un valor de clave.
    --docker-email <docker-email>
    Obligatorio. Si tiene una, especifique la dirección de correo electrónico de Docker. Si no tiene ninguna, escriba una dirección de correo electrónico ficticia, como por ejemplo a@b.c. Este correo electrónico es necesario para crear un secreto de Kubernetes, pero no se utiliza después de la creación.
    --dry-run=true
    Incluya esta opción para crear sólo el valor secreto, y no crear y almacenar el objeto secreto en su cluster.
    --output="jsonpath={.data.\.dockerconfigjson}"
    Obtenga solo el valor de .dockerconfigjson de la sección de datos del secreto de Kubernetes.
    | base64 --decode > myregistryconfigjson
    Descargue los datos secretos decodificados en un archivo myregistryconfigjson local.
  2. Recupere el valor de secreto decodificado del secreto de extracción global predeterminado y almacene el valor en un archivo dockerconfigjson.

    oc get secret pull-secret -n openshift-config --output="jsonpath={.data.\.dockerconfigjson}" | base64 --decode > dockerconfigjson
    
  3. Combine el archivo myregistryconfigjson del secreto de extracción de registro privado descargado con el archivo dockerconfigjson del secreto de extracción global predeterminado.

    jq -s '.[0] * .[1]' dockerconfigjson myregistryconfigjson > dockerconfigjson-merged
    
  4. Actualice el secreto de extracción global con el archivo combinado dockerconfigjson-merged.

    oc set data secret/pull-secret -n openshift-config --from-file=.dockerconfigjson=dockerconfigjson-merged
    
  5. Verifique que el secreto de extracción global se ha actualizado. Compruebe que el registro privado y cada uno de los registros de Red Hat predeterminados estén en la salida del mandato siguiente.

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

    Salida de ejemplo

    {
        "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. Para seleccionar los cambios de configuración globales, vuelva a cargar todos los nodos de trabajador del clúster.

    1. Anote el ID de los nodos trabajadores del clúster.

      ibmcloud oc worker ls -c <cluster_name_or_ID>
      
    2. Para clústeres clásicos Vuelva a cargar cada nodo trabajador. Puedes recargar varios nodos trabajadores incluyendo varias opciones -w, pero asegúrate de dejar suficientes nodos trabajadores funcionando al mismo tiempo para que tus aplicaciones eviten una interrupción.

      ibmcloud oc worker reload -c <cluster_name_or_ID> -w <workerID_1> -w <workerID_2>
      
    3. Para clústeres de VPC Sustituya cada nodo trabajador. Antes de empezar, asegúrese de que el clúster tenga suficientes otros nodos trabajadores para que sus pods puedan reprogramarse y continuar ejecutándose.

      ibmcloud oc worker replace --cluster <cluster_name_or_ID> --worker <worker_node_ID>
      
  7. Cuando los nodos trabajadores vuelvan a estar en buen estado, verifique que el secreto de extracción global se actualiza en un nodo trabajador.

    1. Inicie un pod de depuración para iniciar la sesión en un nodo trabajador. Utilice la IP privada que ha recuperado anteriormente para <node_name>.

      oc debug node/<node_name>
      
    2. Cambie el directorio raíz por el host para poder ver los archivos en el nodo trabajador.

      chroot /host
      
    3. Verifique que el archivo de configuración de Docker tiene unas credenciales de registro que coinciden con el secreto de extracción global que ha definido.

      vi /.docker/config.json
      

Actualización del pull secret global

Nodos trabajadores RHCOS Nodos trabajadores RHEL

En los clústeres que utilizan trabajadores RHCOS o una combinación de trabajadores RHCOS y RHEL, puede realizar los siguientes pasos para actualizar el pull secret global en su clúster Red Hat OpenShift on IBM Cloud.

De forma predeterminada, el clúster de Red Hat OpenShift on IBM Cloud tiene un secreto de extracción de imágenes global para los siguientes registros, de modo que se puedan desplegar los componentes predeterminados de Red Hat OpenShift.

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

No sustituya el secreto de extracción global por un secreto de extracción que no tenga credenciales en los registros de Red Hat predeterminados. Si lo hace, los componentes de Red Hat OpenShift predeterminados que están instalados en el clúster como, por ejemplo, OperatorHub, pueden fallar porque no pueden extraer imágenes de estos registros.

  1. Cree un secreto que contenga las credenciales del registro que desea utilizar.
    oc create secret docker-registry docker-auth-secret \
    --docker-server=REGISTRY \
    --docker-username=USERNAME \
    --docker-password=PASSWORD \
    --namespace kube-system
    
    Mandato create secret de ejemplo.
    oc create secret docker-registry docker-auth-secret \
    --docker-server=REGISTRY \
    --docker-username=cp \
    --docker-password=ENTITLEMENT-KEY \
    --namespace kube-system
    
  2. Crea un DaemonSet para aplicar el secreto en todos los nodos trabajadores.
    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: icr.io/ibm/alpine:latest
              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: icr.io/ibm/alpine:latest
              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. Compruebe que los pods se están ejecutando.
    oc get daemonset -n kube-system update-docker-config
    

Actualización de una configuración de registro personalizado de containerd de IBM Cloud Kubernetes Service

Con Kubernetes versión 1.22 o posterior, puede utilizar archivos de configuración de containerd en nodos de trabajador para configurar la extracción de un registro de contenedor. Puede utilizar un daemonset para actualizar las configuraciones en todos los nodos de un clúster, y así evitar que las configuraciones se borren cuando se vuelvan a cargar los nodos de trabajador o cuando se añadan nuevos trabajadores.

Ejemplo de daemonset para actualizar una configuración de registro personalizado de containerd

Utilice el archivo YAML de ejemplo para definir un daemonset que se ejecute en todos los nodos de trabajador para establecer o actualizar una configuración de host de registro de containerd y montarla en la correspondiente vía de acceso de registro de containerd.

El ejemplo establece la siguiente configuración de host de registro para dockerhub. Esta configuración de host de registro ya se ha proporcionado y configurado automáticamente durante la fase de suministro de trabajadores. El contenedor init inicializa hosts.toml en cada nodo trabajador tras el despliegue y tras la recarga o reinicio de los nodos trabajadores.

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

Archivo YAML de ejemplo:

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/

Para obtener más información sobre cómo actualizar una configuración de host de registro containerd, consulte la documentación de containerd.