Usar o adaptador do Apigee para o Envoy com o Apigee Hybrid

Esta página aplica-se ao Apigee e ao Apigee Hybrid.

Veja a documentação do Apigee Edge.

Este exemplo demonstra como usar o Apigee Adapter for Envoy com uma implementação híbrida do Apigee.

Pré-requisitos

Antes de começar:

Vista geral

Este exemplo explica como usar o Apigee Adapter for Envoy com o Apigee hybrid. Neste exemplo, vai implementar um serviço HTTP simples no mesmo cluster do Kubernetes onde o Apigee hybrid está implementado. Em seguida, configura o Apigee Adapter for Envoy para gerir chamadas API para este serviço com o Apigee.

A figura seguinte mostra a arquitetura básica da integração do Apigee Hybrid:

Uma vista de nível superior
    do adaptador do Envoy integrado num ambiente híbrido do Apigee, incluindo o
    plano de gestão, o plano de tempo de execução e os serviços da GCP

Um proxy Envoy é implementado com o serviço HTTP de destino como um sidecar do Istio na malha de serviços do Istio. O sidecar processa o tráfego da API de e para o serviço de destino e comunica com o serviço remoto. O Serviço Comando também comunica com o plano de gestão híbrido para obter informações sobre o produto API e o proxy.

Verifique a configuração do gcloud

  1. Verifique se a configuração do gcloud está definida para o projeto do GCP associado à sua organização híbrida.

    Para listar as definições atuais:

    gcloud config list

    Se necessário, defina o ID do projeto da GCP correto com este comando:

    gcloud config set project project-id
  2. Tem de ter a autenticação com o Google Cloud SDK (gcloud) para o seu projeto do GCP:
    gcloud auth login

Aprovisione o Apigee Hybrid

Neste passo, vai usar a CLI de serviço remoto para aprovisionar o híbrido com o proxy de API remote-service. O comando de aprovisionamento também configura um certificado no Apigee e gera credenciais que o serviço remoto vai usar para estabelecer ligação segura ao Apigee.

  1. Aceda ao diretório $CLI_HOME:
    cd $CLI_HOME
  2. Se não for proprietário do projeto do GCP associado à organização híbrida do Apigee, certifique-se de que a sua conta de utilizador do GCP inclui a função Apigee Organization Admin. Consulte o artigo Conceder, alterar e revogar o acesso a recursos.
  3. Execute este comando para obter uma chave de acesso:
    TOKEN=$(gcloud auth print-access-token);echo $TOKEN
  4. Crie as seguintes variáveis de ambiente. Estas variáveis vão ser usadas como parâmetros para o script de aprovisionamento:
    export ORG=organization_name
    export ENV=environment_name
    export RUNTIME=host_alias_url
    export NAMESPACE=hybrid_runtime_namespace

    Onde:

    Variável Descrição
    organization_name O nome da organização da Apigee para a sua instalação do Apigee Hybrid.
    environment_name O nome de um ambiente na sua organização do Apigee Hybrid.
    host_alias_url Um URL que inclui o hostAlias para um anfitrião virtual definido na sua configuração híbrida. O URL tem de começar por https://. Por exemplo: https://apitest.apigee-hybrid-docs.net
    hybrid_runtime_namepace O espaço de nomes no qual os componentes do tempo de execução híbrido são implementados. Nota: o espaço de nomes predefinido para uma implementação híbrida é apigee.
  5. Execute o seguinte comando para aprovisionar o proxy de serviço remoto para o Apigee hybrid:

    Se não estiver a fazer a atualização, use este comando para aprovisionar o Apigee:

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

    Se estiver a fazer uma atualização, use este comando com a flag --force-proxy-install para aprovisionar o Apigee:

    ./apigee-remote-service-cli provision --force-proxy-install --organization $ORG --environment $ENV \
         --runtime $RUNTIME --namespace $NAMESPACE --token $TOKEN > config.yaml
  6. Verifique o conteúdo do ficheiro config.yaml. Deverá ter um aspeto semelhante 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. Aplique a configuração do serviço (o ficheiro gerado pelo comando de aprovisionamento) ao cluster:
    kubectl apply -f $CLI_HOME/config.yaml
  8. Valide o proxy e o certificado. O seguinte deve devolver um JSON válido:
    curl -i $RUNTIME/remote-service/certs

    O resultado tem um aspeto semelhante 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"
            }
        ]
    }

