Configura actualizaciones automáticas de imágenes base

Configurar las actualizaciones automáticas de imágenes base para Cloud Run permite que Google aplique parches de seguridad al sistema operativo y a los componentes del entorno de ejecución de la imagen de la aplicación automáticamente. No es necesario volver a compilar o volver a implementar el servicio.

Para configurar las actualizaciones automáticas de imágenes base, sigue estos pasos:

  • Selecciona una imagen base compatible con Cloud Run.
  • Compila y, luego, implementa la imagen de tu aplicación de forma que preserve la capacidad de cambiar la base de tu servicio en ejecución de forma segura.

Selecciona una imagen base

Una imagen base es el punto de partida para la mayoría de los flujos de trabajo de desarrollo basados en contenedores. Los desarrolladores comienzan con una imagen base y, sobre ella, colocan las bibliotecas, los objetos binarios y los archivos de configuración necesarios para ejecutar su aplicación.

Los paquetes de compilación de Google Cloud publican y mantienen imágenes base para compilar aplicaciones sin servidores. Estas imágenes base se basan en la distribución de Ubuntu de Linux.

Cloud Run solo admite imágenes base automáticas que usen imágenes base de paquetes de compilación de Google Cloud.

Debes tener en cuenta lo siguiente cuando elijas los paquetes de compilación de Google Cloud:

  • Pila: Una pila se compone de una versión de distribución de Linux y paquetes del sistema, como OpenSSL y curl.
  • Lenguaje: La versión específica del lenguaje de programación que usa tu aplicación.

    Revisa los entornos de ejecución de lenguaje para obtener más información sobre las variaciones de las imágenes base.

Compila la imagen de la aplicación

Los servicios con actualizaciones automáticas habilitadas deberán proporcionar una imagen de aplicación que omita las capas base del sistema operativo. Existen dos maneras de hacerlo.

Implementa desde la fuente

Puedes usar la función implementar desde fuente de Cloud Run para compilar tu aplicación de modo que sea compatible con las actualizaciones automáticas. Para ello, debes proporcionar la marca --base-image cuando crees la aplicación.

Por ejemplo, para implementar un servicio o una función de Python con las actualizaciones automáticas de la imagen base habilitadas, usa el siguiente comando:

gcloud beta run deploy python-application \
  --source . \
  --base-image=python312

Build on scratch

También puedes usar tu cadena de herramientas de compilación para crear una imagen de aplicación que sea compatible con las actualizaciones automáticas de imagen base. Para ello, deberás hacer lo siguiente:

  1. Crea un Dockerfile de varias etapas.
    1. Compila la aplicación con una imagen base adecuada con las dependencias necesarias.
    2. Copia los componentes compilados en una imagen inicial.
  2. Compila las imágenes de la aplicación y publícalas en Artifact Registry.
  3. Implementa la aplicación con Cloud Run.

Crea un Dockerfile de varias etapas

Para esta guía, usaremos una aplicación de Node.js. Esta guía no es específica del idioma y se puede personalizar para tu aplicación y tu idioma.

  1. Crea un Dockerfile en el directorio raíz de nuestro proyecto con el siguiente código:
FROM node:18-slim as builder

# Create and change to the app directory.
WORKDIR /usr/src/app

# Copy application dependency manifests to the container image and install
# production dependencies.
COPY package*.json ./
RUN npm install --only=production

# Copy local code to the container image.
COPY . ./

# Copy the application source code and depenencies onto a scratch image.
FROM scratch
COPY --from=builder --chown=33:33 /usr/src/app/ ./

# Run the web service on container startup.
CMD [ "node", "index.js" ]

Este Dockerfile usa una compilación de varias etapas para copiar el código fuente de la aplicación y las dependencias en una imagen de scratch que omite el sistema operativo, los paquetes y los componentes del entorno de ejecución. que la imagen base administrada de Cloud Run proporcionará en el entorno de ejecución.

Compila la imagen de tu aplicación

Compila la imagen de tu aplicación y súbela a Artifact Registry. Consulta Compila contenedores para obtener detalles sobre cómo compilar un Dockerfile con Cloud Build y subirlo a Artifact Registry.

