Implementa imágenes de contenedor

En esta página, se describe cómo implementar servicios y revisiones nuevas en Knative serving.

Antes de comenzar

Para usar Google Cloud CLI, primero debes preparar y configurar las herramientas de línea de comandos.

Conéctate a clústeres de GKE

Antes de poder implementar servicios en Knative serving, debes acceder para conectarte a tu clúster de GKE.

Para obtener más información sobre cómo conectarte a tus clústeres de GKE, incluidas opciones adicionales, consulta los siguientes vínculos:

Permisos necesarios para realizar una implementación

Necesitas permisos para crear, actualizar y borrar en el apiGroup serving.knative.dev y en el tipo Service; además, debes tener UNA de las siguientes funciones de Identity and Access Management:

Imágenes que puedes implementar

No hay un límite de tamaño que se aplique a la imagen de contenedor que puedes implementar.

Puedes usar contenedores desde cualquier registro de contenedores, como Docker Hub. Para obtener información sobre la implementación de imágenes privadas de registros diferentes de Container Registry o Artifact Registry, consulta Implementa imágenes de contenedor privadas de otros registros de contenedores.

Implementa un servicio nuevo

Puedes especificar una imagen de contenedor con una etiqueta (por ejemplo, gcr.io/my-project/my-image:latest) o con un resumen exacto (por ejemplo, gcr.io/my-project/my-image@sha256:41f34ab970ee...).

Cuando implementas en un servicio por primera vez, se crea su primera revisión. Ten en cuenta que las revisiones son inmutables. Si implementas desde una etiqueta de imagen de contenedor, se resolverá en un resumen y la revisión siempre entregará este resumen en particular.

Puedes implementar un contenedor mediante la consola de Google Cloud, la CLI de Google Cloud o desde un archivo de configuración YAML.

Haz clic en la pestaña para obtener instrucciones de la herramienta que elijas.

Configuración de la ubicación predeterminada de gcloud

Si ya configuraste una ubicación en la configuración de default de Google Cloud CLI, los comandos de gcloud usarán esos valores de forma predeterminada, incluidos los siguientes:

  • compute/region
  • compute/zone
  • run/cluster
  • run/cluster_location
  • run/platform
  • run/region

Ejecuta el siguiente comando de configuración de gcloud para ver tu configuración de default:

gcloud config configurations describe default

Console

Para implementar una imagen de contenedor, sigue estos pasos:

  1. Ve a Knative serving en la consola de Google Cloud:

    Ir a Knative serving

  2. Haz clic en Crear servicio para mostrar la página Crear servicio (Create service).

    En el formulario, haz lo siguiente:

    1. En el menú desplegable, selecciona uno de los clústeres de GKE disponibles para tu servicio.

    2. Ingresa el nombre del servicio que quieras. Los nombres de servicio deben ser únicos por región y proyecto o por clúster. El nombre de un servicio no se puede cambiar más adelante.

    3. En Conectividad, haz lo siguiente:

      • Selecciona Interno si deseas restringir el acceso solo a otros servicios de Knative serving o a servicios en tu clúster que usan Istio.
      • Selecciona Externo para permitir el acceso externo a tu servicio.

      Ten en cuenta que puedes cambiar la opción de conectividad en cualquier momento, como se describe en Cambia la configuración de conectividad del servicio.

    4. Haz clic en Siguiente para ir a la segunda página del formulario de creación de servicios.

      En el formulario, haz lo siguiente:

      1. En el cuadro de texto URL de la imagen de contenedor, ingresa la URL de una imagen de un registro compatible, por ejemplo, us-docker.pkg.dev/cloudrun/container/hello:latest.

      2. De manera opcional, haz clic en Show Advanced Settings y en las siguientes pestañas para establecer lo siguiente:

      3. Haz clic en Crear para implementar la imagen en Knative serving y espera a que finalice la implementación.

    Acabas de implementar un servicio en un clúster habilitado para Knative serving.

Línea de comandos

