Creación de imágenes para las apps
Una imagen de Docker es la base para cada contenedor que pueda crear con Red Hat® OpenShift® on IBM Cloud®.
Una imagen se crea a partir de un Dockerfile, que es un archivo que contiene las instrucciones para crear la imagen. Un Dockerfile podría hacer referencia a los artefactos de compilación en sus instrucciones que se almacenan por separado, como por ejemplo una app, la configuración de la app y sus dependencias.
Compilación de imágenes
Puede compilar sus imágenes de varias maneras, incluidos los siguientes servicios de IBM Cloud.
- IBM Cloud Code Engine
- Code Engine da soporte a la compilación de imágenes de un Dockerfile y de Cloud Native Buildpacks, y envía automáticamente las imágenes a IBM Cloud® Container Registry. Para obtener más información, consulte Planificación de una compilación.
- Conductos de Tekton
- El servicio de Continuous Delivery incluye varias tareas de Tekton a las que puede hacer referencia en las interconexiones para compilar imágenes. Para obtener más información, consulte Interconexiones de Tekton.
Despliegue de contenedores a partir de una secuencia de imágenes existente en el registro interno
Puede desplegar una aplicación desde un flujo de imágenes existente que el administrador del clúster haya configurado en el registro interno de su clúster Red Hat OpenShift. Por ejemplo, es posible que el administrador del clúster haya configurado la secuencia de imágenes para importar una imagen de un registro privado externo, como por ejemplo IBM Cloud Container Registry.
Utilización de una secuencia de imágenes con la CLI
-
Obtenga una lista de las secuencias de imágenes disponibles en un proyecto. Si conoce el proyecto, el nombre y la etiqueta de la secuencia de imágenes, puede utilizar las secuencias de imágenes locales en otros proyectos sin configurar las credenciales de secuencia de extracción de imágenes.
oc get is -n <project>
-
Cree la app a partir de la secuencia de imágenes.
oc new-app --image-stream="<project>/<imagestream>:<tag>"
Utilización de una secuencia de imágenes desde la consola web de Red Hat OpenShift
- En la consola web de Red Hat OpenShift, vaya a la perspectiva Desarrollador y pulse +Añadir.
- En la barra de menús del panel Añadir, seleccione un Proyecto que no sea
default
en el que crear la app y pulse Contenedor. - En la sección Imagen, seleccione Nombre de imagen del registro interno.
- Seleccione el Proyecto de
default
,<image>
ImageStreams y la Etiqueta de<tag>
de la secuencia de imágenes que ha creado anteriormente. - Revise el resto de los detalles de la aplicación y pulse Crear.
Despliegue de contenedores desde una imagen de IBM Cloud Container Registry en el proyecto default
de Red Hat OpenShift
Puede desplegar contenedores en el clúster desde una imagen pública proporcionada por IBM o desde una imagen privada almacenada en el espacio de nombres de IBM Cloud Container Registry. Para obtener más información sobre cómo el clúster accede a las imágenes del registro, consulte Visión general sobre cómo está autorizado el clúster para extraer imágenes de IBM Cloud Container Registry.
Antes de empezar:
-
Cree un archivo de configuración de despliegue denominado
<deployment>.yaml
. -
Defina el despliegue y la imagen que desee a utilizar del proyecto de IBM Cloud Container Registry.
apiVersion: apps/v1 kind: Deployment metadata: name: <deployment> spec: replicas: <number_of_replicas> selector: matchLabels: app: <app_name> template: metadata: labels: app: <app_name> spec: containers: - name: <app_name> image: <region>.icr.io/<project>/<image>:<tag>
<deployment>
- Asigne un nombre a su despliegue.
<number_of_replicas>
- Especifique el número de pods de réplica que crea el despliegue.
app: <app_name>
- Utilice el nombre de la app como etiqueta para el contenedor.
name: <app_name>
- Asigne un nombre a su contenedor, como por ejemplo el nombre de la etiqueta de la
app
. image: <region>.icr.io/project>/image>:tag>
-
- Sustituya las variables de URL de imagen por la información de la imagen:
region>
: el punto final de la API de IBM Cloud Container Registry regional para el dominio de registro. Para obtener una lista del dominio de la región donde ha iniciado sesión, ejecuteibmcloud cr api
.namespace>
: El espacio de nombres del registro. Para obtener información de su espacio de nombres, ejecuteibmcloud cr namespace-list
.image>:tag>
: La imagen y el código que desea utilizar para el contenedor. Para obtener una lista de las imágenes que están disponibles en el espacio de nombres de registro, ejecuteibmcloud cr images
.
-
Cree el despliegue en el clúster.
oc apply -f <deployment>.yaml
Despliegue de contenedores desde una imagen cifrada
Despliegue contenedores desde una imagen cifrada en el clúster mediante el complemento de clúster de Image Key Synchronizer.
En los clústeres que ejecutan Red Hat OpenShift 4.5 o posterior, el tiempo de ejecución del contenedor CRI-O admite el uso de imágenes de contenedor cifradas. Las imágenes de contenedor cifradas son imágenes de Open Container Initiative (OCI) que contienen contenido de capa cifrado. En lugar de proteger una imagen para desarrolladores individuales, como por ejemplo un desarrollador que utiliza secretos de extracción de imágenes para extraer imágenes de un registro, puede habilitar el cifrado de imágenes para un clúster específico. De este modo, puede asegurarse de que las imágenes cifradas se ejecutan únicamente en los clústeres específicos que tienen la clave de descifrado de imágenes.
Para ejecutar una app utilizando una imagen cifrada, debe compartir la clave para descifrar la imagen con el tiempo de ejecución del contenedor en los nodos trabajadores del clúster. Cuando se habilita el complemento Image Key Synchronizer en
el clúster, el conjunto de daemons de sincronizador se despliega en el proyecto image-key-synchronizer
. A continuación, puede crear secretos de Kubernetes que contengan las claves de descifrado de imágenes en dicho proyecto. El
complemento añade las claves a un directorio específico en los nodos trabajadores al que el tiempo de ejecución del contenedor puede acceder y utilizar las claves para descifrar las imágenes de contenedor. Tenga en cuenta que el complemento
Image Key Synchronizer también da soporte a claves privadas que primero encapsula una clave raíz que se almacena en una instancia de IBM® Key Protect.
Antes de empezar
-
Descargue e instale los clientes de CLI para las siguientes herramientas de código abierto:
- OpenSSL, para generar un par de claves RSA.
- Docker Engine CLI, para extraer localmente imágenes de un registro de imágenes.
- Skopeo, para cifrar imágenes de contenedor OCI.
-
Opcional: cuando crea un par de claves públicas y privadas para el cifrado de imágenes, puede proporcionar la clave privada directamente en un secreto, o primero encapsular la clave privada utilizando una clave raíz Key Protect o un servicio de gestión de claves (KMS). Para preparar el encapsulado de la clave privada:
-
Obtenga los siguientes valores para la instancia de Key Protect:
-
Cree un secreto de Kubernetes denominado
keyprotect-config
que contenga los valores que ha recuperado. El complemento Image Key Synchronizer utiliza las variables de entorno de este secreto para autenticarse con la instancia de Key Protect.apiVersion: v1 kind: Secret metadata: name: keyprotect-config namespace: image-key-synchronizer type: Opaque stringData: config.json: | { "keyprotect-url":"<service_endpoint>", "instance-id": "<service_instance_ID>", "apikey": "<service_instance_ID_API_key>" }
Para desplegar contenedores que utilizan imágenes cifradas:
-
Habilite el complemento Imagen Key Synchronizer.
ibmcloud oc cluster addon enable image-key-synchronizer -c <cluster_name_or_ID>
-
Compruebe que el conjunto de demonios
addon-image-key-synchronizer
se ha creado correctamente en el proyectoimage-key-synchronizer
de su clúster.oc get ds addon-image-key-synchronizer -n image-key-synchronizer
-
Utilice
openssl
para generar un par de claves RSA privada y pública.openssl genrsa -out myprivatekey.pem openssl rsa -in myprivatekey.pem -pubout -out mypubkey.pem
-
Proporcione la clave privada directamente en un secreto, o primero encapsule la clave privada utilizando una clave raíz de un servicio de gestión de claves (KMS) como, por ejemplo, Key Protect. Después de crear el secreto en el proyecto
image-key-synchronizer
, el complemento Image Key Synchronizer copia automáticamente la clave privada en el directorio/etc/crio/keys/synced
en los nodos trabajadores.- Para proporcionar la clave privada directamente: guarde la clave privada como un secreto de Kubernetes en el proyecto
image-key-synchronizer
.oc create -n image-key-synchronizer secret generic --type=key --from-file=myprivatekey.pem <secret_name>
- Para encapsular la clave privada mediante una clave raíz de Key Protect:
-
Codifique la clave privada en base64 y copie la salida.
cat myprivatekey.pem | base64
-
Utilice el plugin de CLI de Key Protect para encapsular la clave privada codificada en base64 con la clave raíz. En la salida, copie el texto cifrado de la clave privada encapsulada.
ibmcloud kp key wrap <root_key_ID> -p <base64_encoded_private_key>
-
Guarde la clave privada encapsulada como un secreto de Kubernetes en el proyecto
image-key-synchronizer
.apiVersion: v1 kind: Secret type: kp-key metadata: name: <secret_name> namespace: image-key-synchronizer stringData: rootkeyid: "<root_key_ID>" ciphertext: "<wrapped_private_key_cipertext>"
-
Cree el secreto:
oc apply -n image-key-synchronizer -f <secret_name>.yaml
-
- Para proporcionar la clave privada directamente: guarde la clave privada como un secreto de Kubernetes en el proyecto
-
Utilice
docker
para extraer localmente una imagen de OCI. Sustituya<source_image>
por el repositorio de la imagen y<tag>
por el código de la imagen que desea utilizar, por ejemplo,latest
.docker pull <source_image>:<tag>
-
Utilice
skopeo
para cifrar la imagen local. Este mandato copia la imagen de OCI que ha extraído anteriormente, utiliza la clave pública para cifrar la imagen y guarda la imagen cifrada en un archivo local distinto. Se recomienda nombrar la imagen cifrada como<source_image>_encrypted
para identificarla fácilmente.skopeo copy --encryption-key jwe:./mypubkey.pem <source_image>:<tag> <source_image>_encrypted:<tag>
-
Opcional: para verificar localmente que la imagen está cifrada, puede intentar descifrar la imagen con una clave incorrecta.
-
Genere una nueva clave privada.
openssl genrsa --out wrongkey.pem 1024
-
Intente utilizar esta nueva clave para descifrar la imagen. El mandato de descifrado falla porque se ha especificado la clave privada incorrecta.
skopeo copy --decryption-key ./wrongkey.pem <source_image>_encrypted:<tag> <source_image>_decrypted:<tag>
-
-
Opcional: envíe la imagen cifrada a IBM Cloud Container Registry, que da soporte a imágenes OCI cifradas.
-
Especifique la imagen cifrada en el despliegue de la app. Por ejemplo, si ha enviado la imagen cifrada a IBM Cloud Container Registry, puede seguir el ejemplo de Despliegue de contenedores desde una imagen de IBM Cloud Container Registry al proyecto
default
de Red Hat OpenShift. Cuando cree el despliegue en el clúster, el tiempo de ejecución del contenedor utiliza la clave de descifrado privada del directorio/etc/crio/keys/synced
para descifrar la imagen antes de ejecutarla. -
Para las siguientes imágenes que desee cifrar, puede utilizar la misma clave pública para cifrar las imágenes con Skopeo o puede repetir estos pasos para utilizar un par de claves pública y privada diferentes.
Si más tarde decide desactivar el complemento, el conjunto de demonio addon-image-key-synchronizer
se elimina, pero el proyecto image-key-synchronizer
y cualquier secreto que haya creado en ese proyecto no se eliminan,
y el tiempo de ejecución del contenedor todavía puede utilizar los secretos para ejecutar imágenes cifradas. Si desea eliminar las claves de los nodos trabajadores, debe suprimir los secretos correspondientes del proyecto image-key-synchronizer
antes de inhabilitar el complemento.
Para obtener la lista de cambios para cada versión del complemento Image Key Synchronizer, consulte el registro de cambios del complemento Image Key Synchronizer IBM Cloud.
Cómo hacer referencia al secreto de extracción de imágenes en el despliegue del pod
Si el administrador del clúster no ha almacenado el secreto de extracción de imágenes en la cuenta de servicio de Kubernetes, los despliegues que no especifiquen una cuenta de servicio no podrán utilizar el secreto de extracción de imágenes para desplegar contenedores. En su lugar, puede definir un secreto de extracción de imágenes en el despliegue del pod. Cuando se hace referencia al secreto de extracción de imágenes en un despliegue de pod, el secreto de extracción de imágenes solo es válido para este pod y no se puede compartir entre los distintos pods del proyecto de Red Hat OpenShift.
Antes de empezar
- Cree un secreto de extracción de imágenes para acceder a las imágenes de otros registros o proyectos de Red Hat OpenShift distintos de
default
. - Acceda al clúster de Red Hat OpenShift.
Para hacer referencia al secreto de extracción de imágenes en el despliegue del pod,
-
Cree un archivo de configuración de pod denominado
mypod.yaml
. -
Defina el pod y el secreto de extracción de imágenes para acceder a las imágenes de IBM Cloud Container Registry.
Para acceder a una imagen privada,
apiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - name: <container_name> image: <region>.icr.io/<namespace_name>/<image_name>:<tag> imagePullSecrets: - name: <secret_name>
Para acceder a una imagen pública de IBM Cloud,
apiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - name: <container_name> image: icr.io/<image_name>:<tag> imagePullSecrets: - name: <secret_name>
container_name>
- El nombre del contenedor para desplegar en el clúster.
namespace_name>
: El espacio de nombres del registro donde se almacena la imagen. Para obtener una lista de los espacios de nombres disponibles, ejecuteibmcloud cr namespace-list
.image_name>
: El nombre de la imagen a utilizar. Para ver una lista de todas las imágenes disponibles en una cuenta de IBM Cloud, ejecuteibmcloud cr image-list
.tag>
: La versión de la imagen que desea utilizar. Si no se especifica ninguna etiqueta, la imagen que está etiquetada como más reciente se utiliza de forma predeterminada.<secret_name>
: El nombre del secreto de extracción de imágenes que ha creado anteriormente.
-
Guarde los cambios.
-
Cree el despliegue en el clúster.
oc apply -f mypod.yaml
Envío de imágenes a IBM Cloud Container Registry
Después de que el administrador del clúster configure un registro de imágenes con IBM Cloud Container Registry, puede guardar y compartir de forma segura imágenes de Docker con otros usuarios añadiendo las imágenes a su espacio de nombres.
Por ejemplo, puede extraer una imagen de un origen de registro privado o público y luego etiquetarla para utilizarla más adelante en IBM Cloud Container Registry. O bien puede enviar una imagen de Docker con la que trabaje a su espacio de nombres para que otros usuarios puedan acceder a la imagen. Para empezar, consulte Adición de imágenes a su espacio de nombres.
Gestión de la seguridad de las imágenes en IBM Cloud Container Registry con Vulnerability Advisor
Vulnerability Advisor comprueba el estado de seguridad de las imágenes del contenedor proporcionadas por IBM o por terceros o añadidas al espacio de nombres de IBM Cloud Container Registry de la organización.
Cuando añade una imagen a un espacio de nombres, Vulnerability Advisor la explora automáticamente para detectar problemas de seguridad y potenciales vulnerabilidades. Si encuentra problemas de seguridad, se proporcionan instrucciones para poder arreglar el problema de vulnerabilidad notificado. Para empezar, consulte Gestión de la seguridad de imágenes con Vulnerability Advisor.
Configuración de contenido de confianza para imágenes de contenedor
Puede crear contenedores a partir de imágenes de confianza que están firmadas y almacenadas en IBM Cloud Container Registry, y evitar despliegues de imágenes vulnerables o que no hayan sido firmadas.
- Firme imágenes para un contenido de confianza. Después de establecer la confianza en sus imágenes, puede gestionar el contenido de confianza y los firmantes que pueden extraer las imágenes para su registro.
- Para imponer una política para que solo se puedan utilizar imágenes firmadas para crear contenedores en el clúster, instale el proyecto Portieris de código abierto.
- Los usuarios del clúster pueden desplegar app creadas a partir de imágenes de confianza.
Habilitación de la aplicación de seguridad de imágenes en el clúster
Al habilitar la aplicación de seguridad de imágenes en el clúster, se instala el proyecto Portieris Kubernetes de código abierto. A continuación, puede crear políticas de imagen para impedir que los pods que no cumplan las políticas, como las imágenes no firmadas, se ejecuten en el clúster.
Para más información, consulte la documentación de Portieris.
Imágenes mutadas: de forma predeterminada, Portieris utiliza el controlador de admisión MutatingAdmissionWebhook
para mutar la imagen y referirse a ella mediante un resumen en lugar de una etiqueta. Sin embargo,
es posible que tenga alguna tecnología de despliegue que rechace una imagen mutada. Si es así, puede utilizar la opción de mutación de imagen y la política para cambiar el comportamiento predeterminado.
Habilitación o inhabilitación de la aplicación de seguridad de imágenes
Puede activar o desactivar la aplicación de seguridad de imágenes para su clúster desde la CLI o la consola. Para versiones anteriores, consulte la documentación de Portieris.
Habilitación o inhabilitación de la obligatoriedad de seguridad de imágenes con la CLI
Consulte los mandatos siguientes.
Habilitación o inhabilitación de la obligatoriedad de seguridad de imágenes desde la consola
- Desde la consola, seleccione su grupo.
- Busque el campo de aplicación de seguridad de imágenes y haga clic en Activar o Desactivar.
Políticas de imágenes predeterminadas
Al habilitar la aplicación de seguridad de imágenes, Red Hat OpenShift on IBM Cloud crea automáticamente determinadas políticas de imágenes en el clúster. Al inhabilitar la característica, se elimina la CRD ClusterImagePolicy
subyacente, que elimina todas las políticas de imagen predeterminadas y las políticas de imágenes personalizadas que haya creado.
- Las políticas de imágenes con el nombre
ibm-signed-image-enforcement
restringen las imágenes que se ejecutan en el proyecto solo en imágenes de Red Hat OpenShift on IBM Cloud. No modifique estas políticas de imágenes. Los cambios que realice se sobrescriben en unos minutos. - Otras políticas de imágenes, como
default
odefault-allow-all
, permiten imágenes que no están restringidas por otra política de imagen. Puede modificar estas políticas de imagen y conservar los cambios, pero no cambie el nombre de la política de imagen. Si cambia el nombre de la política, se crean más políticas con el nombre y los valores predeterminados.
Para revisar las políticas de imagen en el clúster,
Antes de empezar
Acceda al clúster de Red Hat OpenShift.
-
Liste las políticas de imágenes que se aplican globalmente al clúster. Para ver un ejemplo de configuración, consulte la documentación de la política Portieris.
oc get ClusterImagePolicy
-
Liste las políticas de imágenes que se aplican a espacios de nombres específicos dentro del clúster. Para ver un ejemplo de configuración, consulte la documentación de la política Portieris.
oc get ImagePolicy --all-namespaces