Esempio di Apigee hybrid con Kubernetes

Questa pagina si applica ad Apigee e Apigee hybrid.

Visualizza la documentazione di Apigee Edge.

Questo esempio mostra come utilizzare l'adattatore Apigee per Envoy con un deployment ibrido di Apigee.

Prerequisiti

Prima di iniziare:

Panoramica

Questo esempio spiega come utilizzare l'adattatore Apigee per 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. Poi, 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 di Apigee Hybrid:

Una visione
    di alto livello dell'adattatore Envoy integrato in un ambiente Apigee hybrid, inclusi il
    piano di gestione, il piano di runtime e i servizi Google Cloud

Un proxy Envoy viene implementato con il servizio HTTP di destinazione come sidecar Istio nel mesh di servizi Istio. Il sidecar gestisce il traffico API da e verso il servizio di destinazione e comunica con il servizio remoto. Il servizio remoto comunica anche con il piano di gestione ibrido per recuperare le informazioni sul prodotto API e sul proxy.

Controlla la configurazione di gcloud

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

    Per elencare le impostazioni correnti:

    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

Provisioning di Apigee hybrid

In questo passaggio, utilizzerai la CLI del servizio remoto per eseguire il provisioning di 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 riconnettersi in modo sicuro ad Apigee.

  1. Vai alla directory $CLI_HOME:
    cd $CLI_HOME
  2. Se non sei proprietario del progetto Google Cloud associato all'organizzazione Apigee ibrida, assicurati che il tuo account utente Google Cloud includa il ruolo Amministratore organizzazione Apigee oppure i ruoli Creatore API e Deployment.

    Consulta l'articolo 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. (Facoltativo) Per impostazione predefinita, l'adattatore cerca le credenziali dell'account di servizio predefinito nel tuo progetto Google Cloud per l'autorizzazione a inviare dati di analisi ad Apigee. Se non vuoi utilizzare le credenzialiaccount di serviziot predefinito, puoi creare uaccount di serviziont e fare riferimento alla relativa chiave nel comando di provisioning. Il account di servizio deve disporre del ruolo apigee.analyticsAgent. Per le istruzioni, vedi Creazione e gestione dei service account.
  5. Crea le seguenti variabili di ambiente. Queste variabili verranno utilizzate come parametri dello script di provisioning:
    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

    Dove:

    Variabile Descrizione
    organization_name Il nome dell'organizzazione Apigee per l'installazione di Apigee hybrid.
    environment_name Il nome di un ambiente nella tua organizzazione Apigee hybrid.
    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 vengono implementati i componenti del runtime di hybrid. Nota: lo spazio dei nomi predefinito per un deployment ibrido è apigee.
    analytics_service_account (Facoltativo) Il percorso di un file JSON con le chiavi per l'account di servizio Google Cloud che ha il ruolo Apigee Analytics Agent. Per una descrizione dettagliata di questo parametro, vedi comando Provision.
  6. Esegui il comando seguente per eseguire il provisioning del proxy del servizio remoto in 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 --analytics-sa $AX_SERVICE_ACCOUNT --token $TOKEN > config.yaml

    Se esegui 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 --analytics-sa $AX_SERVICE_ACCOUNT --token $TOKEN > config.yaml
  7. Controlla i contenuti del file config.yaml. Dovrebbe avere un aspetto simile a questo:
    # 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. Applica la configurazione del servizio (il file generato dal comando di provisioning) al cluster in cui è stato installato Apigee hybrid nel passaggio 1: crea un cluster.
    kubectl apply -f $CLI_HOME/config.yaml
  9. Verifica il proxy e il certificato. I seguenti elementi devono restituire un JSON valido:
    curl -i $RUNTIME/remote-token/certs

    L'output è 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"
            }
        ]
    }

Crea file di configurazione di esempio

Utilizza il comando apigee-remote-service-cli samples create per generare file di configurazione di esempio.

Per questo esempio, hai bisogno dei seguenti file generati:

  • httpbin.yaml: una configurazione di deployment per un servizio HTTP.
  • apigee-envoy-adapter.yaml: una configurazione del deployment per il servizio remoto per Envoy.
  • envoyfilter-sidecar.yaml: una configurazione che installa un EnvoyFilter. allo spazio dei nomi predefinito.

Per generare i campioni:

  1. Vai alla directory $CLI_HOME.
  2. Esegui questo comando per generare i file:

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

    I seguenti file vengono generati nella directory ./samples:

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

Per ulteriori informazioni, consulta comando Samples.

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 ibrido.

  1. Attiva l'inserimento di Istio nello spazio dei nomi default del cluster. In un passaggio successivo, eseguirai il deployment di un sidecar Envoy nello stesso cluster. L'attivazione dell'injection di Istio rende possibile il deployment del file collaterale. Questo esempio utilizza lo spazio dei nomi default e tutte le istruzioni successive presuppongono che sia così.

    Se utilizzi Istio open source:

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

    Se utilizzi ASM:

    kubectl label namespace default istio-injection=enabled istio.io/rev=REVISION --overwrite
  2. Applica il servizio semplice httpbin al cluster nello spazio dei nomi predefinito:
    kubectl apply -f $CLI_HOME/samples/httpbin.yaml
  3. Ora testa il servizio. Avvia un servizio curl in esecuzione nel cluster e apri un terminale:
    kubectl run -it curl --image=curlimages/curl --restart=Never -- sh
  4. Testa il servizio chiamandolo dall'interno del cluster:
    curl -i httpbin.default.svc.cluster.local/headers

    In caso di esito positivo, viene visualizzato lo stato 200 e il servizio restituisce 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 servizio remoto per Envoy

In questo passaggio, avvii il servizio remoto per il client Envoy. Questo servizio fornisce gli endpoint ai sidecar Istio installati sui servizi di destinazione. Verrà inoltre installato un sidecar con il servizio httpbin.

  1. Applica il servizio remoto Apigee al mesh di servizi:
    kubectl apply -f $CLI_HOME/samples/apigee-envoy-adapter.yaml
  2. Applica EnvoyFilter ai sidecar Istio nello spazio dei nomi predefinito. EnvoyFilter consente al sidecar httpbin di comunicare con il servizio remoto Apigee.
    kubectl apply -f $CLI_HOME/samples/envoyfilter-sidecar.yaml

Testare 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, poiché non hai fornito una chiave API, il server 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. Esegui 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 lo 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:

  • Accedi ad Apigee Analytics nella UI Edge. Vai ad Analizza > Metriche API > Prestazioni del proxy API.
  • Utilizza la CLI per gestire, creare token e controllare i binding. Per i dettagli della CLI, consulta la sezione Riferimento.

Disinstalla Apigee Adapter for Envoy

Per rimuovere un'installazione di Apigee Envoy Adapter:

  1. Rimuovi l'adattatore Envoy ovunque tu abbia scelto di eseguirlo (in modo nativo o su Docker).
  2. Elimina i proxy remote-service e remote-token dai tuoi ambienti Apigee. Consulta Eliminazione di un proxy API.
  3. Rimuovi tutti i prodotti API o le operazioni inutilizzati utilizzati dai casi d'uso dell'adattatore Envoy. Consulta Eliminazione di un prodotto API.

Inoltre, puoi eseguire i seguenti comandi:

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