Ejemplo de Apigee Hybrid con Kubernetes

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 Apigee Adapter for Envoy con una implementación híbrida de Apigee.

Requisitos previos

Antes de comenzar:

Descripción general

En este ejemplo, se explica cómo usar Apigee Adapter for Envoy con Apigee Hybrid. En este ejemplo, implementarás un Service HTTP simple en el mismo clúster de Kubernetes en el que se implementa Apigee Hybrid. Luego, configurarás Apigee Adapter for Envoy a fin de administrar las llamadas a la API para este servicio con Apigee.

En la siguiente figura, se muestra la arquitectura básica de la integración híbrida de Apigee:

Una vista de alto nivel del adaptador de Envoy integrado en un entorno híbrido de Apigee, que incluye el plano de administración, el plano del entorno de ejecución y los servicios de Google Cloud

Un proxy de Envoy se implementa con el servicio HTTP de destino como un archivo adicional de Istio en la malla de servicios de Istio. El archivo adicional maneja el tráfico de la API 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 administración híbrido para recuperar la información del proxy y los productos de la API.

Verifica tu configuración de gcloud

  1. Verifica que tu configuración de gcloud esté establecida en el proyecto de Google Cloud asociado a tu organización híbrida.

    Para mostrar una lista de la configuración actual, haz lo siguiente:

    gcloud config list

    Si es necesario, configura el ID del proyecto de Google Cloud correcto con este comando:

    gcloud config set project project-id
  2. Debes estar autenticado con el SDK de Google Cloud (gcloud) para tu proyecto de Google Cloud:
    gcloud auth login

Aprovisiona a Apigee Hybrid

En este paso, usarás la CLI del servicio remoto para aprovisionar de forma 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 con Apigee.

  1. Ve al directorio $CLI_HOME:
    cd $CLI_HOME
  2. Si no eres propietario del proyecto de Google Cloud asociado con la organización híbrida de Apigee, asegúrate de que tu cuenta de usuario de Google Cloud incluya la función de Administrador de la organización de Apigee o las funciones Creador de API e Implementador.

    Consulta Otorga, cambia y revoca el acceso a recursos.

  3. Ejecuta este comando para obtener un token de acceso:
    TOKEN=$(gcloud auth print-access-token);echo $TOKEN
  4. De forma predeterminada, el adaptador busca las credenciales predeterminadas de la cuenta de servicio en tu proyecto de Google Cloud para enviar permisos de estadísticas a Apigee (opcional). Si no deseas usar las credenciales de la cuenta de servicio predeterminadas, puedes crear una cuenta de servicio y hacer referencia a su clave en el comando de aprovisionamiento. La cuenta de servicio del controlador debe tener la función apigee.analyticsAgent. Para obtener instrucciones, consulta Crea y administra cuentas de servicio.
  5. Crea las siguientes variables de entorno: Estas variables se usarán como parámetros en la secuencia de comandos de aprovisionamiento:
    export ORG=organization_name
    export ENV=environment_name
    export RUNTIME=host_alias_url
    export NAMESPACE=hybrid_runtime_namespace
    export AX_SERVICE_ACCOUNT=analytics_service_account  ## Optional

    Aquí:

    Variable Descripción
    organization_name El nombre de la organización de Apigee para tu instalación de Apigee Hybird
    environment_name El nombre de un entorno en tu organización de Apigee Hybird
    host_alias_url Una URL que incluye hostAlias para un host virtual definido en tu configuración híbrida. La URL debe comenzar con https://. Por ejemplo: https://apitest.apigee-hybrid-docs.net
    hybrid_runtime_namepace El espacio de nombres en el que se implementan los componentes del entorno de ejecución híbrido. Nota: El espacio de nombres predeterminado para una implementación híbrida es apigee.
    analytics_service_account La ruta a un archivo JSON de clave de cuenta de servicio de Google Cloud que tiene la función Apigee Analytics Agent. Para obtener una descripción detallada de este parámetro, consulta Comando de aprovisionamiento.
  6. Ejecuta el siguiente comando para aprovisionar el proxy de servicio remoto en Apigee Hybrid:

    Si no realizas la actualización, usa este comando para aprovisionar a Apigee:

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

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

    ./apigee-remote-service-cli provision --force-proxy-install --organization $ORG --environment $ENV \
         --runtime $RUNTIME --namespace $NAMESPACE --analytics-sa $AX_SERVICE_ACCOUNT --token $TOKEN > config.yaml
  7. Verifica el contenido del archivo config.yaml. Debería verse algo similar a esto:
    # Configuration for apigee-remote-service-envoy (platform: Google Cloud)
    # generated by apigee-remote-service-cli provision on 2020-11-20 02:49:28
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: apigee-remote-service-envoy
      namespace: apigee
    data:
      config.yaml: |
        tenant:
          remote_service_api: https://apitest.example.com/remote-service
          org_name: hybrid-gke
          env_name: test
        analytics:
          collection_interval: 10s
        auth:
          jwt_provider_key: https://apitest.example.com/remote-token/token
    ---
    apiVersion: v1
    kind: Secret
    metadata:
      name: hybrid-gke-new-test-policy-secret
      namespace: apigee
    type: Opaque
    data:
      remote-service.crt: eyJrZXlzIjpbeyJrdHkiOiJSU0EiLCJhbGci...
      remote-service.key: LS0tLS1CRUdJTiBSU0EgUFJJVkFURS...
      remote-service.properties: a2lkPTIwMjAtMDctMDZ...
    ---
    apiVersion: v1
    kind: Secret
    metadata:
      name: hybrid-gke-new-test-analytics-secret
      namespace: apigee
    type: Opaque
    data:
      client_secret.json: ewogICJ0eXBlIjogInNlcnZ...
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: apigee-remote-service-envoy
      namespace: apigee
  8. Aplica la configuración del servicio (el archivo que genera el comando de aprovisionamiento) en el clúster:
    kubectl apply -f $CLI_HOME/config.yaml
  9. Verifica tu proxy y tu certificado. El siguiente código debería mostrar un JSON válido:
    curl -i $RUNTIME/remote-token/certs

    El resultado debería ser similar a este:

    {
        "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"
            }
        ]
    }

