Configura OpenAPI di Cloud Endpoints per Knative serving con ESPv2

Questa pagina mostra come configurare Cloud Endpoints per Knative serving. Endpoints utilizza Extensible Service Proxy V2 (ESPv2) come gateway API. Per fornire la gestione delle API per Knative serving, devi eseguire il deployment del container ESPv2 predefinito su Knative serving in esecuzione su un cluster GKE.

Con questa configurazione, ESPv2 intercetta tutte le richieste ai tuoi servizi ed esegue i controlli necessari (come l'autenticazione) prima di richiamare il servizio. Quando il servizio risponde, ESPv2 raccoglie e segnala la telemetria.

Per una panoramica degli endpoint, vedi Informazioni sugli endpoint e Architettura degli endpoint.

Elenco attività

Durante il tutorial, utilizza il seguente elenco di attività. Per completare questo tutorial sono necessarie tutte le attività.

  1. Crea un progetto Google Cloud e, se non hai eseguito il deployment di Knative serving, esegui il deployment di un servizio di esempio. Vedi Prima di iniziare.

  2. Crea un cluster GKE con Knative serving abilitato.

  3. Esegui il deployment di un servizio Knative serving di esempio.

  4. Crea un documento OpenAPI che descriva l'API Endpoints e configura le route al servizio Knative serving. Consulta Configurazione di Endpoints.

  5. Esegui il deployment del documento OpenAPI per creare un servizio gestito. Consulta Deployment della configurazione di Endpoints.

  6. Crea una nuova immagine Docker ESPv2 con la configurazione del tuo servizio Endpoints. Consulta Creazione di una nuova immagine ESPv2.

  7. Esegui il deployment della nuova immagine Knative serving ESPv2. Vedi Deployment dell'immagine Cloud Run ESPv2.

  8. Crea una mappatura di dominio al servizio Knative serving ESPv2.

  9. Testa la configurazione inviando una richiesta all'API.

  10. Monitora l'attività relativa ai tuoi servizi. Consulta Monitoraggio dell'attività dell'API.

  11. Esegui la pulizia.

Costi

In questo documento vengono utilizzati i seguenti componenti fatturabili di Google Cloud:

Per generare una stima dei costi in base all'utilizzo previsto, utilizza il Calcolatore prezzi. I nuovi utenti di Google Cloud possono essere idonei a una prova senza costi aggiuntivi.

Una volta completate le attività descritte in questo documento, puoi evitare la fatturazione continua eliminando le risorse che hai creato. Per ulteriori informazioni, consulta la pagina Pulizia.

Prima di iniziare

  1. Accedi al tuo account Google Cloud. Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti gratuiti per l'esecuzione, il test e il deployment dei carichi di lavoro.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  5. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  6. Prendi nota dell'ID progetto perché sarà necessario in seguito. Nel resto della pagina, questo ID progetto è indicato come ESP_PROJECT_ID.
  7. Scarica e installa Google Cloud SDK.
  8. Installa cURL se vuoi inviare una richiesta al servizio di esempio di cui è stato eseguito il deployment.

Configurazione della riga di comando gcloud

Per configurare gcloud CLI per Knative serving per Anthos:

  1. Assicurati che Google Cloud SDK sia autorizzato ad accedere ai tuoi dati e servizi.

    1. Accedi.

      gcloud auth login

    2. Nella nuova scheda del browser che si apre, scegli un account con il ruolo di Editor o Proprietario nel progetto Google Cloud che hai creato per il deployment di ESPv2 in Knative serving.

  2. Aggiorna i componenti di gcloud installati:

    gcloud components update
  3. Configura la piattaforma su gke e configura l'impostazione di progetto predefinita per gcloud su quella che hai appena creato:

    gcloud config set run/platform gke 
    gcloud config set project ESP_PROJECT_ID

    Sostituisci ESP_PROJECT_ID con l'ID del progetto che hai creato.

  4. Imposta la zona che preferisci per il nuovo cluster. Puoi utilizzare qualsiasi zona in cui è supportato GKE, ad esempio:

    gcloud config set compute/zone ZONE

    Sostituisci ZONE con la tua zona. Ad esempio, utilizza us-central1-a. Puoi utilizzare qualsiasi zona supportata da GKE.

  5. Abilita le seguenti API per il progetto, necessarie per creare un cluster, generare e pubblicare un container in Google Container Registry:

    gcloud services enable container.googleapis.com containerregistry.googleapis.com cloudbuild.googleapis.com

Creazione di un cluster GKE con Knative serving abilitato

Per creare un cluster e abilitarlo per Knative serving su Google Cloud:

  1. Crea un nuovo cluster utilizzando il comando:

    gcloud container clusters create CLUSTER_NAME \ 
      --addons=HttpLoadBalancing,CloudRun \ 
      --machine-type=n1-standard-4 \ 
      --num-nodes=3 \ 
      --enable-stackdriver-kubernetes

    Sostituisci CLUSTER_NAME con il nome che preferisci per il cluster.

    Anche se queste istruzioni non abilitano la scalabilità automatica dei cluster per ridimensionare i cluster per la domanda, Knative serving su Google Cloud scala automaticamente le istanze all'interno del cluster.

  2. Attendi il completamento della creazione del cluster. Durante il processo di creazione, dovresti vedere messaggi simili ai seguenti:

    Creating cluster CLUSTER_NAME...done. 
    Created [https://container.googleapis.com/v1/projects/ESP_PROJECT_ID/zones/ZONE/clusters/CLUSTER_NAME].

    L'output mostra anche la versione del cluster nella colonna NODE_VERSION dell'output. Ad esempio, 1.15.11-gke.1 o 1.14.10-gke.27. Prendi nota della versione del cluster da utilizzare più avanti in questo documento.

  3. Configura le impostazioni predefinite di gcloud per utilizzare il nuovo cluster e la nuova posizione, per evitare di specificarli quando utilizzi gcloud CLI:

    gcloud config set run/cluster CLUSTER_NAME
    gcloud config set run/cluster_location ZONE
  4. Utilizza il comando seguente per visualizzare i dettagli del nuovo cluster:

    gcloud container clusters describe CLUSTER_NAME
  5. Utilizza il comando seguente per recuperare le credenziali per il tuo cluster:

    gcloud container clusters get-credentials CLUSTER_NAME

Deployment di un container Knative serving di esempio

Per eseguire il deployment del container di esempio Knative serving "hello" nel cluster appena creato:

  1. Vai a Cloud Run

  2. Fai clic su Crea servizio.

  3. Seleziona Knative serving come piattaforma di sviluppo.

  4. Nel menu a discesa dei cluster disponibili, seleziona il cluster che hai appena creato.

  5. Utilizza il nome hello come Nome servizio. Puoi utilizzare un altro nome, ma in tal caso assicurati di utilizzarlo in seguito. Queste istruzioni presuppongono che utilizzi hello.

  6. Seleziona Interna in Connettività in modo che il servizio non sia accessibile dall'esterno.

  7. Fai clic su Avanti per passare alla seconda pagina del modulo di creazione del servizio.

  8. Specifica gcr.io/cloudrun/hello come URL immagine container.

  9. Fai clic su Crea per eseguire il deployment dell'immagine in Knative serving e attendi il completamento del deployment.

    Al termine, viene visualizzata la schermata Revisioni. Tieni presente che l'URL del servizio di cui è stato eseguito il deployment è:

    http://hello.default.svc.cluster.local

    Quando crei un servizio interno, GKE crea un nome DNS che può essere risolto solo per le richieste provenienti dall'interno del cluster stesso, non per le richieste esterne. Non puoi accedere a questo link esternamente dal cluster. Per ulteriori informazioni, consulta Servizi Cloud Run.

  10. Per verificare che il servizio funzioni correttamente utilizzando cURL, configura un tunnel dal desktop al cluster. Per visualizzare queste istruzioni, fai clic sull'icona a destra dell'URL nella schermata Revisioni:

    Schermata Revisioni.

  11. Si apre un riquadro che mostra i due comandi che utilizzi per accedere al servizio interno. Devi eseguire questi comandi in due finestre del terminale separate perché il primo comando configura il port forwarding utilizzato dal secondo comando.

    Quando esegui il comando cURL, dovresti vedere l'output del servizio nel formato:

    <!doctype html>
    <html lang=en> 
    <head> 
    <meta charset=utf-8> 
    <meta name="viewport" content="width=device-width, initial-scale=1"> 
    <title>Congratulations | Cloud Run</title> 
    ...

Configurazione di Endpoints

Devi disporre di un documento OpenAPI basato sulla specifica OpenAPI v2.0 che descriva la piattaforma del tuo servizio di backend ed eventuali requisiti di autenticazione. Devi inoltre aggiungere un campo specifico di Google che contenga l'URL di ogni servizio, in modo che ESPv2 disponga delle informazioni necessarie per richiamare un servizio. Se è la prima volta che utilizzi OpenAPI, consulta la panoramica di OpenAPI per ulteriori informazioni.

Informazioni sull'impostazione del campo host della specifica OpenAPI

Nel campo host della specifica OpenAPI, specifichi il nome del servizio Endpoints utilizzato per accedere al servizio Knative serving. Il nome del servizio Endpoints ha il seguente formato:

API_NAME.endpoints.ESP_PROJECT_ID.cloud.goog

Poiché il nome di servizio Endpoints corrisponde a un nome di dominio, il nome deve seguire queste regole:

  • Deve contenere solo lettere minuscole, numeri, punti o trattini.
  • Non deve iniziare con un trattino.
  • Non deve contenere un trattino basso.

Ad esempio:

hello-api.endpoints.ESP_PROJECT_ID.cloud.goog

Creazione della specifica OpenAPI

  1. Crea un file di testo denominato openapi-run-anthos.yaml.

  2. Il tuo servizio di backend Knative serving è definito nella parte superiore del file openapi-run-anthos.yaml, in una definizione di x-google-backend. Ad esempio:

    swagger: '2.0' 
    info:
      title: Cloud Endpoints + Cloud Run
      description: Sample API on Cloud Endpoints with a Cloud Run backend
      version: 1.0.0 
    host: API_NAME.endpoints.ESP_PROJECT_ID.cloud.goog
    x-google-endpoints:
    - name: API_NAME.endpoints.ESP_PROJECT_ID.cloud.goog
      target: "INGRESS-IP"
    schemes:
      - https
    produces:
      - application/json
    x-google-backend:
      address: http://hello.default.svc.cluster.local
      disable_auth: true
    paths:
      /hello:
        get:
          summary: Greet a user
          operationId: hello
          responses:
            '200':
              description: A successful response
              schema:
                type: string

    Il rientro è importante per il formato YAML. Ad esempio, il campo host deve essere allo stesso livello di info.

  3. Nel campo host, specifica il nome di dominio dell'API Endpoints utilizzata per accedere al servizio Knative serving, nel formato:

    API_NAME.endpoints.ESP_PROJECT_ID.cloud.goog

    Ad esempio:

    hello-api.endpoints.ESP_PROJECT_ID.cloud.goog
  4. L'estensione x-google-endpoints registra una voce DNS per il tuo servizio Endpoints sul dominio cloud.goog, nel formato:

    x-google-endpoints: 
      - name: "API_NAME.endpoints.ESP_PROJECT_ID.cloud.goog"
      target: "IP_ADDRESS"

    IP_ADDRESS è l'IP del servizio istio-ingress per il tuo cluster. Per determinare questo indirizzo IP:

    1. Vai alla pagina Google Kubernetes Engine nella console Google Cloud:

      Vai a Google Kubernetes Engine

    2. Fai clic su Servizi e Ingress nel pannello di navigazione a sinistra per visualizzare un elenco di servizi.

    3. Se la versione del cluster è 1.15.3-gke.19 o successiva, 1.14.3-gke.12 o successiva oppure 1.13.10-gke.8 o successiva, scorri verso il basso fino al servizio istio-ingress. Per tutte le altre versioni del cluster, scorri verso il basso fino al servizio istio-ingressgateway.

    4. Copia l'indirizzo IP esterno mostrato accanto al bilanciatore del carico, senza l'impostazione della porta, se presente. Ad esempio, se l'IP è XX.XXX.XX.XXX:15020, ometti :15020. Ignora gli altri indirizzi IP elencati.

  5. Nel campo address della sezione x-google-backend, specifica il nome DNS interno del servizio "hello" di backend Knative serving e disabilita l'autenticazione per questo servizio. Ciò è necessario perché la chiamata da ESPv2 al servizio Knative serving viene effettuata come chiamata interna dall'interno del cluster, di conseguenza l'autenticazione non è necessaria.

  6. Prendi nota del valore della proprietà title nel file openapi-run-anthos.yaml:

    title: Cloud Endpoints + Cloud Run 
  7. Il valore della proprietà title diventa il nome del servizio Endpoints dopo il deployment della configurazione.

  8. Salva il documento OpenAPI.

Per informazioni sui campi del documento OpenAPI richiesto da Endpoints, consulta Configurazione di Endpoints.

esegui il deployment della configurazione di Endpoints

Per eseguire il deployment della configurazione di Endpoints, utilizza il comando gcloud Endpoints services deploy. Questo comando utilizza Service Management per creare un servizio gestito.

Per eseguire il deployment della configurazione di Endpoints:

  1. Assicurati di trovarti nella directory che contiene il documento OpenAPI.

  2. Carica la configurazione e crea un servizio gestito.

    gcloud endpoints services deploy openapi-run-anthos.yaml \ 
      --project ESP_PROJECT_ID

    Questa operazione crea un nuovo servizio Endpoints con il nome specificato nel campo host del file openapi-run-anthos.yaml. Il servizio Endpoints è configurato in base al documento OpenAPI.

    Durante la creazione e la configurazione del servizio Endpoints, Service Management invia le informazioni al terminale. Al termine del deployment, viene visualizzato un messaggio simile al seguente:

    Service Configuration [CONFIG_ID] uploaded for service [API_NAME.endpoints.ESP_PROJECT_ID.cloud.goog]

    CONFIG_ID è l'ID univoco di configurazione del servizio Endpoints creato dal deployment. Ad esempio:

    Service Configuration [2019-02-01r0] uploaded for service [hello-api.endpoints.ESP_PROJECT_ID.cloud.goog] 

    L'ID configurazione del servizio è costituito da un timbro della data seguito da un numero di revisione. Se esegui di nuovo il deployment di openapi-run-anthos.yaml nello stesso giorno, il numero di revisione viene incrementato nell'ID configurazione del servizio. Puoi visualizzare la configurazione del servizio e la cronologia del deployment nella pagina Endpoint > Servizi della console Google Cloud.

    Se viene visualizzato un messaggio di errore, consulta Risoluzione dei problemi di deployment della configurazione di Endpoints.

Controllo dei servizi richiesti in corso...

Come minimo, Endpoints ed ESP richiedono l'abilitazione dei seguenti servizi Google:
Nome Titolo
servicemanagement.googleapis.com API Service Management
servicecontrol.googleapis.com API Service Control
endpoints.googleapis.com Google Cloud Endpoints

Nella maggior parte dei casi, il comando gcloud endpoints services deploy abilita questi servizi richiesti. Tuttavia, il comando gcloud viene completato correttamente, ma non abilita i servizi richiesti nelle seguenti circostanze:

  • Se hai utilizzato un'applicazione di terze parti, come Terraform, e non includi questi servizi.

  • Hai eseguito il deployment della configurazione di Endpoints in un progetto Google Cloud esistente in cui questi servizi sono stati disattivati esplicitamente.

Utilizza il comando seguente per confermare che i servizi richiesti siano abilitati:

gcloud services list

Se non vedi elencati i servizi richiesti, abilitali:

gcloud services enable servicemanagement.googleapis.com
gcloud services enable servicecontrol.googleapis.com
gcloud services enable endpoints.googleapis.com

Abilita anche il servizio Endpoints:

gcloud services enable ENDPOINTS_SERVICE_NAME

Per determinare il ENDPOINTS_SERVICE_NAME puoi:

  • Dopo aver eseguito il deployment della configurazione di Endpoints, vai alla pagina Endpoint nella console Cloud. L'elenco dei possibili ENDPOINTS_SERVICE_NAME è visualizzato nella colonna Nome servizio.

  • Per OpenAPI, il valore ENDPOINTS_SERVICE_NAME è quello che hai specificato nel campo host delle tue specifiche OpenAPI. Per gRPC, il valore ENDPOINTS_SERVICE_NAME è quello che hai specificato nel campo name della configurazione di gRPC Endpoints.

Per ulteriori informazioni sui comandi gcloud, consulta i servizi gcloud.

Creazione di una nuova immagine Knative serving ESPv2

Crea la configurazione del servizio Endpoints in una nuova immagine Docker ESPv2. Dopo aver creato questa immagine, puoi eseguirne il deployment nel tuo cluster.

Per creare la configurazione del servizio in una nuova immagine Docker ESPv2:

  1. Scarica questo script sulla tua macchina locale in cui è installato gcloud CLI ed eseguilo come:

    chmod +x gcloud_build_image
    ./gcloud_build_image -s API_NAME.endpoints.ESP_PROJECT_ID.cloud.goog \ 
    -c CONFIG_ID -p ESP_PROJECT_ID

    Lo script utilizza il comando gcloud per scaricare la configurazione del servizio, compilarla in una nuova immagine ESPv2 e caricare la nuova immagine nel Container Registry del progetto. Lo script utilizza automaticamente la release più recente di ESPv2, indicata dal ESP_VERSION nel nome dell'immagine di output. L'immagine di output viene caricata in:

    gcr.io/ESP_PROJECT_ID/endpoints-runtime-serverless:ESP_VERSION-API_NAME.endpoints.ESP_PROJECT_ID.cloud.goog-CONFIG_ID

Deployment dell'immagine Knative serving ESPv2

Esegui il deployment dell'immagine del servizio Knative serving ESPv2 nel tuo cluster:

  1. Esegui il deployment del servizio Knative serving ESPv2 con la nuova immagine:

    gcloud run deploy ESP_V2_SERVICE_NAME \ 
      --image="gcr.io/ESP_PROJECT_ID/endpoints-runtime-serverless:ESP_VERSION-API_NAME.endpoints.ESP_PROJECT_ID.cloud.goog-CONFIG_ID" \ 
      --platform gke \ 
      --project=ESP_PROJECT_ID

    Per ESP_PROJECT_ID, specifica il nome che vuoi utilizzare per il servizio ESPv2. In questo esempio, imposta ESP_V2_SERVICE_NAME su espv2.

  2. Se vuoi configurare Endpoints per l'utilizzo di opzioni di avvio aggiuntive di ESPv2, ad esempio l'abilitazione di CORS, puoi passare gli argomenti nella variabile di ambiente ESPv2_ARGS:

    gcloud run deploy ESP_V2_SERVICE_NAME \
      --image="gcr.io/ESP_PROJECT_ID/endpoints-runtime-serverless:ESP_VERSION-API_NAME.endpoints.ESP_PROJECT_ID.cloud.goog-CONFIG_ID" \ 
      --set-env-vars=ESPv2_ARGS=--cors_preset=basic \ 
      --platform gke \ 
      --project ESP_PROJECT_ID

    Per ulteriori informazioni ed esempi sull'impostazione della variabile di ambiente ESPv2_ARGS, incluso l'elenco delle opzioni disponibili e informazioni su come specificare più opzioni, vedi Flag di Extensible Service Proxy V2.

Il servizio ESPv2 viene distribuito come servizio esterno, il che significa che puoi accedervi utilizzando un comando cURL nel formato:

curl -H "Host: espv2.default.example.com" http://IP_ADDRESS

dove IP_ADDRESS è l'indirizzo IP del servizio istio-ingress per il tuo cluster.

Per visualizzare questo comando cURL, fai clic sull'icona IMAGE a destra dell'URL ESPv2 nella schermata Revisioni del servizio Knative serving ESPv2 di cui è stato eseguito il deployment.

Ora puoi effettuare chiamate API al tuo servizio Endpoints tramite il servizio ESPv2. Ad esempio, per effettuare una richiesta a un servizio Endpoints con un percorso di /hello, potresti effettuare una richiesta nel formato:

curl -H "Host: espv2.default.example.com" http://IP_ADDRESS/hello

Tuttavia, specificare un'intestazione host per ogni richiesta al servizio Endpoints non è facile da usare. Nella sezione successiva, configurerai una mappa di dominio per semplificare l'esecuzione di una chiamata al servizio di endpoint tramite ESPv2.

Creazione di una mappatura di dominio al servizio Knative serving ESPv2

Per poter omettere l'intestazione host quando effettui una richiesta, aggiungi una mappatura di dominio per il servizio ESPv2:

  1. Vai a Cloud Run

  2. Seleziona Gestisci domini personalizzati.

  3. Seleziona Aggiungi mappatura.

  4. Dal menu a discesa, seleziona Aggiungi mappatura del dominio del servizio.

  5. Nel campo Seleziona un servizio a cui mappare del popup Aggiungi mappatura, seleziona il servizio ESPv2.

  6. Nel campo Inserisci nome di dominio, specifica il nome di dominio che vuoi utilizzare per accedere al servizio Knative serving attraverso Endpoints. Ad esempio, specifica:

    API_NAME.endpoints.ESP_PROJECT_ID.cloud.goog

    Dove API_NAME è il nome dell'API Endpoints. In questo esempio puoi utilizzare "hello-api":

    hello-api.endpoints.ESP_PROJECT_ID.cloud.goog

  7. Fai clic su Continua. Viene visualizzato un riepilogo della mappatura.

  8. Seleziona Fine per salvare la mappatura.

invia richieste all'API

Utilizza cURL per inviare una richiesta HTTP all'API:

curl -X GET "http://hello-api.endpoints.ESP_PROJECT_ID.cloud.goog/hello"

Se non ricevi una risposta corretta, consulta Risoluzione dei problemi relativi agli errori di risposta.

Configurazione dell'API Endpoints per l'utilizzo di HTTPS

Il supporto automatico di TLS è disabilitato per impostazione predefinita per Knative serving su Google Cloud. Pertanto, in questo esempio, quando accedi all'API Endpoints tramite ESPv2, la chiamata viene effettuata utilizzando HTTP.

Puoi configurare ESPv2 in modo che supporti le richieste utilizzando HTTPS. Tieni presente che configuri il supporto HTTPS su ESPv2, il servizio esterno, non su "hello", il servizio di backend interno.

Per supportare HTTPS con ESPv2, devi:

  1. Possiedi un dominio. Se non hai un dominio, puoi richiederne uno a Cloud Domains o a un altro fornitore di domini.

  2. Crea una mappatura di dominio per il tuo servizio ESPv2 e hai aggiornato il tuo record DNS di conseguenza seguendo le istruzioni riportate nella pagina di mappatura dei domini.

    Se hai ottenuto il dominio da Cloud Domains, utilizza Cloud DNS o un server DNS a tua scelta. L'utilizzo di un dominio di Cloud Domains è l'opzione più semplice.

  3. Nella specifica OpenAPI di Endpoints:

    1. Imposta il campo host in modo che faccia riferimento al tuo dominio anziché a *.cloud.goog.

    2. Rimuovi il tag x-google-endpoints e le relative due proprietà secondarie.

Per le istruzioni complete e il tutorial, vedi Attivare i certificati HTTPS e TLS automatici.

monitora l'attività dell'API

  1. Visualizza i grafici delle attività per l'API nella pagina Endpoint > Servizio nella console Google Cloud.

    Visualizzare i grafici delle attività di Endpoints

    Potrebbero essere necessari alcuni minuti prima che la richiesta venga riportata nei grafici.

  2. Controlla i log delle richieste per l'API nella pagina Esplora log. Visualizza i log delle richieste di Endpoints

Creazione di un portale per gli sviluppatori per l'API

Puoi utilizzare il portale Cloud Endpoints per creare un portale per gli sviluppatori, un sito web che puoi utilizzare per interagire con l'API di esempio. Per ulteriori informazioni, consulta la panoramica del portale Cloud Endpoints.

Esegui la pulizia

Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questa pagina, segui questi passaggi.

Per informazioni sull'arresto dei servizi utilizzati da questo tutorial, consulta Eliminazione di un'API e di un'istanza API.

Passaggi successivi