Usar Apigee Adapter for Envoy con Apigee hybrid

Esta página se aplica a Apigee y Apigee Hybrid.

Consulta la documentación de Apigee Edge.

En este ejemplo se muestra cómo usar el adaptador de Apigee para Envoy con una implementación híbrida de Apigee.

Requisitos previos

Antes de empezar:
.

Información general

En este ejemplo se explica cómo usar el adaptador de Apigee para Envoy con Apigee Hybrid. En este ejemplo, desplegarás un servicio HTTP sencillo en el mismo clúster de Kubernetes en el que se ha desplegado Apigee hybrid. A continuación, configurarás Apigee Adapter for Envoy para gestionar las llamadas a la API de este servicio con Apigee.

En la siguiente figura se muestra la arquitectura básica de la integración de Apigee Hybrid:

Vista general del adaptador de Envoy integrado en un entorno de Apigee Hybrid, incluidos el plano de gestión, el plano de entorno de ejecución y los servicios de GCP

Se implementa un proxy de Envoy con el servicio HTTP de destino como sidecar de Istio en la malla de servicios de Istio. El sidecar gestiona el tráfico de APIs hacia y desde el servicio de destino, y se comunica con el servicio remoto. El servicio remoto también se comunica con el plano de gestión híbrido para obtener información sobre los productos y proxies de la API.

Comprobar la configuración de gcloud

  1. Comprueba que la configuración de gcloud esté definida en el proyecto de GCP asociado a tu organización híbrida.

    Para ver la lista de ajustes actuales, sigue estos pasos:

    gcloud config list

    Si es necesario, define el ID de proyecto de GCP correcto con este comando:

    gcloud config set project project-id
  2. Debes autenticarte con el SDK de Google Cloud (gcloud) en tu proyecto de GCP:
    gcloud auth login

Aprovisionar Apigee Hybrid

En este paso, usarás la CLI de servicio remoto para aprovisionar la configuración híbrida con el proxy de API remote-service. El comando de aprovisionamiento también configura un certificado en Apigee y genera credenciales que el servicio remoto usará para conectarse de forma segura a Apigee.

  1. Ve al directorio $CLI_HOME:
    cd $CLI_HOME
  2. Si no eres propietario del proyecto de GCP asociado a la organización de Apigee hybrid, asegúrate de que tu cuenta de usuario de GCP incluya el rol Apigee Organization Admin. Consulta cómo conceder, cambiar y revocar el acceso a los recursos.
  3. Ejecuta este comando para obtener un token de acceso:
    TOKEN=$(gcloud auth print-access-token);echo $TOKEN
  4. Crea las siguientes variables de entorno. Estas variables se usarán como parámetros de la secuencia de comandos de aprovisionamiento:
    export ORG=organization_name
    export ENV=environment_name
    export RUNTIME=host_alias_url
    export NAMESPACE=hybrid_runtime_namespace

    Donde:

    Variable Descripción
    organization_name El nombre de la organización de Apigee de tu instalación de Apigee Hybrid.
    environment_name El nombre de un entorno de tu organización de Apigee Hybrid.
    host_alias_url Una URL que incluya el hostAlias de un host virtual definido en tu configuración híbrida. La URL debe empezar por https://. Por ejemplo: https://apitest.apigee-hybrid-docs.net
    hybrid_runtime_namepace Espacio de nombres en el que se despliegan los componentes del entorno de ejecución híbrido. Nota: El espacio de nombres predeterminado de una implementación híbrida es apigee.
  5. Ejecuta el siguiente comando para aprovisionar el proxy de servicio remoto en Apigee hybrid:

    Si no vas a actualizar, usa este comando para aprovisionar Apigee:

    ./apigee-remote-service-cli provision --organization $ORG --environment $ENV \
         --runtime $RUNTIME --namespace $NAMESPACE --token $TOKEN > config.yaml

    Si vas a actualizar, usa este comando con la marca --force-proxy-install para aprovisionar Apigee:

    ./apigee-remote-service-cli provision --force-proxy-install --organization $ORG --environment $ENV \
         --runtime $RUNTIME --namespace $NAMESPACE --token $TOKEN > config.yaml
  6. Comprueba el contenido del archivo config.yaml. Debería tener un aspecto similar a este:
    # Configuration for apigee-remote-service-envoy
    # generated by apigee-remote-service-cli provision on 2020-07-06 18:03:58
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: apigee-remote-service-envoy
      namespace: apigee
    data:
      config.yaml: |
        tenant:
          remote_service_api: https://apitest.apigee-hybrid-docs.net/remote-service
          org_name: hybrid-docs
          env_name: envoy
          allow_unverified_ssl_cert: true
        analytics:
          collection_interval: 10s
          fluentd_endpoint: apigee-udca-hybrid-docs-envoy.apigee:20001
          tls:
            ca_file: /opt/apigee/tls/ca.crt
            key_file: /opt/apigee/tls/tls.key
            cert_file: /opt/apigee/tls/tls.crt
    ---
    apiVersion: v1
    kind: Secret
    metadata:
      name: hybrid-docs-envoy-policy-secret
      namespace: apigee
    type: Opaque
    data:
      remote-service.crt: eyJrZXlzIjpbeyJrdHkiOiJSU0EiLCJhbGci...
      remote-service.key: LS0tLS1CRUdJTiBSU0EgUFJJVkFURS...
      remote-service.properties: a2lkPTIwMjAtMDctMDZ...
  7. Aplica la configuración del servicio (el archivo que genera el comando de aprovisionamiento) al clúster:
    kubectl apply -f $CLI_HOME/config.yaml
  8. Verifica tu proxy y tu certificado. Lo siguiente debería devolver un JSON válido:
    curl -i $RUNTIME/remote-service/certs

    La salida tiene un aspecto similar al siguiente:

    {
        "keys": [
            {
                "alg": "RS256",
                "e": "AQAB",
                "kid": "2020-05-11T11:32:26-06:00",
                "kty": "RSA",
                "n": "0v-nbTQyAmtVZ-wZRP0ZPIbrVaX91YO9JZ9xCQPb4mOdOSS7yKfTDJGg0KM130sGVYBvR76alN8
                fhrrSDEG5VXG8YYMqPXarwRC7MRJWocCQ_ECYrjDD0_Q018M2HyXZYSd8fhAogi9mVUYsEmCKqJH53Dh1
                jqsHOQzBLKsX0iDO9hEZNFtjbX0UCbSxsUlmBCub7Uj2S-PahA6DEQOMhQjZM7bBMtkTMpFmaJ_RZTmow
                BHP57qMna17R8wHD4kUsO2u_-3HHs5PSj1NrEYoVU2dwLQw0GlkB__ZWeFgXTqot81vb-PmoM9YxwoZrm
                TcHdljugWy_s7xROPzTod0uw"
            }
        ]
    }

