Comment installer un déploiement hybride APIM en utilisant les Helm charts de Kubernetes

Par :
David Brassely

mer, 20/01/2021 - 11:26

Cet article décrit comment installer un déploiement hybride APIM en utilisant les Helm charts de Kubernetes.

Une connaissance de la plateforme Google Cloud (GCP), de Kubernetes (K8s) et de Helm sont requises.

Architecture cible

Dans cet exemple, nous allons démontrer comment déployer APIM dans deux régions GCP  avec deux clusters K8 différents :

  • Un Management cluster (image de gauche) - composé de la Management API, des deux composants de l'interface utilisateur et une gateway «pont» (bridge Gateway)
  • Un Gateway cluster (image de droite) - composé de la gateway APIM

Dans ce schéma, nous pouvons constater que :

  • MongoDB est utilisé pour toutes les données de gestion (définitions API, souscriptions, clés API, etc.)
  • ElasticSearch est également déployé dans le Management Cluster
  • Redis est utilisé pour gérer le rate-limiting et les quotas au sein du Gateway cluster

Avant de continuer, gardez à l'esprit que la bridge Gateway (la case rouge dans la partie gauche du schéma) est simplement une instance de la gateway APIM avec des capacités supplémentaires. Ceci est essentiel pour comprendre comment nous déployons le pont.

Déployer avec Helm

Vous trouverez tous les éléments pour déployer cette architecture hybride à l'URL : Gravitee.io Helm Charts.

Avant de commencer

Avant de déployer APIM, assurez-vous que les deux clusters GCP existent et que Helm est installé sur les deux clusters :

Les exemples suivants utilisent les noms de l'image ci-dessus, mais vous pouvez nommer vos clusters comme vous voulez et remplacer les noms par les vôtres.

Déployer le Management cluster

1. La première étape consiste à initialiser le cluster avec quelques conditions préalables:

> gcloud container clusters get-credentials hybrid-mgmt-eu --zone=europe-west1-b

// Create namespace
> kubectl create namespace graviteeio
// Nginx ingress controller is required for Gravitee APIM chart
> helm install --name nginx-ingress --namespace graviteeio stable/nginx-ingress --set rbac.create=true --set controller.publishService.enabled=true

// Add Gravitee.io Helm repository

> helm repo add graviteeio https: //helm.gravitee.io

2. Déployer l'instance management APIM, qui comprend les composants APIM Console, APIM Portal, API APIM et le bridge Gateway (qui sera utilisé comme un pont entre les deux clusters) :

> helm install — name graviteeio-apim3 — namespace graviteeio \
-f values-bridge-http-server.yaml \
-f values-hybrid-management-eu.yaml \
graviteeio/apim3

Le fichier values-hybrid-management-eu.yaml ressemble à ceci :

mongo:
    uri: mongodb+srv://xxxxxx:xxxxx@demo.xxxxx.gcp.mongodb.net/gio-apim-hybrid?retryWrites=true&w=majority

es:
    endpoints:
       - https: //xxxxxxxxx-elasticsearch.services.elasticcloud.com/
    index: demo_hybrid_apim
    security:
        enabled: true
        username: xxxxxx
        password: xxxxxx

api:
    ingress:
        management:
            path: /management
            hosts:
                - demo-hybrid-apim-api.cloud.gravitee.io
            tls:
            -   hosts:
                    - demo-hybrid-apim-api.cloud.gravitee.io
                secretName: cloud-gravitee-cert
        portal:
            path: /portal
            hosts:
                - demo-hybrid-apim-api.cloud.gravitee.io

            tls:
            -   hosts:
                    - demo-hybrid-apim-api.cloud.gravitee.io
                secretName: cloud-gravitee-cert

gateway:
    ingress:
        enabled: false
    services:
        bridge:
            enabled: true
            username: xxxxxxxxx
            password: xxxxxxxxx
            service:
                externalPort: 92
                internalPort: 18092
            ingress:
                enabled: true
                path: /
                hosts:
                    - demo-hybrid-apim-bridge.cloud.gravitee.io
                annotations:
                    kubernetes.io/ingress.class: nginx
                    nginx.ingress.kubernetes.io/ssl-redirect: "false"
                    nginx.ingress.kubernetes.io/enable-rewrite-log: "true"
                    nginx.ingress.kubernetes.io/configuration-snippet: "etag on;\nproxy_pass_header ETag;\nproxy_set_header if-match \"\";\n"
                tls:
                -   secretName: cloud-gravitee-cert
                    hosts:
                        - demo-hybrid-apim-bridge.cloud.gravitee.io

