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 registroicr.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:
- Cómo empezar con IBM Cloud Container Registry.
- Importación de imágenes de IBM Cloud Container Registry en la secuencia de imágenes del registro interno.
- Utilización de IBM Cloud Container Registry.
- 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 enemptyDir
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.
- Acceda al clúster de Red Hat OpenShift.
- 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 utilizaremptyDir
no elimina la PVC original del registro de imágenes.oc patch configs.imageregistry.operator.openshift.io/cluster --type merge --patch '{"spec":{"storage":{"emptyDir":{}}}}'
- 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 aManaged
. Ahora el operador actualiza el pod del registro interno.oc patch configs.imageregistry.operator.openshift.io/cluster --type merge -p '{"spec":{"managementState":"Managed"}}'
- Obtenga los detalles del pod del registro interno para que pueda verificar sus actualizaciones.
-
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
-
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. -
Obtenga el UID del pod
image-registry
en la secciónmetadata.uid
del archivo YAML del pod (no el UID del conjunto de réplicas en la secciónmetadata.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 ...
-
- Compruebe que el registro interno almacena datos en el
emptyDir
del nodo trabajador.-
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. -
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
-
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.
- Guarde una copia de las configuraciones de registro interno.
oc get configs.imageregistry.operator.openshift.io cluster -o yaml > configs.yaml
- 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'
- 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:
- Confirme que tenga el rol de acceso del servicio de IAM de Gestor IBM Cloud para el clúster.
- Asegúrese de que su clúster tenga conectividad a la red pública para exponer el registro interno con una ruta pública.
- Instale Docker en la máquina local.
- Acceda al clúster de Red Hat OpenShift.
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.
-
En el proyecto
openshift-image-registry
, asegúrese de que existe el servicioimage-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
-
Cree una ruta protegida para el servicio
image-registry
que utiliza elreencrypt
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
-
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
-
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ónmetadata.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 ...
-
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.
-
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
-
Ahora que ha iniciado la sesión, intente enviar una app
hello-world
de ejemplo al registro interno.-
Extraiga la imagen
hello-world
de DockerHub o bien cree una imagen en la máquina local.docker pull hello-world
-
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>
-
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>
-
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
-
-
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.
-
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 ...
-
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...=
-
Descodifique el valor del campo
data
.echo "<ey...=>" | base64 -D
Salida de ejemplo
{"172.21.xxx.xxx:5000":{"username":"serviceaccount","password":"eyJ...
-
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 ejemplointernal-registry
.--namespace
: especifique el proyecto en el que se va a crear el secreto de extracción de imágenes, como por ejemplodefault
.--docker-server
: en lugar de la dirección IP de servicio interno (172.21.xxx.xxx:5000
), especifique el nombre de host de la rutaimage-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 ejemploserviceaccount
.--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
-
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>"}}]'
-
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.
-
Cambie al proyecto
default
para extraer la imagen en la secuencia de imágenes. El proyectodefault
ya está configurado con credenciales para acceder a los registrosicr.io
.oc project default
-
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
-
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 proyectodefault
, 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 alocal
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.
-
Verifique que se ha creado la secuencia de imágenes.
oc get imagestreams
-
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.
-
Vaya al proyecto
default
.oc project default
-
Siga los pasos para configurar una clave de API de IBM Cloud IAM con los roles de acceso al servicio de
Reader
y deWriter
para extraer y enviar imágenes a los registrosicr.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.
-
Repita el paso anterior para cada región
icr.io
a la que desee enviar imágenes. -
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.
-
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>
-
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
-
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>
-
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>
-
-
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>
-
Obtenga el nombre del pod de compilación, por ejemplo,
<build>-2-build
.oc get pods
-
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
-
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.
- Visión general sobre cómo autorizar al clúster para extraer imágenes de un registro.
- Copia del secreto
all-icr-io
desde el proyectodefault
en el proyecto del que desea extraer imágenes. - Creación de su propio secreto de extracción de imágenes.
- Adición del secreto de extracción de imágenes a su configuración de despliegue o a la cuenta de servicio del proyecto.
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 serviciodefault
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 proyectodefault
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 deicr
, 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 registroicr.io
públicos y privados para todas las regiones se almacenan en un único secreto de extracción de imágenesall-icr-io
que se crea automáticamente en el proyectodefault
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
?
- 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
. - 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
-
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"
-
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
-
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). -
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
:
-
Obtenga el ID del clúster.
ibmcloud oc cluster ls
-
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. -
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
-
Actualice los despliegues de contenedor para que extraigan imágenes del nombre de dominio
icr.io
. -
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.
-
Complete la configuración utilizando una de las opciones siguientes.
- Para extraer imágenes en proyectos de Red Hat OpenShift que no sean
default
o de otras cuentas de IBM Cloud, copie o cree otro secreto de extracción de imágenes. - Para restringir el acceso al secreto de extracción de imágenes a determinados recursos de registro, como por ejemplo espacios de nombres o regiones:
- Asegúrese de que las políticas de IBM Cloud IAM para IBM Cloud Container Registry estén habilitadas.
- Edite las políticas de IBM Cloud IAM para el ID de servicio o cree otro secreto de extracción de imágenes.
- Para extraer imágenes en proyectos de Red Hat OpenShift que no sean
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:
- Configure un espacio de nombres en IBM Cloud Container Registry y envíe imágenes a este espacio de nombres.
- Cree un clúster.
- 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:
- Copie el secreto de extracción de imágenes del proyecto predeterminado de Red Hat OpenShift a otros proyectos de su clúster.
- Cree nuevas credenciales de API de IAM y almacénelas en un secreto de obtención de imágenes para acceder a las imágenes de otras cuentas de IBM Cloud o para aplicar políticas IAM que restrinjan el acceso a determinados dominios de registro o espacios de nombres.
- Crear un secreto de extracción de imágenes para acceder a imágenes en registros privados externos.
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.
-
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>
-
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
-
Copie el secreto de extracción de imágenes
all-icr-io
del proyectodefault
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 -
-
Verifique que los secretos se han creado correctamente.
oc get secrets -n <project_name> | grep icr-io
-
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.
-
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>
-
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>"
-
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
yManager
. --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, ejecuteibmcloud cr namespaces
.
-
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>"
-
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
-
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.
-
Verifique que el secreto se haya creado correctamente. Sustituya
<project>
por elproject
donde ha creado el secreto de extracción de imagen.oc get secrets --namespace <project>
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:
Para crear un secreto de extracción de imágenes:
-
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.
-
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>
-
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.
-
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. -
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>"}}]'
-
-
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)
, ejecuteoc 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. -
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>
-
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.
-
Obtenga la clave de autorización para la biblioteca de software autorizado.
- Inicie sesión en MyIBM.com y desplácese hasta la sección Biblioteca de software de contenedores. Pulse Ver biblioteca.
- 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.
-
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>
-
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"}}]'
-
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
-
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:
- Descargue el paquete de línea de comandos del procesador JSON
jq
. Puede utilizarjq
para combinar el valor de JSON del secreto de extracción global predeterminado con el secreto de extracción de registro privado que desea añadir. - Acceda al clúster de Red Hat OpenShift.
Para añadir registros privados, edite el pull-secret
global en el proyecto openshift-config
.
-
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.
-
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
-
Combine el archivo
myregistryconfigjson
del secreto de extracción de registro privado descargado con el archivodockerconfigjson
del secreto de extracción global predeterminado.jq -s '.[0] * .[1]' dockerconfigjson myregistryconfigjson > dockerconfigjson-merged
-
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
-
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>" } } }
-
Para seleccionar los cambios de configuración globales, vuelva a cargar todos los nodos de trabajador del clúster.
-
Anote el ID de los nodos trabajadores del clúster.
ibmcloud oc worker ls -c <cluster_name_or_ID>
-
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>
-
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>
-
-
Cuando los nodos trabajadores vuelvan a estar en buen estado, verifique que el secreto de extracción global se actualiza en un nodo trabajador.
-
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>
-
Cambie el directorio raíz por el host para poder ver los archivos en el nodo trabajador.
chroot /host
-
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.
- Cree un secreto que contenga las credenciales del registro que desea utilizar.
Mandatooc create secret docker-registry docker-auth-secret \ --docker-server=REGISTRY \ --docker-username=USERNAME \ --docker-password=PASSWORD \ --namespace kube-system
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
- 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
- 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.