Para implementar una imagen de contenedor, sigue estos pasos:

  1. Ejecuta el comando gcloud run deploy:

    gcloud run deploy SERVICE --image IMAGE_URL

    • Reemplaza SERVICE por el nombre del servicio en el que deseas realizar la implementación. Si el servicio especificado no existe, se crea un servicio nuevo.

    • Reemplaza IMAGE_URL por una referencia a la imagen de contenedor, como gcr.io/cloudrun/hello.

    • Opciones de implementación adicionales:

      • Para implementar en un espacio de nombres que no sea el predeterminado, debes especificar ese espacio de nombres con el parámetro --namespace.

      • Para implementar en una ubicación distinta de la configuración predeterminada, debes especificar name y location del clúster con --cluster y parámetro --cluster-location:

        gcloud run deploy SERVICE --cluster CLUSTER-NAME --cluster-location CLUSTER-LOCATION
      • Puedes establecer las opciones de conectividad con la marca --connectivity como se describe en Cambia la configuración de conectividad del servicio para especificar el acceso interno o externo.

      • Para Knative serving en VMware, debes incluir el parámetro --kubeconfig y especificar tu archivo de configuración:

        gcloud run deploy SERVICE --image IMAGE_URL --kubeconfig KUBECONFIG-FILE

  2. Espera a que finalice la implementación. Una vez que la compilación se completa de manera correcta, se muestra un mensaje de éxito, además de la URL del servicio implementado.

YAML

Puedes almacenar la especificación de servicio en un archivo YAML y, luego, implementarla con Google Cloud CLI.

  1. Crea un archivo service.yaml nuevo con este contenido:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
    spec:
      template:
        spec:
          containers:
          - image: IMAGE

    Reemplazar

    • SERVICE por el nombre de tu servicio de Knative serving
    • IMAGE por la URL de la imagen de contenedor

    También puedes especificar más opciones de configuración, como variables de entorno o límites de memoria.

  2. Implementa el servicio nuevo mediante el siguiente comando:

    gcloud run services replace service.yaml

Implementa una revisión nueva de un servicio existente

Puedes implementar una revisión nueva mediante la consola de Google Cloud, la línea de comandos de gcloud o un archivo de configuración YAML.

Ten en cuenta que cualquier cambio en la configuración hace que se cree una revisión nueva, incluso si no hay cambios en la imagen de contenedor. Cada revisión creada es inmutable.

Haz clic en la pestaña para obtener instrucciones de la herramienta que elijas.

Console

Para implementar una revisión nueva de un servicio existente, sigue estos pasos:

  1. Ve a Knative serving en la consola de Google Cloud:

    Ir a Knative serving

  2. Identifica el servicio que deseas actualizar en la lista de servicios y haz clic en él para abrir sus detalles.

  3. Haz clic en EDITAR E IMPLEMENTAR NUEVA REVISIÓN. Esto muestra el formulario de implementación de revisión:

  4. Si es necesario, proporciona la URL a la imagen de contenedor nueva que deseas implementar.

  5. De manera opcional, establece lo siguiente:

  6. Para enviar todo el tráfico a la revisión nueva, marca la casilla de verificación Aplicar esta revisión inmediatamente. A fin de lanzar una revisión nueva de forma gradual, desmarca esa casilla de verificación; esto dará como resultado una implementación en la que no se envíe tráfico a la revisión nueva. Sigue las instrucciones para los lanzamientos graduales después de la implementación.

  7. Haz clic en IMPLEMENTAR y espera a que finalice la implementación.

Línea de comandos

Para implementar una imagen de contenedor, sigue estos pasos:

  1. Ejecuta el comando gcloud run services update:

    gcloud run services update SERVICE --image IMAGE_URL
    • Se asigna un sufijo de revisión automáticamente para cada revisión. Si deseas especificar tu propio sufijo de revisión, agrega el parámetro --revision-suffix.

    • Reemplaza SERVICE por el nombre del servicio en el que deseas realizar la implementación. Si el servicio especificado no existe, se crea un servicio nuevo.

    • Reemplaza IMAGE_URL por una referencia a la imagen de contenedor, como gcr.io/cloudrun/hello.

    • Opciones de implementación adicionales:

      • Para implementar en un espacio de nombres que no sea el predeterminado, debes especificar ese espacio de nombres con el parámetro --namespace.

      • Para implementar en una ubicación distinta de la configuración predeterminada, debes especificar name y location del clúster con --cluster y parámetro --cluster-location:

        gcloud run deploy SERVICE --cluster CLUSTER-NAME --cluster-location CLUSTER-LOCATION
      • Puedes establecer las opciones de conectividad con la marca --connectivity como se describe en Cambia la configuración de conectividad del servicio para especificar el acceso interno o externo.

      • Para Knative serving en VMware, debes incluir el parámetro --kubeconfig y especificar tu archivo de configuración:

        gcloud run deploy SERVICE --image IMAGE_URL --kubeconfig KUBECONFIG-FILE

  2. Espera a que finalice la implementación. Una vez que la compilación se completa de manera correcta, se muestra un mensaje de éxito, además de la URL del servicio implementado.

YAML