ui:
    ingress:
        path: /
        hosts:
            - demo-hybrid-apim-console.cloud.gravitee.io
        annotations:
            nginx.ingress.kubernetes.io/rewrite-target: /
        tls:
        -   hosts:
                - demo-hybrid-apim-console.cloud.gravitee.io
            secretName: cloud-gravitee-cert

portal:
    ingress:
        path: /
        hosts:
            - demo-hybrid-apim-portal.cloud.gravitee.io
        tls:
        -   hosts:
                - demo-hybrid-apim-portal.cloud.gravitee.io
            secretName: cloud-gravitee-cert

Nous pouvons constater dans le fichier que  :

  • Le bridge Gateway n'est pas exposée à travers le ingress controller (il n'accepte pas les appels API pour la bridge Gateway)
  • nous avons activé le service pour la bridge Gateway et déclaré un nouvel Ingress afin de l'exposer aux clusters distants

Déployer le Gateway cluster

  1. Encore une fois, nous devons initialiser le cluster avec certaines conditions préalables :

> gcloud container clusters get-credentials hybrid-gw-eu --zone=europe-west2-b
// Create namespace
> kubectl create namespace graviteeio
// Nginx ingress controller is required for Gravitee APIM chart
> helm install --name nginx-ingress --namespace graviteeio stable/nginx-ingress --set rbac.create=true --set controller.publishService.enabled=true
// Add Gravitee.io Helm repository
> helm repo add graviteeio https: //helm.gravitee.io

2. Maintenant, nous déployons APIM, mais seulement le composant APIM Gateway:

> helm install — name graviteeio-apim3 — namespace graviteeio \
-f values-bridge-http-client.yaml \
-f values-hybrid-gw-eu.yaml \
graviteeio/apim3

Le fichier  values-hybrid-management-gw-eu.yaml ressemble à ceci:

mongo:
    uri: mongodb+srv://xxxxxx:xxxxx@demo.xxxxx.gcp.mongodb.net/gio-apim-hybrid?retryWrites=true&w=majority

es:
    endpoints:
        - https: //xxxxxxxxx-elasticsearch.services.elasticcloud.com/
    index: demo_hybrid_apim
    security:
        enabled: true
        username: xxxxxx
        password: xxxxxx
management:
    type: http
api:
    enabled: false
gateway:
    management:
        http:
            version: 3.3.1
            url: https: //demo-hybrid-apim-bridge.cloud.gravitee.io/
            username: xxxxxxxxx
            password: xxxxxxxxx
    ingress:
        path: /
        hosts:
            - demo-hybrid-apim-gw.cloud.gravitee.io
        tls:
        -   hosts:
                - demo-hybrid-apim-gw.cloud.gravitee.io
            secretName: cloud-gravitee-cert
ui:
    enabled: false
portal:
    enabled: false

Nous pouvons constater dans le fichier que :

  • Tous les composants de type Management ont été désactivés pour empêcher leur déploiement — APIM API, APIM Console et APIM Portal
  • Nous avons activé le http pour la Gateway, une connexion qui sert à monter toutes les informations requises dans la Gateway afin de traiter les appels API.

Si on regarde les logs du pod Gateway, on voit quelque chose qui ressemble à cela :

08:27:29.394 [graviteeio-node] [] INFO  i.g.g.r.p.RepositoryPluginHandler - Register a new repository plugin: repository-bridge-http-client [io.gravitee.repository.bridge.client.HttpBridgeRepository]
08:27:29.402 [graviteeio-node] [] INFO  i.g.g.r.p.RepositoryPluginHandler - Repository [MANAGEMENT] loaded by http
08:27:30.999 [graviteeio-node] [] INFO  i.g.r.b.client.http.WebClientFactory - Validate Bridge Server connection ...
08:27:32.888 [vert.x-eventloop-thread-1] [] INFO  i.g.r.b.client.http.WebClientFactory - Bridge Server connection successful.

Nous pouvons maintenant ouvrir la APIM Console et voir nos deux Gateways fonctionner:

Succès ! Votre déploiement hybride est maintenant opérationnel et prêt à gérer votre première API.

A propos de l'auteur

David Brassely
Co-Fondateur et CTO de l'éditeur open source Gravitee.io