Implementa la imagen de la aplicación

Ya puedes implementar la imagen de tu aplicación con las actualizaciones automáticas habilitadas con la imagen base más compatible para tu aplicación. En este ejemplo, usaremos nodejs18.

Consulta cómo implementar imágenes de contenedores en Cloud Run para obtener más detalles sobre los roles y permisos necesarios.

gcloud beta run deploy SERVICE \
  --image=IMAGE \
  --base-image=nodejs18

Reemplazar

  • SERVICE por el nombre del servicio en el que deseas implementar. Los nombres de servicios deben tener 49 caracteres o menos, y deben ser únicos por región y proyecto. Si aún no existe, con este comando se crea el servicio durante la implementación. Puedes omitir este parámetro por completo, pero luego se te solicitará el nombre del servicio.
  • IMAGE por la URL de la imagen de contenedor.

Campos y anotaciones del servicio

Si habilitas las actualizaciones de seguridad automáticas, la configuración del servicio se enriquecerá con los siguientes datos.

YAML

```yaml
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: SERVICE
annotations:
    ...
    run.googleapis.com/build-base-image: BASE_IMAGE_URL
    run.googleapis.com/enable-automatic-updates: STATUS
    ...
spec:
...
runtimeClassName: run.googleapis.com/linux-base-image-update
```

*   `SERVICE` the name of the service you want to deploy to.
    Service names must be 49 characters or less and must be unique per
    region and project. If the service does not exist yet, this command
    creates the service during the deployment. You can omit this parameter
    entirely, but you will be prompted for the service name if you omit it.
*   `BASE_IMAGE_URL`, the base image that will be used on next deployment.
    `BASE_IMAGE_URL` will be used on the next [source](/run/docs/deploying-source-code) or [function](/run/docs/deploying-functions) deployment.
    Review [language runtimes](/run/docs/configuring/services/language-runtimes#how_to_obtain_runtime_base_images)
    to learn more about base image variations.
*   `STATUS` is either `true`, enables automatic updates, or `false`,
    disables automatic updates

Inhabilita las actualizaciones automáticas

Las actualizaciones automáticas de seguridad se pueden inhabilitar si actualizas la definición del servicio.

gcloud

  1. Para inhabilitar las actualizaciones automáticas del entorno de ejecución de Node.js 18, ejecuta el siguiente comando:
gcloud beta run deploy SERVICE \
    --image=IMAGE \
    --base-image=nodejs18 \
    --no-automatic-updates

Reemplaza lo siguiente:

  • SERVICE por el nombre del servicio en el que deseas implementar. Los nombres de servicios deben tener 49 caracteres o menos, y deben ser únicos por región y proyecto. Si aún no existe, con este comando se crea el servicio durante la implementación. Puedes omitir este parámetro por completo, pero luego se te solicitará el nombre del servicio.
  • IMAGE por la URL de la imagen de contenedor.

YAML

  1. Si creas un servicio nuevo, omite este paso. Si actualizas un servicio existente, descarga su configuración de YAML:

    gcloud run services describe SERVICE --format export > service.yaml
  2. Debajo del atributo metadata, busca y actualiza la anotación run.googleapis.com/enable-automatic-updates a lo siguiente:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
    name: SERVICE
    annotations:
        ...
        run.googleapis.com/enable-automatic-updates: false
        ...
    spec:
    ...
    
  3. Reemplaza el servicio por la configuración nueva mediante el siguiente comando:

    gcloud run services replace service.yaml

Limitaciones conocidas

  • Cloud Run solo admite imágenes base de paquetes de compilación de Google Cloud.

  • Las aplicaciones que usan lenguajes compilados no se volverán a compilar como resultado de una actualización automática de la imagen base.

  • Es posible que los análisis de seguridad en la imagen de tu aplicación estén incompletos. Debido a que tu imagen de aplicación ahora se compila en scratch, los escáneres de seguridad solo analizarán la parte de la aplicación de tu imagen. Para obtener una imagen más completa de la seguridad de tu contenedor, también debes ejecutar análisis en la imagen base correspondiente que proporciona Google. Puedes descargar la imagen base y usar herramientas de código abierto para ejecutar un análisis.