将 Apigee Adapter for Envoy 与 Apigee Hybrid 搭配使用

本页面适用于 ApigeeApigee Hybrid

查看 Apigee Edge 文档。

以下示例演示了如何将 Apigee Adapter for Envoy 与 Apigee Hybrid 部署搭配使用。

前提条件

准备工作:

概览

以下示例介绍了如何将 Apigee Adapter for Envoy 与 Apigee Hybrid 搭配使用。在此示例中,您将在部署 Apigee Hybrid 的 Kubernetes 集群中部署一个简单的 HTTP 服务。然后,您将配置 Apigee Adapter for Envoy 以便使用 Apigee 来管理对此服务的 API 调用。

下图展示了 Apigee Hybrid 集成的基本架构:

集成到 Apigee Hybrid 环境的 Envoy 适配器的简要视图,包括管理层面、运行时层面和 GCP 服务

使用目标 HTTP 服务在 Istio 服务网格中将 Envoy 代理部署为 Istio Sidecar。Sidecar 负责处理进出目标服务的 API 流量,并与远程服务通信。远程服务还会与混合管理层面通信以检索 API 产品和代理信息。

检查 gcloud 配置

  1. 请检查您的 gcloud 配置是否已设置为与混合组织关联的 GCP 项目。

    要列出当前设置,请执行以下操作:

    gcloud config list

    如有必要,请使用以下命令设置正确的 GCP 项目 ID:

    gcloud config set project project-id
  2. 您必须向 Google Cloud SDK (gcloud) 进行身份验证才能使用 GCP 项目:
    gcloud auth login

预配 Apigee Hybrid

在此步骤中,您将在远程服务 CLI 中通过 remote-service API 代理预配 Apigee Hybrid。预配命令还会在 Apigee 上设置证书,并生成凭据供远程服务用来安全地连接回 Apigee。

  1. 转到 $CLI_HOME 目录:
    cd $CLI_HOME
  2. 如果您不是与 Apigee Hybrid 组织关联的 GCP 项目的所有者,请确保您的 GCP 用户账号包含 Apigee Organization Admin 角色。 请参阅授予、更改和撤消对资源的访问权限
  3. 执行以下命令以获取访问令牌:
    TOKEN=$(gcloud auth print-access-token);echo $TOKEN
  4. 创建以下几个环境变量:这些变量将用作预配脚本的参数:
    export ORG=organization_name
    export ENV=environment_name
    export RUNTIME=host_alias_url
    export NAMESPACE=hybrid_runtime_namespace

    其中:

    变量 说明
    organization_name 您的 Apigee Hybrid 安装对应的 Apigee 组织的名称。
    environment_name 您的 Apigee Hybrid 组织中环境的名称。
    host_alias_url 包含混合配置中所定义虚拟主机的 hostAlias 的网址。该网址必须以 https:// 开头。例如:https://apitest.apigee-hybrid-docs.net
    hybrid_runtime_namepace 要在其中部署混合运行时组件的命名空间。注意:混合部署的默认命名空间是 apigee
  5. 执行以下命令,将远程服务代理预配到 Apigee Hybrid:

    如果您不进行升级,请使用以下命令预配 Apigee:

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

    如果要升级,请将以下命令和 --force-proxy-install 标志配合使用来预配 Apigee:

    ./apigee-remote-service-cli provision --force-proxy-install --organization $ORG --environment $ENV \
         --runtime $RUNTIME --namespace $NAMESPACE --token $TOKEN > config.yaml
  6. 查看 config.yaml 文件的内容。输出应如下所示:
    # 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. 将服务配置(由预配命令输出的文件)应用于集群:
    kubectl apply -f $CLI_HOME/config.yaml
  8. 验证您的代理和证书。以下命令应返回有效的 JSON:
    curl -i $RUNTIME/remote-service/certs

    输出如下所示:

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

创建示例配置文件

使用 apigee-remote-service-cli samples create 命令生成示例配置文件。

在本示例中,您需要以下生成文件:

  • httpbin.yaml - HTTP 服务的部署配置。
  • apigee-envoy-adapter.yaml - Envoy 的远程服务的部署配置。
  • envoyfilter-sidecar.yaml - 安装 EnvoyFilter 的配置。安装到默认命名空间。

如需生成示例,请执行以下操作:

  1. 转到 $CLI_HOME 目录。
  2. 执行以下命令以生成文件:

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

    以下文件是 ./samples 目录的输出:

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

如需了解详情,请参阅示例命令

将测试服务部署到集群

在此步骤中,您需要将简单的 HTTP 请求/响应测试服务部署到 Apigee Hybrid 部署所在的集群中。

  1. 在集群的 default 命名空间中启用 Istio 注入功能。在后续步骤中,您将 Envoy Sidecar 部署到同一集群中。启用 Istio 注入功能可以实现 Sidecar 部署。本示例使用 default 命名空间,而后续的所有说明都假定使用该命名空间。
    kubectl label namespace default istio-injection=enabled
  2. 将简单的 httpbin 服务应用于默认命名空间中的集群:
    kubectl apply -f $CLI_HOME/samples/httpbin.yaml
  3. 现在测试服务。启动在集群中运行的 curl 服务并打开终端:
    kubectl run -it curl --image=curlimages/curl --restart=Never -- sh
  4. 从集群内调用服务来测试服务:
    curl -i httpbin.default.svc.cluster.local/headers

    成功后,您将看到状态为 200,该服务将返回标头列表。例如:

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

运行 Envoy 的远程服务

在此步骤中,您将在安装 Apigee Hybrid 的服务网格中启动 Envoy 客户端版远程服务。此服务为目标服务上安装的 Istio Sidecar 提供端点。您还将使用 httpbin 服务安装 Sidecar。

  1. 将 Apigee 远程服务应用于服务网格:
    kubectl apply -f $CLI_HOME/samples/apigee-envoy-adapter.yaml
  2. EnvoyFilter 应用于默认命名空间中的 Istio Sidecar。EnvoyFilter 使 httpbin Sidecar 能够与 Apigee 远程服务通信。
    kubectl apply -f $CLI_HOME/samples/envoyfilter-sidecar.yaml

测试安装

  1. 现在,返回您在将测试服务部署到集群步骤中打开的 curl shell,然后调用 httpbin 服务:
    curl -i httpbin.default.svc.cluster.local/headers
    

    该服务现在由 Apigee 管理,由于您未提供 API 密钥,因此将返回以下错误。

    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. 配置 API 产品并按照如何获取 API 密钥所述获取 API 密钥。
  3. 使用该密钥进行 API 调用:
    export APIKEY=YOUR_API_KEY
    curl -i httpbin.default.svc.cluster.local/headers -H "x-api-key: $APIKEY"

    调用成功时应显示状态为 200,并在响应中返回标头列表。例如:

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

后续步骤

通往 httpbin 服务的 API 流量现在由 Apigee 管理。下面是您可以探索和试用的一些功能:

  • 如果您按照如何获取 API 密钥中的说明配置了 API 产品,则配额限制设置为每分钟 5 个请求。请尝试再调用几次 httpbin 服务以触发该配额。配额用尽后,将返回 HTTP 状态 403 错误。
  • 在 Apigee 界面中访问 Apigee Analytics。转到分析 > API 指标 > API 代理性能
  • 生成并使用 JWT 令牌以对 API 调用进行身份验证。
  • 使用 CLI 可以进行管理、创建令牌和控制绑定。如需了解 CLI 详情,请参阅参考文档