Tanto Cloud Run como Kubernetes usan imágenes de contenedor estándar como artefactos de implementación y ambos usan un modelo de API declarativo con recursos que se pueden representar en archivos YAML con la misma estructura estándar.
Introducción
La API Admin v1 de Cloud Run se ha diseñado para maximizar la portabilidad con Kubernetes. Por ejemplo, los recursos de la API Admin de Cloud Run comparten las mismas convenciones de estructura y nombres de atributos que los recursos de Kubernetes. Consulta la referencia de YAML de servicios de Cloud Run.
La versión 1 de la API Admin de Cloud Run implementa la especificación de la API Serving de Knative, pero no es necesario que uses Knative en tu clúster de Kubernetes para migrar algunas de tus cargas de trabajo de Kubernetes a Cloud Run.
El recurso principal de Cloud Run es el servicio. Puedes considerar un servicio de Cloud Run como una abstracción de alto nivel que se parece a un despliegue de Kubernetes con un autoescalador de pods integrado y un endpoint único. Un "pod" en Kubernetes corresponde a una "instancia" en Cloud Run. Te recomendamos que transformes tus implementaciones de Kubernetes en servicios de Cloud Run, un servicio cada vez. También podrás combinar parte de la configuración de tu autoescalador de pods horizontal de Kubernetes y de los servicios de Kubernetes en el servicio de Cloud Run.
Cloud Run no tiene el concepto de espacio de nombres, sino que elGoogle Cloud proyecto se usa como límite de aislamiento entre recursos. Cuando migres de Kubernetes a Cloud Run, te recomendamos que crees unGoogle Cloud proyecto por cada espacio de nombres. En el YAML de un servicio de Cloud Run, el valor del espacio de nombres es el Google Cloud número de proyecto.
Cloud Run tiene una redundancia zonal integrada, lo que significa que no tienes que aprovisionar réplicas para asegurarte de que tu servicio sea resistente a las interrupciones zonales en la región Google Cloud seleccionada.
Guía de inicio rápido
Esta guía de inicio rápido es un ejemplo de migración sencillo.
Comparación de recursos sencilla
Compara el siguiente despliegue sencillo de Kubernetes llamado my-app
con el servicio de Cloud Run equivalente.
Observa que los archivos YAML son casi idénticos.
Las partes de blue
son diferentes y
deben cambiarse.
Las partes en red
se deben eliminar
porque Cloud Run tiene un escalador automático integrado.
Despliegue de Kubernetes | Servicio de Cloud Run |
---|---|
apiVersion: apps/v1 kind: Deployment metadata: name: my-app namespace: default labels: app: my-app spec: template: metadata: labels: app: my-app spec: containers: - image: gcr.io/cloudrun/hello env: - name: HELLO value: world replicas: 3 selector: matchLabels: app: my-app |
apiVersion: serving.knative.dev/v1 kind: Service metadata: name: my-app namespace: 'PROJECT_NUMBER' labels: app: my-app spec: template: metadata: labels: app: my-app spec: containers: - image: gcr.io/cloudrun/hello env: - name: HELLO value: world |
Migrar un despliegue sencillo de Kubernetes a Cloud Run
Descarga el archivo YAML de tu implementación en el directorio actual con el siguiente comando:
kubectl get deployment my-app -o yaml > my-app.yaml
Modifica el archivo YAML para que coincida con un servicio de Cloud Run. Actualiza el archivo de
my-app.yaml
:- En el atributo "
kind
", sustituye el valor "Deployment
" por "Service
". - En el atributo "
apiVersion
", sustituye el valor "apps/v1
" por "serving.knative.dev/v1
". - Elimine el atributo
metadata.namespace
o cambie su valor para que coincida con su número de proyecto Google Cloud . - Eliminar
spec.replicas
yspec.selector
- En el atributo "
Despliega el archivo
my-app.yaml
en Cloud Run con el siguiente comando. Sustituye REGION por la región Google Cloud que quieras, por ejemplo,europe-west1
:gcloud run services replace my-app.yaml --region REGION
La invocación de un servicio de Cloud Run está protegida por un permiso de gestión de identidades y accesos. Si quieres exponer públicamente el nuevo servicio de Cloud Run en Internet y permitir el acceso público, ejecuta el siguiente comando:
gcloud run services add-iam-policy-binding my-app --member="allUsers" --role="roles/run.invoker" --region REGION
Funciones no admitidas por Cloud Run
Solo se pueden migrar las cargas de trabajo que se adapten a Cloud Run.
En concreto, Cloud Run no admite las siguientes funciones de Kubernetes:
- Número fijo de
replicas
(para solucionar este problema, usa el mismo número de instancias mínimas y máximas - ConfigMaps (solución alternativa disponible)
- Estrategias de autoescalado horizontal de pods personalizadas
- Descubrimiento de servicios
- Disco local (efímero y persistente)
Al migrar un archivo YAML de un despliegue de Kubernetes a un servicio de Cloud Run, el comando gcloud run services replace
devolverá un mensaje de error claro para cualquier atributo que no sea compatible con Cloud Run.
Elimina o actualiza estos atributos y, a continuación, repite el comando hasta que se complete correctamente.
Puedes consultar la referencia de YAML para ver una lista exhaustiva de los atributos compatibles con Cloud Run.
Migrar recursos de Kubernetes
Migrar secretos de Kubernetes
Al igual que Kubernetes, Cloud Run admite el montaje de secretos como variables de entorno o volúmenes, pero los secretos deben almacenarse en Secret Manager.
Hay varias diferencias importantes entre los secretos de Secret Manager y los de Kubernetes:
- Caracteres admitidos en los nombres:
- Secretos de Kubernetes:
[a-z0-9-.]{1,253}
- Secretos de Secret Manager:
[a-zA-Z0-9_-]{1,255}
- Secretos de Kubernetes:
- Control de versiones: los secretos de Secret Manager tienen versiones, mientras que los secretos de Kubernetes no.
- Carga útil: los secretos de Secret Manager contienen un solo
[]byte
, mientras que los secretos de Kubernetes contienen unmap<string, string>
.
Sigue la documentación de Secret Manager para crear un secreto y añadir una nueva versión del secreto para cada clave secreta de la que dependa tu aplicación de Kubernetes.
Migrar ConfigMaps de Kubernetes
Cloud Run no tiene un equivalente de los ConfigMaps de Kubernetes, pero, como los ConfigMaps se pueden considerar secretos sin cifrar, puedes transformar tus ConfigMaps en secretos en Secret Manager. Consulta las instrucciones en la sección Migrar secretos de Kubernetes.
Migrar un despliegue de Kubernetes
El despliegue de Kubernetes es el recurso que se corresponde más con el servicio de Cloud Run. Te recomendamos que empieces con el archivo YAML de tu despliegue de Kubernetes y lo edites para transformarlo en un servicio de Cloud Run.
Estos son los principales cambios obligatorios:
- El
namespace
debe sustituirse por el Google Cloud número de proyecto. - Las etiquetas (
metadata.labels
yspec.template.metadata.labels
) deben ser etiquetas válidas Google Cloud . - Los contenedores deben almacenarse en un registro de contenedores admitido.
- Es posible que tengas que ajustar los límites de CPU y memoria.
- Cuando se hace referencia a un secreto, el atributo "
key
" se usa para obtener la versión en Secret Manager, mientras que "latest
" hace referencia a la versión más reciente del secreto. serviceAccountName
debe hacer referencia a una cuenta de servicio del proyecto Google Cloud actual- Las referencias a ConfigMaps (
configMapKeyRef
) deben sustituirse por referencias a secretos (secretKeyRef
).
Si tu implementación de Kubernetes accede a otros recursos de tu clúster de Kubernetes o a recursos de una VPC, debes conectar el servicio de Cloud Run a la VPC correspondiente.
Migrar un servicio de Kubernetes
Los servicios de Cloud Run exponen automáticamente un punto final único que dirige el tráfico al contenedor con un containerPort
.
Una vez que hayas migrado tu despliegue de Kubernetes a un servicio de Cloud Run, no será necesario que migres los servicios de Kubernetes que dirigían el tráfico a este despliegue.
Migrar un HorizontalPodAutoscaler de Kubernetes
Los servicios de Cloud Run tienen un autoescalador horizontal integrado: Cloud Run escala automáticamente los pods (llamados "instancias") mediante una combinación de factores dentro de los límites de su número mínimo y máximo de instancias definido.
Migra los atributos minReplicas
y maxReplicas
del HorizontalPodAutoscaler a las anotaciones autoscaling.knative.dev/minScale
y autoscaling.knative.dev/maxScale
del servicio de Cloud Run.
Consulta la documentación sobre cómo configurar las instancias mínimas y las instancias máximas.
Migrar una tarea de Kubernetes
Porque un trabajo de Kubernetes es similar a una ejecución de trabajo de Cloud Run. Puedes migrar a una tarea de Cloud Run y ejecutarla.
En los siguientes ejemplos se muestra la diferencia estructural entre un trabajo de Kubernetes y un trabajo de Cloud Run:
Tarea de Kubernetes | Tarea de Cloud Run |
---|---|
apiVersion: batch/v1
kind: Job
metadata:
name: my-job
spec:
template:
spec:
containers:
- image: us-docker.pkg.dev/cloudrun/container/job
|
apiVersion: run.googleapis.com/v1 kind: Job metadata: name: my-job spec: template: spec: template: spec: containers: - image: us-docker.pkg.dev/cloudrun/container/job |
Estrategia de migración
Después de crear los recursos equivalentes, puedes exponer los endpoints externos detrás de un balanceador de carga de aplicaciones externo global para migrar gradualmente el tráfico entre Cloud Run y Google Kubernetes Engine (GKE).