Utilizzo di Apigee Adapter per Envoy con Apigee hybrid

Questa pagina si applica a Apigee e Apigee ibrido.

Visualizza la documentazione di Apigee Edge.

Questo esempio mostra come utilizzare Apigee Adapter for Envoy con un deployment ibrido Apigee.

Prerequisiti

Prima di iniziare:

Panoramica

Questo esempio spiega come utilizzare Apigee Adapter for Envoy con Apigee hybrid. In questo esempio, eseguirai il deployment di un semplice servizio HTTP nello stesso cluster Kubernetes in cui è stato eseguito il deployment di Apigee hybrid. Quindi, configurerai Apigee Adapter for Envoy per gestire le chiamate API a questo servizio con Apigee.

La figura seguente mostra l'architettura di base per l'integrazione ibrida di Apigee:

Una visione d'insieme di Envoy Adapter integrato in un ambiente ibrido Apigee, che include piano di gestione, piano di runtime e servizi Google Cloud

Viene eseguito il deployment di un proxy Envoy con il servizio HTTP di destinazione come sidecar Istio nel mesh di servizi Istio. Il file collaterale gestisce il traffico API da e verso il servizio di destinazione e comunica con il servizio remoto. Il servizio remoto comunica inoltre con il piano di gestione ibrido per recuperare le informazioni sul prodotto API e sul proxy.

Controlla la configurazione di gcloud

  1. Controlla che la configurazione di gcloud sia impostata sul progetto Google Cloud associato alla tua organizzazione ibrida.

    Per elencare le impostazioni attuali:

    gcloud config list

    Se necessario, imposta l'ID progetto Google Cloud corretto con questo comando:

    gcloud config set project project-id
  2. Devi eseguire l'autenticazione con Google Cloud SDK (gcloud) per il tuo progetto Google Cloud:
    gcloud auth login

esegui il deployment di un servizio di test nel cluster

In questo passaggio, eseguirai il deployment di un semplice servizio di test di richiesta/risposta HTTP nello stesso cluster in cui è stato eseguito il deployment di Apigee hybrid.

  1. Vai alla directory del servizio remoto:
    cd $REMOTE_SERVICE_HOME
  2. Abilita l'inserimento di Istio nello spazio dei nomi default del cluster. In un passaggio successivo, eseguirai il deployment di un sidecar Envoy in questo stesso cluster. L'abilitazione dell'iniezione di Istio rende possibile il deployment del sidecar. Questo esempio utilizza lo spazio dei nomi default e tutte le istruzioni successive presuppongono che sia questo il caso.
    kubectl label namespace default istio-injection=enabled
  3. Applica il servizio httpbin semplice al cluster nello spazio dei nomi predefinito:
    kubectl apply -f samples/istio/httpbin.yaml
  4. Ora prova il servizio. Avvia un servizio curl in esecuzione nel cluster e apri un terminale:
    kubectl run -it curl --image=curlimages/curl --restart=Never -- sh
  5. Testa il servizio chiamandolo dall'interno del cluster:
    curl -i httpbin.default.svc.cluster.local/headers

    Se l'operazione riesce, verrà visualizzato lo stato 200 e il servizio restituirà un elenco di intestazioni. Ad esempio:

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

Esegui il provisioning di Apigee hybrid

In questo passaggio utilizzerai Remote Service CLI per eseguire il provisioning di un ibrido con il proxy API remote-service. Il comando di provisioning configura anche un certificato su Apigee e genera le credenziali che il servizio remoto utilizzerà per connettersi in modo sicuro ad Apigee.

  1. Vai alla directory $CLI_HOME:
    cd $CLI_HOME
  2. Se non sei un proprietario del progetto della piattaforma Google Cloud associato all'organizzazione ibrida Apigee, assicurati che il tuo account utente Google Cloud includa il ruolo Apigee Organization Admin. Consulta Concessione, modifica e revoca dell'accesso alle risorse.
  3. Esegui questo comando per ottenere un token di accesso:
    TOKEN=$(gcloud auth print-access-token);echo $TOKEN
  4. Crea le seguenti variabili di ambiente. Queste variabili verranno utilizzate come parametri per lo script di provisioning:
    export ORG=organization_name
    export ENV=environment_name
    export RUNTIME=host_alias_url
    export NAMESPACE=hybrid_runtime_namespace

    Dove:

    Variabile Descrizione
    organization_name Il nome dell'organizzazione Apigee per l'installazione ibrida di Apigee.
    environment_name Il nome di un ambiente nella tua organizzazione Apigee ibrida.
    host_alias_url Un URL che include hostAlias per un host virtuale definito nella configurazione ibrida. L'URL deve iniziare con https://. Ad esempio: https://apitest.apigee-hybrid-docs.net
    hybrid_runtime_namepace Lo spazio dei nomi in cui viene eseguito il deployment dei componenti di runtime ibridi. Nota: lo spazio dei nomi predefinito per un deployment ibrido è apigee.
  5. Esegui questo comando per eseguire il provisioning del proxy del servizio remoto su Apigee hybrid:

    Se non esegui l'upgrade, utilizza questo comando per eseguire il provisioning di Apigee:

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

    Se stai eseguendo l'upgrade, utilizza questo comando con il flag --force-proxy-install per eseguire il provisioning di Apigee:

    ./apigee-remote-service-cli provision --force-proxy-install --organization $ORG --environment $ENV \
         --runtime $RUNTIME --namespace $NAMESPACE --token $TOKEN > config.yaml
  6. Controlla i contenuti del file config.yaml. Dovrebbe avere il seguente aspetto:
    # 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. Applica la configurazione del servizio (l'output del file con il comando di provisioning) al cluster:
    kubectl apply -f $CLI_HOME/config.yaml
  8. Verifica il proxy e il certificato. Quanto segue dovrebbe restituire un JSON valido:
    curl --http1.1 -i $RUNTIME/remote-service/certs

    L'output avrà un aspetto simile al seguente:

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