Crie ficheiros de configuração de amostra

Use o comando apigee-remote-service-cli samples create para gerar ficheiros de configuração de exemplo.

Para este exemplo, precisa destes ficheiros gerados:

  • httpbin.yaml – Uma configuração de implementação para um serviço HTTP.
  • apigee-envoy-adapter.yaml: uma configuração de implementação para o serviço remoto do Envoy.
  • envoyfilter-sidecar.yaml - Uma configuração que instala um EnvoyFilter. para o espaço de nomes predefinido.

Para gerar os exemplos:

  1. Aceda ao diretório $CLI_HOME.
  2. Execute este comando para gerar os ficheiros:

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

    Os seguintes ficheiros são enviados para o diretório ./samples:

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

Para mais informações, consulte o artigo Comando de amostras.

Implemente um serviço de teste no cluster

Neste passo, vai implementar um serviço de teste de pedido/resposta HTTP simples no mesmo cluster onde o Apigee hybrid está implementado.

  1. Ative a injeção do Istio no espaço de nomes default do cluster. Num passo posterior, vai implementar um sidecar do Envoy neste mesmo cluster. A ativação da injeção do Istio torna a implementação do sidecar possível. Este exemplo usa o espaço de nomes default e todas as instruções subsequentes partem do princípio de que é este o caso.
    kubectl label namespace default istio-injection=enabled
  2. Aplique o serviço simples httpbin ao cluster no espaço de nomes predefinido:
    kubectl apply -f $CLI_HOME/samples/httpbin.yaml
  3. Agora, teste o serviço. Inicie um serviço curl em execução no cluster e abra um terminal:
    kubectl run -it curl --image=curlimages/curl --restart=Never -- sh
  4. Teste o serviço chamando-o a partir do interior do cluster:
    curl -i httpbin.default.svc.cluster.local/headers

    Em caso de êxito, é apresentado o estado 200 e o serviço devolve uma lista de cabeçalhos. Por exemplo:

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

Execute o serviço remoto para o Envoy

Neste passo, inicia o serviço remoto para o cliente do Envoy na malha de serviços onde o Apigee hybrid está instalado. Este serviço fornece os pontos finais aos sidecars do Istio que estão instalados nos serviços de destino. Também instala um sidecar com o serviço httpbin.

  1. Aplique o serviço remoto do Apigee à malha de serviços:
    kubectl apply -f $CLI_HOME/samples/apigee-envoy-adapter.yaml
  2. Aplique o EnvoyFilter aos sidecars do Istio no espaço de nomes predefinido. O EnvoyFilter permite que o sidecar comunique com o serviço remoto do Apigee.httpbin
    kubectl apply -f $CLI_HOME/samples/envoyfilter-sidecar.yaml

Teste a instalação

  1. Agora, volte à shell curl que abriu no passo Implemente um serviço de teste no cluster e chame o serviço httpbin:
    curl -i httpbin.default.svc.cluster.local/headers
    

    O serviço está agora a ser gerido pela Apigee e, como não forneceu uma chave de API, devolve o seguinte erro.

    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. Configure um produto de API e obtenha uma chave da API, conforme explicado em Como obter uma chave da API.
  3. Faça uma chamada API com a chave:
    export APIKEY=YOUR_API_KEY
    curl -i httpbin.default.svc.cluster.local/headers -H "x-api-key: $APIKEY"

    A chamada deve ter êxito com um estado 200 e devolver uma lista de cabeçalhos na resposta. Por exemplo:

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

Passos seguintes

O tráfego da API para o serviço httpbin é agora gerido pela Apigee. Seguem-se algumas funcionalidades que pode explorar e experimentar:

  • Se configurou o seu produto de API conforme explicado em Como obter uma chave da API, o limite de quota foi definido como 5 pedidos por minuto. Experimente chamar o serviço httpbin mais algumas vezes para acionar a quota. Quando a quota se esgota, é devolvido um erro de estado HTTP 403.
  • Aceda ao Apigee Analytics na IU do Apigee. Aceda a Analisar > Métricas da API > Desempenho do proxy da API.
  • Gere e use tokens JWT para autenticar chamadas API.
  • Use a CLI para gerir, criar tokens e controlar associações. Para ver detalhes da CLI, consulte a referência.