Crea archivos de configuración de muestra

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

Para este ejemplo, necesitas los archivos siguientes:

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

Para generar las muestras, sigue estos pasos:

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

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

    Los siguientes archivos se muestran 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 Comando de muestra.

Implementa un servicio de prueba en el clúster

En este paso, implementarás un servicio simple de prueba de solicitud/respuesta HTTP en el mismo clúster en el que se implementa Apigee hybrid.

  1. Habilita la inyección de Istio en el espacio de nombres default del clúster. En un paso posterior, implementarás un archivo adicional de Envoy en este mismo clúster. Habilitar la inyección de Istio hace posible la implementación del archivo adicional. En este ejemplo, se usa el espacio de nombres default, y todas las instrucciones posteriores suponen que este es el caso.

    Si usas Istio de código abierto:

    kubectl label namespace default istio-injection=enabled --overwrite

    Si usas ASM:

    kubectl label namespace default istio-injection=enabled istio.io/rev=REVISION --overwrite
  2. Aplica el servicio httpbin simple en el clúster del 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. Para probar el servicio, llámalo desde dentro del clúster:
    curl -i httpbin.default.svc.cluster.local/headers

    Si la operación se realiza correctamente, verás un estado de 200 y el servicio mostrará 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"
      }
    }

Ejecuta el Service remoto para Envoy

En este paso, iniciarás el servicio remoto del cliente de Envoy. Este servicio proporciona los extremos a los archivos adicionales de Istio que se instalan en los servicios de destino. También instalarás un archivo adicional con el servicio httpbin.

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

Prueba la instalación

  1. Ahora, regresa a la shell de curl que abrió en el paso Implementa un servicio de prueba en el clúster y llama al servicio httpbin:
    curl -i httpbin.default.svc.cluster.local/headers
    

    Ahora, el servicio es administrado por Apigee y, como no proporcionaste una clave de API, el servidor muestra 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 como se explica en Obtén una clave de API.
  3. Realiza 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 ser exitosa y tener un estado 200; además, se debe mostrar 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"
      }
    }

Próximos pasos

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

  • Accede a Apigee Analytics en la IU de Edge. Ve a Analizar > Métricas de la API > Rendimiento del proxy de API.
  • Usa la CLI para administrar las vinculaciones, crearles tokens y controlarlas. Para obtener más información sobre la CLI, consulta la Referencia.

Desinstala Apigee Adapter for Envoy

Para quitar una instalación del adaptador de Envoy de Apigee, haz lo siguiente:

  1. Siempre que elijas ejecutar el adaptador de Envoy (de forma nativa o en Docker), quítalo.
  2. Borra los proxies remote-service y remote-token de tus entornos de Apigee. Consulta Borra un proxy de API.
  3. Quita los productos de API sin usar o las operaciones que usan los casos de uso del adaptador de Envoy. Consulta Borra un producto de API.

Además, puedes ejecutar los siguientes comandos:

kubectl delete -f $CLI_HOME/samples/envoyfilter-sidecar.yaml
  kubectl delete -f $CLI_HOME/samples/apigee-envoy-adapter.yaml
  kubectl delete -f $CLI_HOME/samples/httpbin.yaml
  kubectl delete -f $CLI_HOME/config.yaml