Esegui il servizio remoto per Envoy

In questo passaggio, avvierai il client Remote Service for Envoy nel mesh di servizi in cui è installato Apigee hybrid. Questo servizio fornisce gli endpoint ai file collaterali Istio installati sui servizi di destinazione. In un passaggio successivo, installerai un file collaterale con il servizio httpbin.

  1. Apri $REMOTE_SERVICE_HOME/samples/istio/hybrid-apigee-remote-service-envoy.yaml in un editor.
  2. Potresti dover modificare la configurazione se non utilizzi l'ultima versione del servizio remoto. Se usi la versione più recente, vai al passaggio successivo. Se non usi la versione più recente, imposta l'elemento image: in modo che faccia riferimento alla tua versione. Ad esempio, se utilizzi la versione v1.0.0-beta.4, modifica il tag image in:
    image: "gcr.io/apigee-api-management-istio/apigee-remote-service-envoy:v1.0.0-beta.4"
  3. Imposta l'elemento tls-volume.secretName sulla tua organizzazione e sul tuo ambiente:
    ...
      volumes:
        - name: tls-volume
           secret:
             defaultMode: 420
             secretName: apigee-runtime-$ORG-$ENV-tls
         - name: policy-secret
           secret:
             defaultMode: 420
             secretName: $ORG-$ENV-policy-secret
    

    Ad esempio:

    ...
      volumes:
        - name: tls-volume
           secret:
             defaultMode: 420
             secretName: apigee-runtime-myorg-myenv-tls
         - name: policy-secret
           secret:
             defaultMode: 420
             secretName: myorg-myenv-policy-secret
    ...
  4. Applica il servizio remoto Apigee al mesh di servizi:
    kubectl apply -f $REMOTE_SERVICE_HOME/samples/istio/hybrid-apigee-remote-service-envoy.yaml
  5. Applica EnvoyFilter ai file collaterali Istio nello spazio dei nomi predefinito. EnvoyFilter consente al sidecar httpbin di comunicare con il servizio remoto Apigee.
    kubectl apply -f $REMOTE_SERVICE_HOME/samples/istio/envoyfilter-sidecar.yaml

Verifica l'installazione

  1. Ora torna alla shell curl che hai aperto nel passaggio Esegui il deployment di un servizio di test nel cluster e chiama il servizio httpbin:
    curl -i httpbin.default.svc.cluster.local/headers
    

    Il servizio è ora gestito da Apigee e dato che non hai fornito una chiave API, restituisce il seguente errore.

    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 prodotto API e ottieni una chiave API come spiegato in Come ottenere una chiave API.
  3. Effettua una chiamata API utilizzando la chiave:
    export APIKEY=YOUR_API_KEY
    curl -i httpbin.default.svc.cluster.local/headers -H "x-api-key: $APIKEY"

    La chiamata dovrebbe riuscire con uno stato 200 e restituire un elenco di intestazioni nella risposta. Ad esempio:

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

Passaggi successivi

Il traffico API verso il servizio httpbin è ora gestito da Apigee. Ecco alcune funzionalità che puoi esplorare e provare:

  • Se hai configurato il prodotto API come spiegato in Come ottenere una chiave API, il limite di quota era impostato su 5 richieste al minuto. Prova a chiamare il servizio httpbin ancora un paio di volte per attivare la quota. Quando superi la quota, viene visualizzato questo errore:
    HTTP/1.1 429 Too Many Requests
  • Accedi ad Apigee Analytics dalla UI Edge. Vai ad Analyze > API Metrics > API Proxy Performance.
  • Genera e utilizza token JWT per autenticare le chiamate API.
  • Utilizza l'interfaccia a riga di comando per gestire, creare token e controllare le associazioni. Per maggiori dettagli sull'interfaccia a riga di comando, consulta il riferimento.