Puedes descargar la configuración de un servicio existente en un archivo YAML con el comando gcloud run services describe mediante la marca --format=export. Luego, puedes modificar ese archivo YAML e implementar esos cambios con el comando gcloud run services replace. Debes asegurarte de modificar solo los atributos especificados.

  1. Descarga la configuración del servicio en un archivo llamado service.yaml en el lugar de trabajo local:

    gcloud run services describe SERVICE --format export > service.yaml

    Reemplaza SERVICE por el nombre de tu servicio de Knative serving.

    1. En tu archivo local, actualiza la configuración de revisión en cualquier atributo secundario de spec.template.

    2. Implementa la revisión nueva:

      gcloud run services replace service.yaml

Implementa imágenes de otros proyectos de Google Cloud

Puedes implementar imágenes de contenedor de otros proyectos de Google Cloud si estableces los permisos de IAM adecuados:

  1. En la consola de Google Cloud, abre el proyecto de tu servicio de Knative serving.

  2. Ve a la página IAM

  3. Obtén la información de tu cuenta de servicio:

  4. Abre el proyecto que posee el registro de contenedores que deseas usar.

  5. Ve a la página IAM

  6. Haz clic en Agregar para agregar una principal nueva.

  7. En el cuadro de texto Principales nuevas, pega el correo electrónico de la cuenta de servicio que copiaste antes.

  8. En la lista desplegable Seleccionar una función, selecciona la función que deseas leer del registro:

  9. Implementa la imagen de contenedor en el proyecto que contiene tu servicio de Knative serving.

Para mayor seguridad, puedes limitar los permisos de acceso de la siguiente manera:

  • Artifact Registry: Otorga el rol en el repositorio que almacena tus imágenes de contenedor.
  • Container Registry: Otorga la función en el bucket de Cloud Storage que almacena tus imágenes de contenedor.

Implementa imágenes de contenedor privadas de otros registros de contenedores

En esta sección, se describe cómo configurar los permisos correctos para implementar imágenes de contenedor desde un registro privado arbitrario en Knative serving. Un registro de contenedor privado requiere credenciales para acceder a la imagen de contenedor. Ten en cuenta que no necesitas seguir estos pasos para implementar imágenes de contenedor privadas de Container Registry (obsoleto) o Artifact Registry en el mismo proyecto que tu clúster.

Para poder implementar una imagen de contenedor privada, debes crear un secreto de Kubernetes de tipo imagePullSecret y asociarlo con una cuenta de servicio:

  1. Crea un secreto imagePullSecret llamado container-registry:

    kubectl create secret docker-registry container-registry \
      --docker-server=DOCKER_REGISTRY_SERVER \
      --docker-email=REGISTRY_EMAIL \
      --docker-username=REGISTRY_USER \
      --docker-password=REGISTRY_PASSWORD
    • Reemplaza DOCKER_REGISTRY_SERVER por el FQDN de registro privado (p. ej.: https://gcr.io/ para Container Registry o https://hub.docker.com para DockerHub).
    • Reemplaza REGISTRY_EMAIL por tu correo electrónico.
    • Reemplaza REGISTRY_USER por tu nombre de usuario de Container Registry.

      Si usas Container Registry o Artifact Registry y deseas almacenar y extraer credenciales de larga duración en lugar de pasar tokens de acceso de corta duración, consulta Métodos de autenticación: archivo de claves JSON.

    • Reemplaza REGISTRY_PASSWORD por tu contraseña de registro de contenedores.

  2. Abre tu cuenta de servicio predeterminada:

    kubectl edit serviceaccount default --namespace default

    Cada espacio de nombres en tu clúster de Kubernetes tiene una cuenta de servicio predeterminada llamada default. Esta cuenta de servicio predeterminada se usa para extraer la imagen de contenedor, a menos que se especifique lo contrario cuando deploy el servicio de Knative serving.

  3. Agrega el secreto imagePullSecret recién creado a tu cuenta de servicio predeterminada:

    imagePullSecrets:
    - name: container-registry
    

    Tu cuenta de servicio debería verse así:

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: default
      namespace: default
      ...
    secrets:
    - name: default-token-zd84v
    # The secret we just created:
    imagePullSecrets:
    - name: container-registry
    

Ahora, todos los Pods nuevos creados en el espacio de nombres default actual tendrán definido el secreto imagePullSecret.

Realiza una implementación con la inserción automática de sidecar habilitada

Para implementar tu servicio con la inyección del archivo adicional de Istio habilitada, consulta la inserción automática de sidecar habilitada en la documentación de Cloud Service Mesh.

Implementa servicios en una red interna

Para implementar servicios en una red interna, debes configurar una red interna privada.

¿Qué sigue?

Después de implementar un servicio nuevo, puedes hacer lo siguiente:

Puedes automatizar las implementaciones y compilaciones de tus servicios de Knative serving mediante los activadores de Cloud Build: