本页面适用于 Apigee 和 Apigee 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 集成的基本架构:
使用目标 HTTP 服务在 Istio 服务网格中将 Envoy 代理部署为 Istio Sidecar。Sidecar 负责处理进出目标服务的 API 流量,并与远程服务通信。远程服务还会与混合管理层面通信以检索 API 产品和代理信息。
检查 gcloud 配置
- 请检查您的
gcloud
配置是否已设置为与混合组织关联的 GCP 项目。要列出当前设置,请执行以下操作:
gcloud config list
如有必要,请使用以下命令设置正确的 GCP 项目 ID:
gcloud config set project project-id
- 您必须向 Google Cloud SDK (gcloud) 进行身份验证才能使用 GCP 项目:
gcloud auth login
预配 Apigee Hybrid
在此步骤中,您将在远程服务 CLI 中通过 remote-service
API 代理预配 Apigee Hybrid。预配命令还会在 Apigee 上设置证书,并生成凭据供远程服务用来安全地连接回 Apigee。
- 转到
$CLI_HOME
目录:cd $CLI_HOME
- 如果您不是与 Apigee Hybrid 组织关联的 GCP 项目的所有者,请确保您的 GCP 用户账号包含 Apigee Organization Admin 角色,或者同时包含 API Creator 和 Deployer 角色。
请参阅授予、更改和撤消对资源的访问权限。
- 执行以下命令以获取访问令牌:
TOKEN=$(gcloud auth print-access-token);echo $TOKEN
- 创建以下几个环境变量:这些变量将用作预配脚本的参数:
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
其中:
变量 说明 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 文件的路径。如需详细了解此参数,请参阅预配命令。 - 执行以下命令,将远程服务代理预配到 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
- 查看
config.yaml
文件的内容。输出应如下所示:# Configuration for apigee-remote-service-envoy (platform: GCP) # 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-service/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
- 将服务配置(由预配命令输出的文件)应用于集群:
kubectl apply -f $CLI_HOME/config.yaml
- 验证您的代理和证书。以下命令应返回有效的 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 的配置。安装到默认命名空间。
如需生成示例,请执行以下操作:
- 转到
$CLI_HOME
目录。 执行以下命令以生成文件:
./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 部署所在的集群中。
- 在集群的
default
命名空间中启用 Istio 注入功能。在后续步骤中,您将 Envoy Sidecar 部署到同一集群中。启用 Istio 注入功能可以实现 Sidecar 部署。本示例使用default
命名空间,而后续的所有说明都假定使用该命名空间。如果您使用的是开源 Istio:
kubectl label namespace default istio-injection=enabled --overwrite
如果您使用的是 ASM:
kubectl label namespace default istio-injection- istio.io/rev=REVISION --overwrite
- 将简单的
httpbin
服务应用于默认命名空间中的集群:kubectl apply -f $CLI_HOME/samples/httpbin.yaml
- 现在测试服务。启动在集群中运行的
curl
服务并打开终端:kubectl run -it curl --image=curlimages/curl --restart=Never -- sh
- 从集群内调用服务来测试服务:
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。
- 将 Apigee 远程服务应用于服务网格:
kubectl apply -f $CLI_HOME/samples/apigee-envoy-adapter.yaml
- 将
EnvoyFilter
应用于默认命名空间中的 Istio Sidecar。EnvoyFilter
使httpbin
Sidecar 能够与 Apigee 远程服务通信。kubectl apply -f $CLI_HOME/samples/envoyfilter-sidecar.yaml
测试安装
- 现在,返回您在将测试服务部署到集群步骤中打开的 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
- 配置 API 产品并按照如何获取 API 密钥所述获取 API 密钥。
- 使用该密钥进行 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 错误。 - 在 Edge 界面中访问 Apigee Analytics。转到分析 > API 指标 > API 代理性能。
- 生成并使用 JWT 令牌以对 API 调用进行身份验证。
- 使用 CLI 可以进行管理、创建令牌和控制绑定。如需了解 CLI 详情,请参阅参考文档。