Crear archivos de configuración de ejemplo

Usa el comando apigee-remote-service-cli samples create para generar archivos de configuración de ejemplo.

Para este ejemplo, necesitas estos archivos generados:

  • httpbin.yaml: configuración de la implementación de un servicio HTTP.
  • apigee-envoy-adapter.yaml: configuración de la implementación del servicio remoto de Envoy.
  • envoyfilter-sidecar.yaml: una configuración que instala un EnvoyFilter. al espacio de nombres predeterminado.

Para generar las muestras, sigue estos pasos:

  1. Ve al directorio $CLI_HOME.
  2. Ejecuta este comando para generar los archivos:

    ./apigee-remote-service-cli samples create -c ./config.yaml
    .

    Los siguientes archivos se generan en el directorio ./samples:

    ls samples
    apigee-envoy-adapter.yaml envoyfilter-sidecar.yaml httpbin.yaml request-authentication.yaml
    

Para obtener más información, consulta el comando Samples.

Desplegar un servicio de prueba en el clúster

En este paso, desplegarás un servicio de prueba de solicitud/respuesta HTTP sencillo en el mismo clúster en el que se ha desplegado Apigee hybrid.

  1. Habilita la inyección de Istio en el espacio de nombres default del clúster. En un paso posterior, desplegarás un sidecar de Envoy en este mismo clúster. Habilitar la inyección de Istio permite desplegar el sidecar. En este ejemplo se usa el espacio de nombres default y se da por hecho que es así en todas las instrucciones posteriores.
    kubectl label namespace default istio-injection=enabled
  2. Aplica el servicio httpbin al clúster en el espacio de nombres predeterminado:
    kubectl apply -f $CLI_HOME/samples/httpbin.yaml
  3. Ahora, prueba el servicio. Inicia un servicio curl que se ejecute en el clúster y abre una terminal:
    kubectl run -it curl --image=curlimages/curl --restart=Never -- sh
  4. Prueba el servicio llamándolo desde el interior del clúster:
    curl -i httpbin.default.svc.cluster.local/headers

    Si la operación se realiza correctamente, verás el estado 200 y el servicio devolverá una lista de encabezados. Por ejemplo:

    HTTP/1.1 200 OK
    server: envoy
    date: Tue, 12 May 2020 17:09:01 GMT
    content-type: application/json
    content-length: 328
    access-control-allow-origin: *
    access-control-allow-credentials: true
    x-envoy-upstream-service-time: 7
    
    {
      "headers": {
        "Accept": "*/*",
        "Content-Length": "0",
        "Host": "httpbin.default.svc.cluster.local",
        "User-Agent": "curl/7.70.0-DEV",
        "X-B3-Parentspanid": "69f88bc3e322e157",
        "X-B3-Sampled": "0",
        "X-B3-Spanid": "8dd725f30e393d8b",
        "X-B3-Traceid": "38093cd817ad30a569f88bc3e322e157"
      }
    }

