Configurer Cloud Endpoints OpenAPI pour Knative serving avec ESPv2
Cette page vous explique comment configurer Cloud Endpoints pour Knative serving. Endpoints utilise le proxy Extensible Service Proxy V2 (ESPv2) en guise de passerelle API. Pour assurer la gestion des API pour Knative serving, vous devez déployer le conteneur ESPv2 prédéfini sur Knative serving exécuté sur un cluster GKE.
Une fois la configuration finalisée, ESPv2 peut intercepter toutes les requêtes adressées à vos services avant de les appeler, afin d'effectuer les vérifications nécessaires, telles que l'authentification. Lorsque le service répond, ESPv2 rassemble et consigne les données de télémétrie.
Pour obtenir une présentation d'Endpoints, consultez les pages À propos d'Endpoints et Architecture Endpoints.
Liste de tâches
Tout au long du tutoriel, reportez-vous à la liste de tâches présentée ci-dessous. La finalisation du tutoriel suppose de réaliser l'intégralité de ces tâches.
Créez un projet Google Cloud et, si vous n'avez pas déployé votre propre service Knative serving, déployez un exemple de service. Consultez la section Avant de commencer.
Créez un cluster GKE avec Knative serving activé.
Déployez un exemple de service Knative serving.
Créez un document OpenAPI décrivant votre API Endpoints, puis configurez les routes vers votre service Knative serving. Consultez la section Configurer Endpoints.
Déployez le document OpenAPI pour créer un service géré. Consultez la section Déployer la configuration Endpoints.
Créez une image ESPv2 pour Docker avec votre configuration de service Endpoints. Consultez la section Créer une nouvelle image ESPv2.
Déployez la nouvelle image ESPv2 Knative serving. Consultez la section Déployer l'image ESPv2 pour Cloud Run.
Créez un mappage de domaine vers le service Knative serving ESPv2.
Testez votre configuration en envoyant une requête à l'API.
Suivez l'activité de vos services. Consultez la section Suivre l'activité de l'API.
Coûts
Dans ce document, vous utilisez les composants facturables suivants de Google Cloud :
Obtenez une estimation des coûts en fonction de votre utilisation prévue à l'aide du simulateur de coût.
Une fois que vous avez terminé les tâches décrites dans ce document, vous pouvez éviter de continuer à payer des frais en supprimant les ressources que vous avez créées. Pour en savoir plus, consultez la section Effectuer un nettoyage.
Avant de commencer
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
- Notez l'ID du projet, car vous en aurez besoin ultérieurement. Sur le reste de cette page, cet ID est appelé ESP_PROJECT_ID.
- Téléchargez et installez le SDK Google Cloud.
- Installez cURL si vous souhaitez envoyer une requête à l'exemple de service déployé.
Configurer la ligne de commande gcloud
Pour configurer la CLI gcloud pour le service Knative pour Anthos :
Assurez-vous que le SDK Google Cloud est autorisé à accéder à vos données et services.
Connectez-vous.
gcloud auth login
Dans le nouvel onglet de navigateur qui s'ouvre, choisissez un compte auquel a été attribué le rôle Éditeur ou Propriétaire dans le projet Google Cloud que vous avez créé pour déployer ESPv2 dans le service Knative.
Mettez à jour les composants
gcloud
installés :gcloud components update
Définissez la plate-forme sur
gke
et définissez le paramètre de projet par défaut pourgcloud
sur celui que vous venez de créer :gcloud config set run/platform gke
gcloud config set project ESP_PROJECT_ID
Remplacez ESP_PROJECT_ID par l'ID du projet que vous avez créé.
Définissez la zone souhaitée pour le nouveau cluster. Vous pouvez utiliser n’importe quelle zone dans laquelle GKE est disponible, par exemple :
gcloud config set compute/zone ZONE
Remplacez ZONE par votre zone. Par exemple, utilisez
us-central1-a
. Vous pouvez utiliser n'importe quelle zone compatible avec GKE.Activez les API suivantes pour le projet, qui sont nécessaires pour créer un cluster, ainsi qu'un conteneur et le publier dans Artifact Registry:
gcloud services enable container.googleapis.com artifactregistry.googleapis.com cloudbuild.googleapis.com
Créer un cluster GKE avec Knative serving activé
Pour créer un cluster et l'activer pour Knative serving sur Google Cloud:
Créez un cluster à l'aide de la commande suivante :
gcloud container clusters create CLUSTER_NAME \ --addons=HttpLoadBalancing,CloudRun \ --machine-type=n1-standard-4 \ --num-nodes=3 \ --enable-stackdriver-kubernetes
Remplacez CLUSTER_NAME par le nom souhaité pour votre cluster.
Bien que ces instructions ne permettent pas à l'autoscaling de cluster de redimensionner les clusters à la demande, Knative serving sur Google Cloud effectue un scaling automatique des instances au sein du cluster.
Patientez pendant la création du cluster. Un résultat semblable aux lignes suivantes doit s'afficher au cours du processus :
Creating cluster CLUSTER_NAME...done. Created [https://container.googleapis.com/v1/projects/ESP_PROJECT_ID/zones/ZONE/clusters/CLUSTER_NAME].
La colonne
NODE_VERSION
du résultat affiche également la version du cluster. Par exemple,1.15.11-gke.1
ou1.14.10-gke.27
. Notez la version du cluster afin de l'utiliser ultérieurement dans ce document.Définissez les valeurs par défaut de
gcloud
pour utiliser votre nouveau cluster et son emplacement, afin d'éviter d'avoir à les spécifier lorsque vous utilisez la gcloud CLI:gcloud config set run/cluster CLUSTER_NAME
gcloud config set run/cluster_location ZONE
Utilisez la commande suivante pour afficher les détails du nouveau cluster :
gcloud container clusters describe CLUSTER_NAME
Utilisez la commande suivante pour récupérer les identifiants de votre cluster :
gcloud container clusters get-credentials CLUSTER_NAME
Déployer un exemple de conteneur de service Knative
Pour déployer l'exemple de conteneur de service Knative "hello" sur le cluster que vous venez de créer :
Cliquez sur Créer un service.
Sélectionnez Knative serving comme plate-forme de développement.
Dans le menu déroulant des clusters disponibles, sélectionnez le cluster que vous venez de créer.
Indiquez hello comme nom du service. Vous pouvez utiliser un autre nom, mais, si vous le faites, veillez à l'utiliser ultérieurement. Dans ces instructions, nous partons du principe que votre service se nomme hello.
Sélectionnez Interne sous Connectivité pour que le service ne soit pas accessible en externe.
Cliquez sur Next (Suivant) pour passer à la deuxième page du formulaire de création de service :
Spécifiez
gcr.io/cloudrun/hello
comme URL de l'image du conteneur.Cliquez sur Créer pour déployer l'image sur Knative serving et attendez la fin du déploiement.
Lorsque vous avez terminé, l'écran Révisions s'affiche. Notez que l'URL du service déployé est :
http://hello.default.svc.cluster.local
Lorsque vous créez un service interne, GKE crée un nom DNS qui ne peut être résolu que pour les requêtes provenant du cluster lui-même, et non pour les requêtes externes. Vous ne pouvez pas accéder à ce lien en externe depuis le cluster. Pour en savoir plus, consultez la page Services Cloud Run.
Pour vérifier que votre service fonctionne correctement à l'aide de cURL, configurez un tunnel entre votre ordinateur et le cluster. Pour afficher ces instructions, cliquez sur l'icône située à droite de l'URL sur l'écran Révisions :
Un panneau comportant les deux commandes permettant d'accéder au service interne s'affiche. Vous devez exécuter ces commandes dans deux fenêtres de terminal distinctes, car la première commande configure le transfert de port utilisé par la deuxième commande.
Lorsque vous exécutez la commande cURL, un résultat semblable au suivant doit s'afficher :
<!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> ...
Configurer Endpoints
Vous devez disposer d'un document OpenAPI basé sur la version 2.0 de la spécification OpenAPI décrivant la surface de votre service de backend, ainsi que les conditions requises pour l'authentification. Vous devez également ajouter un champ spécifique à Google contenant l'URL de chaque service, afin qu'ESPv2 dispose des informations nécessaires pour les appeler. Si vous débutez avec OpenAPI, consultez la page Présentation d'OpenAPI pour en savoir plus.
À propos de la définition du champ hôte des spécifications OpenAPI
Dans le champ host
des spécifications d'OpenAPI, vous devez spécifier le nom du service Endpoints utilisé pour accéder à votre service de diffusion Knative. Le nom du service Endpoints se présente sous la forme d'un nom de domaine :
API_NAME.endpoints.ESP_PROJECT_ID.cloud.goog
Étant donné que le nom du service Endpoints correspond à un nom de domaine, il doit respecter les règles suivantes :
- Il ne doit contenir que des lettres minuscules, des chiffres, des points ou des tirets.
- Il ne doit pas commencer par un tiret.
- Il ne doit pas contenir de trait de soulignement.
Exemple :
hello-api.endpoints.ESP_PROJECT_ID.cloud.goog
Créer les spécifications OpenAPI
Créez un fichier texte intitulé
openapi-run-anthos.yaml
.Votre service backend de diffusion Knative est défini en haut du fichier
openapi-run-anthos.yaml
, dans une définitionx-google-backend
. Exemple :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
La mise en retrait est importante pour le format YAML. Par exemple, le champ
host
doit se trouver au même niveau queinfo
.Dans le champ
host
, spécifiez le nom de domaine de l'API Endpoints utilisée pour accéder à votre service de diffusion Knative, au format suivant :API_NAME.endpoints.ESP_PROJECT_ID.cloud.goog
Exemple :
hello-api.endpoints.ESP_PROJECT_ID.cloud.goog
L'extension
x-google-endpoints
enregistre une entrée DNS pour votre service Endpoints sur le domainecloud.goog
, sous la forme :x-google-endpoints: - name: "API_NAME.endpoints.ESP_PROJECT_ID.cloud.goog" target: "IP_ADDRESS"
IP_ADDRESS est l'adresse IP du service
istio-ingress
pour votre cluster. Pour déterminer cette adresse IP, procédez comme suit :Accédez à la page "Google Kubernetes Engine" dans la console Google Cloud :
Cliquez sur Services et entrées dans le panneau de navigation de gauche pour afficher la liste des services.
Si la version de votre cluster est
1.15.3-gke.19
ou supérieure,1.14.3-gke.12
ou supérieure, ou1.13.10-gke.8
ou supérieure, faites défiler la page jusqu'au serviceistio-ingress
. Pour toutes les autres versions de cluster, faites défiler la page jusqu'au serviceistio-ingressgateway
.Copiez l'adresse IP externe affichée à côté de l'équilibreur de charge, sans le paramètre "port", le cas échéant. Par exemple, si l'adresse IP est
XX.XXX.XX.XXX:15020
, omettez:15020
. Ignorez les autres adresses IP répertoriées.
Dans le champ
address
de la sectionx-google-backend
, spécifiez le nom DNS interne du service de backend Knative serving "hello", puis désactivez l'authentification auprès de ce service. Cela est nécessaire, car l'appel depuis ESPv2 vers le service Knative serving est effectué en tant qu'appel interne à partir du cluster. L'authentification n'est donc pas nécessaire.Notez la valeur de la propriété
title
dans le fichieropenapi-run-anthos.yaml
:title: Cloud Endpoints + Cloud Run
La valeur de la propriété
title
devient le nom du service Endpoints après le déploiement de la configuration.Enregistrez votre document OpenAPI.
Pour en savoir plus sur les champs du document OpenAPI requis par Endpoints, consultez la page Configurer Endpoints.
Déployer la configuration Endpoints
Pour déployer la configuration Endpoints, exécutez la commande gcloud endpoints services deploy. Celle-ci crée un service géré à l'aide de Service Management.
Pour déployer la configuration Endpoints :
Assurez-vous que vous vous trouvez dans le répertoire contenant votre document OpenAPI.
Téléchargez la configuration et créez un service géré.
gcloud endpoints services deploy openapi-run-anthos.yaml \ --project ESP_PROJECT_ID
Vous créez ainsi un service Endpoints avec le nom spécifié dans le champ
host
du fichieropenapi-run-anthos.yaml
. Le service Endpoints est configuré conformément à votre document OpenAPI.Lors de la création et de la configuration du service, Service Management envoie des informations au terminal. Une fois le déploiement terminé, un message semblable au suivant s'affiche :
Service Configuration [CONFIG_ID] uploaded for service [API_NAME.endpoints.ESP_PROJECT_ID.cloud.goog]
CONFIG_ID correspond à l'ID unique de configuration du service Endpoints créé par le déploiement. Exemple :
Service Configuration [2019-02-01r0] uploaded for service [hello-api.endpoints.ESP_PROJECT_ID.cloud.goog]
L'ID de configuration du service se compose d'un horodatage suivi d'un numéro de révision. Si vous déployez à nouveau
openapi-run-anthos.yaml
le même jour, le numéro de révision est incrémenté dans l'ID de configuration de service. Vous pouvez afficher la configuration du service et l'historique de déploiement sur la page Endpoints > Services de la console Google Cloud.Si vous recevez un message d'erreur, consultez la page Résoudre des problèmes de déploiement de la configuration Endpoints.
Vérifier les services requis
Endpoints et ESP requièrent au minimum l'activation des services Google suivants :Nom | Titre |
---|---|
servicemanagement.googleapis.com |
API Service Management |
servicecontrol.googleapis.com |
API Service Control |
endpoints.googleapis.com |
Google Cloud Endpoints |
Dans la plupart des cas, la commande gcloud endpoints services deploy
permet d'activer ces services requis. Toutefois, bien que la commande gcloud
ait abouti, elle n'active pas les services requis dans les cas suivants :
Vous avez utilisé une application tierce telle que Terraform et vous n'incluez pas ces services.
Vous avez déployé la configuration Endpoints dans un projet Google Cloud existant dans lequel ces services étaient explicitement désactivés.
Utilisez la commande suivante pour vérifier que les services nécessaires sont activés :
gcloud services list
Si les services requis ne sont pas répertoriés, activez-les :
gcloud services enable servicemanagement.googleapis.comgcloud services enable servicecontrol.googleapis.com
gcloud services enable endpoints.googleapis.com
Activez également votre service Endpoints :
gcloud services enable ENDPOINTS_SERVICE_NAME
Pour déterminer la valeur de ENDPOINTS_SERVICE_NAME, vous pouvez effectuer l'une des opérations suivantes :
Après avoir déployé la configuration Endpoints, accédez à la page Points de terminaison de la console Cloud. La liste des valeurs ENDPOINTS_SERVICE_NAME possibles s'affiche dans la colonne Nom du service.
Pour OpenAPI, ENDPOINTS_SERVICE_NAME correspond à ce que vous avez spécifié dans le champ
host
de votre spécification OpenAPI. Pour gRPC, ENDPOINTS_SERVICE_NAME correspond à ce que vous avez spécifié dans le champname
de votre configuration Endpoints gRPC.
Pour en savoir plus sur les commandes gcloud
, consultez la page Services gcloud
.
Créer une image ESPv2 Knative serving
Créez la configuration du service Endpoints dans une nouvelle image ESPv2 pour Docker. Après avoir créé cette image, vous pouvez la déployer sur votre cluster.
Pour créer la configuration de service dans une nouvelle image ESPv2 pour Docker, procédez comme suit :
Téléchargez ce script sur la machine locale où la gcloud CLI est installée, puis exécutez-le comme suit :
chmod +x gcloud_build_image
./gcloud_build_image -s API_NAME.endpoints.ESP_PROJECT_ID.cloud.goog \ -c CONFIG_ID -p ESP_PROJECT_ID
Le script utilise la commande
gcloud
pour télécharger la configuration de service, la compiler dans une nouvelle image ESPv2, puis importer la nouvelle image dans le registre de conteneurs de votre projet. Le script utilise automatiquement la dernière version d'ESPv2, désignée par ESP_VERSION dans le nom de l'image de sortie. L'image de sortie est importée dans l'emplacement suivant :gcr.io/ESP_PROJECT_ID/endpoints-runtime-serverless:ESP_VERSION-API_NAME.endpoints.ESP_PROJECT_ID.cloud.goog-CONFIG_ID
Déployer l'image de service Knative ESPv2
Déployez l'image du service ESPv2 Knative serving sur votre cluster:
Déployez le service ESPv2 Knative serving avec la nouvelle image:
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
Pour ESP_PROJECT_ID, indiquez le nom que vous souhaitez utiliser pour le service ESPv2. Dans cet exemple, définissez la valeur de ESP_V2_SERVICE_NAME sur
espv2
.Si vous souhaitez configurer Endpoints afin d'utiliser d'autres options de démarrage d'ESPv2, telles que l'activation de CORS, vous pouvez transmettre les arguments dans la variable d'environnement
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
Pour en savoir plus et obtenir des exemples de définition de la variable d'environnement ESPv2_ARGS, y compris la liste des options disponibles et des informations sur la manière de spécifier plusieurs options, reportez-vous à la page sur les options d'Extensible Service Proxy V2.
Le service ESPv2 est déployé en tant que service externe, ce qui signifie que vous pouvez y accéder à l'aide d'une commande cURL au format suivant :
curl -H "Host: espv2.default.example.com" http://IP_ADDRESS
où IP_ADDRESS est l'adresse IP du service istio-ingress
pour votre cluster.
Pour afficher cette commande cURL, cliquez sur l'icône IMAGE à droite de l'URL ESPv2 sur l'écran Révisions du service de publication Knative ESPv2 déployé.
Vous pouvez désormais effectuer des appels d'API vers votre service Endpoints via le service ESPv2. Par exemple, pour envoyer une requête à un service Endpoints avec un chemin d'accès /hello
, vous pouvez effectuer une requête au format suivant :
curl -H "Host: espv2.default.example.com" http://IP_ADDRESS/hello
Cependant, la spécification d'un en-tête host
sur chaque requête adressée à votre service Endpoints n'est pas conviviale. Dans la section suivante, vous allez configurer un mappage de domaine pour faciliter l'appel du service Endpoint via ESPv2.
Créer un mappage de domaine vers le service ESPv2 Knative serving
Pour pouvoir omettre l'en-tête host
lorsque vous effectuez une requête, ajoutez un mappage de domaine au service ESPv2 :
Sélectionnez Gérer les domaines personnalisés.
Sélectionnez Ajouter un mappage.
Dans la liste déroulante, sélectionnez Ajouter un mappage de domaine pour le service.
Dans le champ Sélectionner un service vers lequel mapper du pop-up Ajouter un mappage, sélectionnez votre service ESPv2.
Dans le champ Saisir un nom de domaine, spécifiez le nom de domaine que vous souhaitez utiliser pour accéder à votre service de diffusion Knative via Endpoints. Par exemple, spécifiez :
API_NAME.endpoints.ESP_PROJECT_ID.cloud.goog
Où API_NAME est le nom de votre API Endpoints. Pour cet exemple, vous pouvez utiliser "hello-api" :
hello-api.endpoints.ESP_PROJECT_ID.cloud.goog
Cliquez sur Continuer. Un résumé du mappage s'affiche.
Sélectionnez OK pour enregistrer le mappage.
Envoyer des requêtes à l'API
Utilisez cURL pour envoyer une requête HTTP à votre API :
curl -X GET "http://hello-api.endpoints.ESP_PROJECT_ID.cloud.goog/hello"
Si vous ne recevez pas de réponse positive, consultez la section Résoudre des problèmes concernant les erreurs de réponse.
Configurer l'API Endpoints pour utiliser HTTPS
La compatibilité avec TLS automatique est désactivée par défaut pour Knative serving sur Google Cloud. Par conséquent, dans cet exemple, lorsque vous accédez à votre API Endpoints via ESPv2, vous effectuez l'appel via HTTP.
Vous pouvez configurer ESPv2 afin d'accepter les requêtes via HTTPS. Notez que vous configurez la compatibilité HTTPS sur ESPv2 (le service externe) et non sur "hello", le service de backend interne.
Pour assurer la compatibilité HTTPS avec ESPv2, vous devez:
être propriétaire d'un domaine. Si vous n'en avez pas, vous pouvez en obtenir un auprès de Cloud Domains ou d'un autre fournisseur de domaine.
créer un mappage de domaine pour votre service ESPv2 et avoir mis à jour votre enregistrement DNS en suivant les instructions de la page sur le mappage de domaines.
Si vous avez obtenu votre domaine auprès de Cloud Domains, utilisez Cloud DNS ou un serveur DNS de votre choix. L'utilisation d'un domaine Cloud Domains est l'option la plus simple.
Dans la spécification OpenAPI d'Endpoints:
définir le champ
host
de sorte qu'il fasse référence à votre domaine plutôt qu'à*.cloud.goog
;supprimer la balise
x-google-endpoints
et ses deux propriétés enfants.
Pour obtenir des instructions complètes et un tutoriel, consultez la page Activer des certificats HTTPS et TLS automatiques.
Suivre l'activité de l'API
Consultez les graphiques d'activité de votre API sur la page Endpoints > Service de la console Google Cloud.
Afficher les graphiques d'activité Endpoints
Il peut s'écouler quelques instants avant que la requête ne soit reflétée dans les graphiques.
Consultez les journaux de requêtes de votre API sur la page de l'explorateur de journaux. Afficher les journaux de requête Endpoints
Créer un portail développeur pour l'API
Vous pouvez utiliser le portail Cloud Endpoints pour créer un portail des développeurs, c'est-à-dire un site Web qui vous permet d'interagir avec l'exemple d'API. Pour en savoir plus, consultez la page Présentation du portail Cloud Endpoints.
Effectuer un nettoyage
Pour éviter que les ressources utilisées sur cette page soient facturées sur votre compte Google Cloud, procédez comme suit :
Pour plus d'informations sur l'arrêt des services utilisés par ce tutoriel, consultez la page Supprimer une API et des instances d'API.