Desplegar imágenes de contenedor

En esta página se describe cómo desplegar nuevos servicios y nuevas revisiones en Knative Serving.

Antes de empezar

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

Conectarse a clústeres de GKE

Para poder desplegar servicios en Knative Serving, debes iniciar sesión para conectarte a tu clúster de GKE.

Para obtener más información sobre cómo conectarse a los clústeres de GKE, incluidas opciones adicionales, consulte los siguientes artículos:

Permisos necesarios para implementar

Necesitas permisos para crear, actualizar y eliminar en el apiGroup serving.knative.dev y el tipo Service. Además, debes tener UNO de los siguientes roles de Gestión de Identidades y Accesos:

Imágenes que puedes desplegar

No hay límite de tamaño para la imagen de contenedor que puedes desplegar.

Puedes usar contenedores de cualquier registro de contenedores, como Docker Hub. Para obtener información sobre cómo desplegar imágenes privadas de registros distintos de Container Registry o Artifact Registry, consulta el artículo Desplegar imágenes de contenedor privadas de otros registros de contenedores.

Desplegar un nuevo servicio

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

Al implementar un servicio por primera vez, se crea su primera revisión. Ten en cuenta que las revisiones son inmutables. Si despliega desde una etiqueta de imagen de contenedor, se resolverá en un digest y la revisión siempre usará ese digest concreto.

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

Haga clic en la pestaña para ver las instrucciones sobre cómo usar la herramienta que prefiera.

Configuración de la ubicación gcloud predeterminada

Si ya has configurado una ubicación en la defaultconfiguración de la CLI de Google Cloud, tus comandos 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 gcloud config para ver los ajustes de la configuración default:

gcloud config configurations describe default

Consola

Para desplegar una imagen de contenedor, sigue estos pasos:

  1. Ve a Knative Serving en la Google Cloud consola:

    Ir a Knative serving

  2. Haz clic en Crear servicio para que se muestre la página Crear servicio.

    En el formulario:

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

    2. Introduce el nombre del servicio que quieras. Los nombres de los servicios 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:

      • Selecciona Internal (Interno) si quieres restringir el acceso solo a otros servicios de Knative Serving o a servicios de tu clúster que usen 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, tal como se describe en el artículo Cambiar los ajustes 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:

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

      2. Si quieres, haz clic en Mostrar configuración avanzada y en las pestañas siguientes para definir lo siguiente:

      3. Haz clic en Crear para desplegar la imagen en Knative Serving y espera a que se complete el despliegue.

    Acabas de desplegar un servicio en un clúster con Knative serving habilitado.

Línea de comandos

Para desplegar una imagen de contenedor, sigue estos pasos:

  1. Ejecuta el comando gcloud run deploy:

    gcloud run deploy SERVICE --image IMAGE_URL

    • Sustituye SERVICE por el nombre del servicio en el que quieras hacer el despliegue. Si el servicio especificado no existe, se creará uno.

    • Sustituye IMAGE_URL por una referencia a la imagen de contenedor. Por ejemplo, gcr.io/cloudrun/hello.

    • Otras opciones de implementación:

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

      • Para implementar en una ubicación que no sea la configuración predeterminada, debes especificar el name y el location del clúster con los parámetros --cluster y --cluster-location:

        gcloud run deploy SERVICE --cluster CLUSTER-NAME --cluster-location CLUSTER-LOCATION
      • Puedes definir las opciones de conectividad con la marca --connectivity, tal como se describe en Cambiar la configuración de conectividad de los servicios, para especificar el acceso interno o externo.

      • En el caso del servicio de Knative en VMware, debes incluir el parámetro --kubeconfig y especificar el archivo de configuración:

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

  2. Espera a que finalice la implementación. Si se completa correctamente, se mostrará un mensaje de confirmación junto con la URL del servicio implementado.

YAML

Puedes almacenar la especificación de tu servicio en un archivo YAML y, a continuación, implementarlo con la CLI de Google Cloud.

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

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

    Sustituir

    • SERVICE con el nombre de tu servicio de Knative
    • IMAGE con la URL de la imagen de tu contenedor.

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

  2. Implementa el nuevo servicio con el siguiente comando:

    gcloud run services replace service.yaml

Desplegar una nueva revisión de un servicio

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

Ten en cuenta que, si cambias cualquier ajuste de configuración, se creará una revisión nueva, aunque no se modifique la imagen del contenedor. Cada revisión creada es inmutable.

Haga clic en la pestaña para ver las instrucciones sobre cómo usar la herramienta que prefiera.