Ejecutar el servicio remoto de Envoy

En este paso, inicia el servicio remoto para el cliente de Envoy en la malla de servicios donde está instalado Apigee Hybrid. Este servicio proporciona los endpoints a los sidecars de Istio que están instalados en los servicios de destino. También instalarás un sidecar con el servicio httpbin.

  1. Aplica el servicio remoto de Apigee a la malla de servicios:
    kubectl apply -f $CLI_HOME/samples/apigee-envoy-adapter.yaml
  2. Aplica EnvoyFilter a los sidecars de Istio del espacio de nombres predeterminado. El EnvoyFilter permite que el sidecar httpbin se comunique con el servicio remoto de Apigee.
    kubectl apply -f $CLI_HOME/samples/envoyfilter-sidecar.yaml

Probar la instalación

  1. Ahora, vuelve al shell de curl que has abierto en el paso Despliega un servicio de prueba en el clúster y llama al servicio httpbin:
    curl -i httpbin.default.svc.cluster.local/headers
    

    Ahora, Apigee gestiona el servicio y, como no has proporcionado una clave de API, devuelve el siguiente error.

    curl -i httpbin.default.svc.cluster.local/headers
    HTTP/1.1 403 Forbidden
    date: Tue, 12 May 2020 17:51:36 GMT
    server: envoy
    content-length: 0
    x-envoy-upstream-service-time: 11
  2. Configura un producto de API y obtén una clave de API, tal como se explica en el artículo Cómo obtener una clave de API.
  3. Haz una llamada a la API con la clave:
    export APIKEY=YOUR_API_KEY
    curl -i httpbin.default.svc.cluster.local/headers -H "x-api-key: $APIKEY"

    La llamada debería realizarse correctamente con el estado 200 y devolver una lista de encabezados en la respuesta. Por ejemplo:

    curl -i httpbin.default.svc.cluster.local/headers -H "x-api-key: kyOTalNNLMPfOSy6rnVeclmVSL6pA2zS"
    HTTP/1.1 200 OK
    server: envoy
    date: Tue, 12 May 2020 17:55:34 GMT
    content-type: application/json
    content-length: 828
    access-control-allow-origin: *
    access-control-allow-credentials: true
    x-envoy-upstream-service-time: 301
    
    {
      "headers": {
        "Accept": "*/*",
        "Content-Length": "0",
        "Host": "httpbin.default.svc.cluster.local",
        "User-Agent": "curl/7.70.0-DEV",
        "X-Api-Key": "kyOTalNNLMPfOSy6rnVeclmVSL6pA2zS",
        "X-Apigee-Accesstoken": "",
        "X-Apigee-Api": "httpbin.default.svc.cluster.local",
        "X-Apigee-Apiproducts": "httpbin",
        "X-Apigee-Application": "httpbin",
        "X-Apigee-Authorized": "true",
        "X-Apigee-Clientid": "kyOTalNNLMPfOSy6rnVeclmVSL6pA2zS",
        "X-Apigee-Developeremail": "jdoe@example.com",
        "X-Apigee-Environment": "envoy",
        "X-Apigee-Organization": "acme-org",
        "X-Apigee-Scope": "",
        "X-B3-Parentspanid": "1476f9a2329bbdfa",
        "X-B3-Sampled": "0",
        "X-B3-Spanid": "1ad5c19bfb4bc96f",
        "X-B3-Traceid": "6f329a34e8ca07811476f9a2329bbdfa"
      }
    }

Pasos siguientes

Apigee gestiona el tráfico de la API al servicio httpbin. Estas son algunas de las funciones que puedes explorar y probar:

  • Si has configurado tu producto de API tal como se explica en Cómo obtener una clave de API, el límite de cuota se habrá establecido en 5 solicitudes por minuto. Prueba a llamar al servicio httpbin unas cuantas veces más para activar la cuota. Cuando se agota la cuota, se devuelve un error de estado HTTP 403.
  • Accede a Apigee Analytics en la interfaz de usuario de Apigee. Ve a Analizar > Métricas de la API > Rendimiento del proxy de la API.
  • Genera y usa tokens JWT para autenticar llamadas a la API.
  • Usa la CLI para gestionar y crear tokens, así como para controlar las vinculaciones. Para obtener más información sobre la CLI, consulta la referencia.