Cloud Run e Kubernetes utilizzano entrambi immagini container standard come artefatti di deployment e un modello di API dichiarativo con risorse che possono essere rappresentate in file YAML con la stessa struttura standard.
Introduzione
L'API Cloud Run Admin v1 è progettata per massimizzare la portabilità con Kubernetes. Ad esempio, le risorse dell'API Cloud Run Admin condividono le stesse convenzioni di struttura e gli stessi nomi di attributi delle risorse Kubernetes. Consulta il riferimento YAML del servizio Cloud Run.
L'API Cloud Run Admin v1 implementa la specifica dell'API Knative Serving, ma non è necessario eseguire la migrazione a Knative per spostare i carichi di lavoro Cloud Run in un cluster Kubernetes come GKE.
Guida rapida
Questa guida rapida è un esempio di una semplice migrazione.
Confronto semplice delle risorse
Confronta il seguente semplice servizio Cloud Run denominato my-app con il
deployment Kubernetes equivalente.
Nota che i file YAML sono quasi identici.
Tuttavia, le parti in blue sono diverse e devono essere modificate.
Le parti in green devono essere aggiunte.
| Servizio Cloud Run | Deployment Kubernetes |
|---|---|
apiVersion: serving.knative.dev/v1 kind: Service metadata: name: my-app namespace: 'PROJECT_NUMBER' spec: template: spec: containers: - image: gcr.io/cloudrun/hello env: - name: HELLO value: world |
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 |
Eseguire la migrazione di un servizio Cloud Run a GKE
Scarica il file YAML del servizio nella directory corrente:
gcloud run services describe my-app --format export > my-app.yaml
Modifica il file YAML in modo che corrisponda a un deployment Kubernetes:
- Per l'attributo "
kind": sostituisci il valore "Service" con "Deployment" - Per l'attributo "
apiVersion": sostituisci il valore "serving.knative.dev/v1" con "apps/v1" - Sostituisci
metadata.namespacecon lo spazio dei nomi del cluster GKE in cui vuoi eseguire il deployment, ad esempiodefault. - Aggiungi una nuova etichetta in
metadataespec.template.metadata. - Imposta un numero fisso di istanze ("repliche") utilizzando
spec.template.spec.replicase imposta un selettore di etichette inspec.template.spec.selector.
- Per l'attributo "
Installa e utilizza lo strumento a riga di comando
kubectlper eseguire il deployment del filemy-app.yamlnel cluster GKE:kubectl apply -f ./my-app.yaml
Esponi il deployment come servizio:
kubectl expose deployment my-app --type LoadBalancer --port 80 --target-port 8080
Considerazioni sulla migrazione da Cloud Run a GKE
Cluster:
Cloud Run è una piattaforma completamente gestita, mentre GKE richiede una maggiore gestione della piattaforma. Se non hai ancora creato un cluster GKE, utilizza GKE Autopilot.
La scalabilità dei carichi di lavoro GKE è limitata dalle dimensioni del cluster. Se non utilizzi un cluster Autopilot, valuta la possibilità di utilizzare il provisioning automatico dei nodi e un gestore della scalabilità automatica dei cluster per ridimensionare il cluster.
Cloud Run ha una ridondanza zonale integrata, quindi esegui la migrazione a un cluster regionale e fornisci un numero sufficiente di repliche per garantire che il servizio sia resiliente a un' interruzione zonale nella regione selezionata Google Cloud .
Prezzi
Cloud Run addebita le risorse utilizzate, mentre GKE addebita le risorse di cui è stato eseguito il provisioning.
Sicurezza:
A differenza di Cloud Run, la chiamata di un servizio GKE non è soggetta a un'autorizzazione invoker IAM.
Poiché GKE non fornisce un isolamento efficace tra i container, valuta la possibilità di utilizzare GKE Sandbox se devi eseguire codice sconosciuto o non attendibile.
Networking
Cloud Run richiede un connettore di accesso VPC serverless per accedere ad altre risorse in un VPC. I carichi di lavoro GKE si trovano direttamente in un VPC e non richiedono un connettore.
Funzionalità non supportate da Google Kubernetes Engine
Le seguenti funzionalità di Cloud Run non sono disponibili su GKE:
- Controllo delle versioni della configurazione tramite revisioni
- Suddivisione del traffico per implementazioni e rollback graduali delle revisioni
- Fatturazione basata sulle richieste
- Potenziamento della CPU
- Affinità sessione
- Le etichette sui carichi di lavoro GKE non sono Google Cloud etichette
- Tag sui carichi di lavoro
Eseguire la migrazione delle risorse Cloud Run
Le sezioni seguenti descrivono la migrazione delle risorse utilizzate in Cloud Run, come servizi, job e secret Cloud Run.
Eseguire la migrazione dei servizi Cloud Run
Puoi eseguire la migrazione di un servizio Cloud Run alle seguenti risorse su GKE:
- Deployment Kubernetes per creare istanze (chiamate "pod" in Kubernetes).
- Servizi Kubernetes per esporre il deployment a un endpoint specifico.
- Horizontal Pod Autoscaler di Kubernetes: per scalare automaticamente il deployment.
Gli attributi di un deployment Kubernetes sono un superset degli attributi di un servizio Cloud Run.
Come mostrato nella guida rapida, dopo aver modificato gli attributi apiVersion e
kind in apps/v1 e Deployment, devi anche modificare quanto segue:
- Sostituisci
namespacecon lo spazio dei nomi del cluster GKE in cui eseguire il deployment, ad esempiodefault. serviceAccountNamedeve fare riferimento a un account di servizio Kubernetes, che può fungere facoltativamente da account di servizio IAM con Workload Identity Federation for GKE.- Aggiungi un LABEL in
metadata.labelsespec.template.metadata.labelsche verrà utilizzato per selezionare il deployment e i pod. Ad esempio:app: NAME - In
spec.template:- Aggiungi un attributo
replicasper specificare un numero di "istanze". - Aggiungi un attributo
selector.matchLabelsche seleziona l'etichetta LABEL.
- Aggiungi un attributo
- Se il servizio Cloud Run monta i secret, consulta Eseguire la migrazione dei secret.
- Se il servizio Cloud Run di cui è stata eseguita la migrazione accedeva alle risorse su un Virtual Private Cloud, non è necessario utilizzare un connettore di accesso VPC serverless.
Dopo aver creato il deployment Kubernetes, crea un servizio Kubernetes per esporlo:
apiVersion: v1
kind: Service
metadata:
name: NAME
spec:
selector:
LABEL
ports:
- protocol: TCP
port: 80
targetPort: PORT
Sostituisci:
- NAME: con il nome del servizio.
- LABEL: con l'etichetta definita nel deployment. Ad esempio
app: NAME. - PORT: con
containerPortdel container che riceve le richieste nel servizio Cloud Run, il cui valore predefinito è8080.
Facoltativamente, puoi creare un Horizontal Pod Autoscaler di Kubernetes per scalare automaticamente il numero di pod.
Segui la documentazione relativa alla scalabilità automatica orizzontale dei pod di Kubernetes per creare un HorizontalPodAutoscaler.
Utilizza i valori delle istanze minime
(autoscaling.knative.dev/minScale)
e delle istanze massime
(autoscaling.knative.dev/maxScale)
del servizio Cloud Run come valori per gli attributi minReplicas e
maxReplicas di HorizontalPodAutoscaler.
Eseguire la migrazione dei pool di worker Cloud Run
Puoi eseguire la migrazione di un pool di worker Cloud Run a un deployment Kubernetes su GKE.
Gli esempi seguenti mostrano la differenza strutturale tra un pool di worker Cloud Run e un deployment Kubernetes.
| Pool di worker Cloud Run | Deployment Kubernetes |
|---|---|
apiVersion: run.googleapis.com/v1 kind: WorkerPool metadata: name: my-app annotations: run.googleapis.com/manualInstanceCount: '1' spec: template: metadata: labels: app: my-app spec: containers: - image: gcr.io/cloudrun/hello env: - name: HELLO value: world |
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 |
Eseguire la migrazione dei job Cloud Run
Puoi eseguire la migrazione di un job Cloud Run a un job Kubernetes su GKE.
A differenza dei job Cloud Run, i job Kubernetes vengono eseguiti quando vengono creati. Se vuoi eseguire di nuovo il job, devi crearne uno nuovo.
Gli esempi seguenti mostrano la differenza strutturale tra un job Cloud Run e un job Kubernetes:
| Job Cloud Run | Job Kubernetes |
|---|---|
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
|
apiVersion: batch/v1
kind: Job
metadata:
name: my-job
spec:
template:
spec:
containers:
- image: us-docker.pkg.dev/cloudrun/container/job
|
Eseguire la migrazione dei secret
Puoi conservare i secret esistenti in Secret Manager o eseguirne la migrazione ai secret Kubernetes.
Se scegli di conservare i secret in Secret Manager, dovrai aggiornare la modalità di utilizzo su GKE.
Se scegli di eseguire la migrazione da Secret Manager ai secret Kubernetes, tieni presente le seguenti differenze tra i secret di Secret Manager e i secret Kubernetes:
- Caratteri consentiti nei nomi:
- Secret Kubernetes:
[a-z0-9-.]{1,253} - Secret di Secret Manager:
[a-zA-Z0-9_-]{1,255}
- Secret Kubernetes:
- Controllo delle versioni: i secret di Secret Manager sono versionati, mentre i secret Kubernetes non lo sono.
- Payload: i secret di Secret Manager contengono un singolo
[]byte, mentre i secret Kubernetes contengono unamap<string, string>.
Strategia di migrazione
Dopo aver creato le risorse equivalenti, l'esposizione degli endpoint esterni dietro un bilanciatore del carico delle applicazioni esterno globale consente di eseguire gradualmente la migrazione del traffico tra Cloud Run e Google Kubernetes Engine (GKE).