Consola

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

  1. Ve a Knative Serving en la Google Cloud consola:

    Ir a Knative serving

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

  3. Haz clic en EDITAR Y DESPLEGAR NUEVA REVISIÓN. Se muestra el formulario de despliegue de la revisión:

  4. Si es necesario, proporcione la URL de la nueva imagen de contenedor que quiera desplegar.

  5. También puedes definir lo siguiente:

  6. Para enviar todo el tráfico a la nueva revisión, marca la casilla Servir esta revisión de inmediato. Para lanzar gradualmente una nueva revisión, desmarca la casilla. De este modo, se realizará una implementación en la que no se enviará tráfico a la nueva revisión. Sigue las instrucciones para lanzamientos graduales después de la implementación.

  7. Haz clic en DEPLOY (DESPLEGAR) y espera a que finalice el despliegue.

Línea de comandos

Para desplegar 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 automáticamente un sufijo de revisión a cada revisión. Si quieres especificar tu propio sufijo de revisión, añade el parámetro --revision-suffix.

    • Sustituye SERVICE por el nombre del servicio en el que quieras hacer el despliegue. Si el servicio especificado no existe, se creará uno.

    • Sustituye IMAGE_URL por una referencia a la imagen de contenedor. Por ejemplo, gcr.io/cloudrun/hello.

    • Otras opciones de implementación:

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

      • Para implementar en una ubicación que no sea la configuración predeterminada, debes especificar el name y el location del clúster con los parámetros --cluster y --cluster-location:

        gcloud run deploy SERVICE --cluster CLUSTER-NAME --cluster-location CLUSTER-LOCATION
      • Puedes definir las opciones de conectividad con la marca --connectivity, tal como se describe en Cambiar la configuración de conectividad de los servicios, para especificar el acceso interno o externo.

      • En el caso del servicio de Knative en VMware, debes incluir el parámetro --kubeconfig y especificar el archivo de configuración:

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

  2. Espera a que finalice la implementación. Si se completa correctamente, se mostrará un mensaje de confirmación junto con la URL del servicio implementado.

YAML

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

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

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

    Sustituye SERVICE por el nombre de tu servicio de Knative.

    1. En el archivo local, actualiza los ajustes de revisión de cualquier atributo secundario de spec.template.

    2. Despliega la nueva revisión:

      gcloud run services replace service.yaml

Desplegar imágenes de otros proyectos Google Cloud

Puedes desplegar imágenes de contenedor de otros Google Cloud proyectos si configuras los permisos de gestión de identidades y accesos correctos:

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

  2. Ir a la página de gestión de identidades y accesos

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

  4. Abre el proyecto propietario del registro de contenedores que quieras usar.

  5. Ir a la página de gestión de identidades y accesos

  6. Haga clic en Añadir para añadir un nuevo principal.

  7. En el cuadro de texto Nuevos principales, pega el correo de la cuenta de servicio que has copiado anteriormente.

  8. En la lista desplegable Selecciona un rol, elige el rol para leer del registro:

    • Artifact Registry, incluidos los repositorios gcr.io en Artifact Registry: Artifact Registry -> Lector de Artifact Registry
    • Container Registry: Storage -> Storage Object Viewer (Almacenamiento > Lector de objetos de Storage)
  9. Despliega la imagen de contenedor en el proyecto que contiene tu servicio de Knative Serving.

Para aumentar la seguridad, puedes limitar el acceso de concesión:

  • Artifact Registry: concede el rol en el repositorio que almacena tus imágenes de contenedor.
  • Container Registry: asigna el rol en el segmento de Cloud Storage que almacena tus imágenes de contenedor.

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

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

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

  1. Crea un secreto de 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
    • Sustituye DOCKER_REGISTRY_SERVER por el nombre de dominio completo (FQDN) de tu registro privado (por ejemplo, https://gcr.io/ para Container Registry o https://hub.docker.com para Docker Hub).
    • Sustituye REGISTRY_EMAIL por tu correo.
    • Sustituye REGISTRY_USER por el nombre de usuario de tu registro de contenedores.

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

    • Sustituye REGISTRY_PASSWORD por la contraseña de tu registro de contenedores.

  2. Abre tu cuenta de servicio predeterminada:

    kubectl edit serviceaccount default --namespace default

    Cada espacio de nombres de 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 tu contenedor, a menos que se especifique lo contrario cuando despliegues tu servicio de Knative Serving.

  3. Añade el secreto imagePullSecret que acabas de crear a tu cuenta de servicio predeterminada:

    imagePullSecrets:
    - name: container-registry
    

    Tu cuenta de servicio debería tener este aspecto:

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

Ahora, cualquier pod nuevo que se cree en el espacio de nombres default actual tendrá definido el secreto imagePullSecret.

Implementación con la inyección automática de sidecar habilitada

Para desplegar tu servicio con la inyección automática de sidecar de Istio habilitada, consulta la sección sobre la inyección automática de sidecar habilitada en la documentación de Cloud Service Mesh.

Desplegar servicios en una red interna

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

Siguientes pasos

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

Puedes automatizar las compilaciones y los despliegues de tus servicios de Knative Serving con activadores de Cloud Build: