使用 Kubernetes 的 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 适配器的简要视图,包括管理平面、运行时平面和 Google Cloud 服务

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

检查 gcloud 配置

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

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

    gcloud config list

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

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

预配 Apigee Hybrid

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

  1. 转到 $CLI_HOME 目录:
    cd $CLI_HOME
  2. 如果您不是与 Apigee Hybrid 组织关联的 Google Cloud 项目的所有者,请确保您的 Google Cloud 用户账号包含 Apigee Organization Admin 角色,或者同时包含 API CreatorDeployer 角色。

    请参阅授予、更改和撤消对资源的访问权限

  3. 执行以下命令以获取访问令牌:
    TOKEN=$(gcloud auth print-access-token);echo $TOKEN
  4. (可选)默认情况下,适配器会在 Google Cloud 项目中查找默认服务账号凭据,以获取将分析数据发送到 Apigee 的权限。如果您不想使用默认服务账号凭据,可以创建服务账号并在预配命令中引用其密钥。服务账号必须拥有 apigee.analyticsAgent 角色。如需查看相关说明,请参阅创建和管理服务账号
  5. 创建以下环境变量:这些变量将用作预配脚本的参数:
    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

    其中:

    变量 说明
    organization_name 您的 Apigee Hybrid 安装对应的 Apigee 组织的名称。
    environment_name 您的 Apigee Hybrid 组织中环境的名称。
    host_alias_url 包含混合配置中所定义虚拟主机的 hostAlias 的网址。该网址必须以 https:// 开头。例如:https://apitest.apigee-hybrid-docs.net
    hybrid_runtime_namepace 要在其中部署混合运行时组件的命名空间。注意:混合部署的默认命名空间是 apigee
    analytics_service_account (可选)具有 Apigee Analytics Agent 角色的 Google Cloud 服务账号密钥 JSON 文件的路径。如需详细了解此参数,请参阅预配命令
  6. 执行以下命令,将远程服务代理预配到 Apigee Hybrid:

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

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

    如果要升级,请将以下命令和 --force-proxy-install 标志配合使用来预配 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. 查看 config.yaml 文件的内容。输出应如下所示:
    # 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. 将服务配置(由预配命令输出的文件)应用于集群:
    kubectl apply -f $CLI_HOME/config.yaml
  9. 验证您的代理和证书。以下命令应返回有效的 JSON:
    curl -i $RUNTIME/remote-token/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 --template istio-1.12

    以下文件是 ./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 命名空间,而后续的所有说明都假定使用该命名空间。

    如果您使用的是开源 Istio:

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

    如果您使用的是 ASM:

    kubectl label namespace default istio-injection=enabled istio.io/rev=REVISION --overwrite
  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 的远程服务

在此步骤中,您将启动 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 管理。下面是您可以探索和试用的一些功能:

  • 在 Edge 界面中访问 Apigee Analytics。转到分析 > API 指标 > API 代理性能
  • 使用 CLI 可以进行管理、创建令牌和控制绑定。如需了解 CLI 详情,请参阅参考文档

卸载 Apigee Adapter for Envoy

如需移除 Apigee Envoy 适配器安装,请执行以下操作:

  1. 无论您选择在何处运行(在本地或在 Docker 上)Envoy 适配器,都请将它移除。
  2. 从 Apigee 环境中删除 remote-serviceremote-token 代理。请参阅删除 API 代理
  3. 移除 Envoy 适配器用例使用的所有未使用的 API 产品或操作。请参阅删除 API 产品

此外,您还可以执行以下命令:

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